×

字符串常量池在哪里(字符串常量池在哪儿)

前端技术网 前端技术网 发表于2024-01-21 22:13:23 浏览2579 评论0

抢沙发发表评论

一、string常量池默认有哪些字符串

常量池只有一个。String?a?=?"abc"//现在常量池里找abc,有的话就把a指向它,没有的话就新建?这是在编译期间做的String?b?=?new?String("abc");//直接新建一个abc,并把地址给b,这是在运行期间做的a?==?b?//判断a和b的地址是否相等,明显不相等。a.equals(b)//判断a和b指向的字符串常量是否相等,都是"abc",所以是true

二、字符串的要点和难点

1.Stringstr1=newString(“hello”);

字符串常量池在哪里(字符串常量池在哪儿)

1.New的对象都会放在堆里面。

2.无论常量池内是否有“hello”字符串,都会在堆内开辟新空间创建new对象。

3.在执行前会在常量池中查看是否有一个"helllo"的对象,然后执行该行代码时new一个"hello"的对象存放在堆区中

4.若常量池中没有该字符串,就会在常量池中创建“hello”字符串,若有,就不用。并且new的对象指向常量池,栈内再创建str1和str2分别指向堆中的new对象,str1和str2都是引用,存的是地址,而不是对象。

所以

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

字符串常量池在哪里(字符串常量池在哪儿)

1

1

2.Stringstr3=“hello”;

java首先会在常量池里面找是否有“hello”字符串,若没有,则在常量池内创建“hello”字符串;若有,就不会再重新创建。再在栈内创建指向“hello”字符串的引用,所以str3和str4其实指向的是同一个对象。

str1指向堆区的对象,str3指向常量池中的对象,两个引用指向的地址不同,输入false;

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

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

1

2

1

2

3.Stringstr5=“he”+“llo”;

编辑器会将其优化为“hello”,然后在常量池里面找是否有字符串“hello”,如存在,就将str5指向“hello”,所以str5与str3的地址是相同的。

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

1

1

4.Stringstr8=str6+str7;

Stringstr6="he";

Stringstr7="llo";

Stringstr8=str6+str7;

1

2

3

1

2

3

这段代码总共创建了5个对象,字符串池中两个、堆中三个

str8由两个字符串变量串联。+运算符会在堆中建立来两个String对象,这两个对象的值分别是"he"和"llo",也就是说从字符串池中**这两个值,然后在堆中创建两个对象,然后再建立对象str8,然后将"hello"的堆地址赋给str3

5.Stringstr9=str6+“llo”;

由于在字符串的"+"连接中,有字符串引用存在,而引用的值str6在程序编译期是无法确定的,即str6+"llo"无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给str9。

Stringstr8=str6+str7;

Stringstr9=str6+“llo”;

其实有点类似,str8=newStringBuffer(str6).append(str7).toString(),str9=newStringBuffer(str6).append(“34”).toString(),从上面可以看出str8和str9都开辟了新的内存空间来存放新的字符串“hello”,因此和str3的地址不同,str8和str9的地址也不相同。

三、字符串常量池是在方法区中还是在独立的区域中

Stringstr="nihao";程序开始执行这句代码,肯定是要创建一个对象的,只是这个对象创建后就是一个常量,不可以更改,并且这个对象是放在串池里面的,也就是你说的那个常量池

如果我后面在写一句代码:Stringother="nihao";

str和other这2个引用的地址就是一样的,因为str和other的声明方式是一样的,都是在串池,str的对象创建时,串池中没有"nihao"这个常量,就创建一个.other对象创建时,发现串池中已经有了"nihao"这个常量,就直接拿过来用就是了

Stringa1=newString("nihao");

Stringb1=newString("nihao");

但是如果我们通过上面的方式直接newString()那个a1和b1这2个引用的对象就不是在串池中了,而是在堆中,但是newString()的参数"nihao"也是一个字符串啊,这个字符串从哪里来呢?如果我们吧代码拆分一下就明白了:

Stringpara="nihao";

Stringa1=newString(para);

就会发现Stringa1=newString("nihao");这一句代码实际上创建了2个对象,一个是String对象,存放在堆中,一个是字符串常量对象,存放在串池中

文章分享到这里,希望我们关于字符串常量池在哪里的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。