String字符串常量池

字符串常量池 与 堆  不同。

字符串常量池用于存储字符串字面量,什么是字符串字面量呢?就是只能作为右值的字符串,比如String s=“he” ,he就是字符串字面量。

== 判等符号,如果是判断基本数据(int,float等),就直接判断值是否相等,如果判断的是对象(Object),那么判断的是两个对象是否是同一个对象(内存地址是否相同)。

String s = "hello"; 
String ss = new String("hello");
System.out.println(s==ss);

如上图代码,输出 false。

原因: 第一句代码:直接字面量赋值,jvm会去字符串常量池中查找,看是否有“hello”,如果有,就直接将“hello”的引用赋值给s,如果没有,在字符串常量池中创建一个字符串“hello”,然后将其引用赋值给s。 s是指向常量池的一个引用。

             第二句代码:先去字符串常量池中查看,是否有已经有“hello”了,如果有,就算了,如果没有就会在常量池中创建一个“hello”,然后,去用new 创建字符串对象,jvm会去堆中分配一个“hello”字符串对象的空间,将这个对象的引用赋值给ss,ss是指向堆的一个引用。 

             所以s==ss 肯定是false,内存地址不同。

 

String s = new String ("hello");
String ss = new String("hello");
System.out.println(s==ss);

如上图代码,输出仍然为false。

原因:第一句代码:“hello”为字面常量,先去字符串常量池中查看是否有“hello”,结果是没有,那么就在字符串常量池中创建一个“hello”,然后再是new,jvm在堆中分配一个字符串对象空间给“hello”,s指向的是堆中的“hello”。

            第二句代码:也是先去字符串常量池中查看是否有“hello”,结果是有,那就不用在字符串常量池中创建“hello”了,因为有new,所以仍然会在堆中创建一个字符串对象空间给“hello”,这里的“hello”对象和第一句中的“hello”对象是不同的。

            所以s==ss,结果是false。

 

String s = "he"+"llo";
String ss = "hello";
System.out.println(s==ss);

如上图所示,输出为true。

原因:第一句代码: 编译器在编译这个代码的时候,就会做一些处理,两个字面量直接相加,会被合并,“he”+“llo”被处理为“hello”,第一句代码被编译后为 String s = “hello”。代码执行的时候,同样会去字符串常量池中查看是否有“hello”,结果是没有,那么就在池中创建“hello”,s指向池中的“hello”。

            第二句代码:先去池中查看是否有“hello”,结果有,那么ss就直接指向了池中的那个“hello”。

            s==ss,结果两个是同一个地址,true。

 

String s = "he" + new String("llo");
String ss = "hello";
System.out.println(s==ss);

如上图所示,输出为false。

原因:第一句代码:编译器在编译的时候,不会执行,所以不知道“he”+new String("llo")是什么值,只是将“he” 和“ llo”当做字符串字面量,会在字符串常量池中创建“he”、“llo”,当代码执行的时候, 编译器创建了StringBuilder对象进行了append操作后通过toString()返回了一个字符串对象存在堆中,所以s指向堆。

            第二句代码:仍然ss指向池。

            s==ss,结果为false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值