JAVA--String str=““与new String()的区别,mysql教程入门

本文详细解析了Java中的字符串常量池,包括它的作用、存储原理以及与堆内存的区别。通过实例展示了不同创建字符串的方式(直接赋值与new关键字)对内存的影响。此外,还探讨了字符串拼接和intern()方法的使用,深入理解字符串对象的生命周期和内存分配。最后,总结了字符串在内存中的管理策略及其对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

在常量池中存储字符串常量的内存空间,即字符串常量池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。

从字符串角度思考:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接赋值字符串)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

使用String直接赋值:

=============

**String str = “abc”:**可能创建一个或者不创建对象。如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配;如果“abc” 在字符串池中存在, str直接指向这个内存地址。

实例:

String str = “abc”;

String str1 = “abc”;

String str2 = “abc”;

System.out.println(str==str1);//true

System.out.println(st

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 开源分享

r==str2);//true

使用new String创建字符串:

==================

String str = new String(“abc”):至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果字符池中已经存在”abc”,则不会在字符串池中创建一个String对象,如果不存在,则会在字符串常量池中也创建一个对象。

实例:

String str = new String(“abc”);

String str1 = new String(“abc”);

String str2 = new String(“abc”);

System.out.println(str==str1);//false

System.out.println(str==str2);//false

String拼接字符串:

============

除了直接使用=赋值,也会用到字符串拼接,字符串拼接又分为变量拼接和已知字符串拼接。

只要拼接内容存在变量,那么该拼接后的新变量就是在堆内存中新建的一个对象实体。

实例:

String str = “abc”;//在常量池中创建abc

String str1 = “abcd”;//在常量池中创建abcd

String str2 = str+“d”;//拼接字符串,此时会在堆中新建一个abcd的对象,因为str2编译之前是未知的

String str3 = “abc”+“d”;//拼接之后str3还是abcd,所以还是会指向字符串常量池的内存地址

System.out.println(str1==str2);//false

System.out.println(str1==str3);//true

String.intern():

================

当调用 intern 方法时,如果常量池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到常量池中,并返回此 String 对象的引用。

实例:

String s1=new String(“abc”);

String s2=s1.intern();

System.out.println( s1==s2 ); //false

System.out.println( s1+" "+s2 ); // abc abc

System.out.println( s2==s1.intern() ); //true

s1==s1.intern()为false说明原来的“abc”仍然存在;

总结:

===

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值