Java基础-Java中字符串常量详解
--------第⼀个例⼦---------
String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
System.out.println(str3 == str4); //输出结果:false
为什么会是false呢?
Java中将类似于"Hello"这样的字符串,Jvm在编译期就能确定其值,所以就直接new String("xxx"),并将其存储于常量池中(包括:char、byte、short、int、long、boolean和String类型),所以上⾯的str1、str2、str3 指向的均是常量池中对象;
⽽String str4 = str1 + str2就不同了,+号两边(或任意⼀边)是变量,Jvm在编译期是⽆法确定其值的,要等
到运⾏期再进⾏处理,处理⽅法为:先⽤str1在堆内存中new⼀个StringBuilder,然后append(str2),然后调⽤toString()将其引⽤赋值给str4,所上⾯的str4指向的是堆内存的⼀个字符串对象,如下图所⽰:
--------第⼆个例⼦---------
String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = str4.intern();
System.out.println(str3 == str5); //输出结果:true
这⾥⼜为什么会是true呢?
String的intern()⽅法会将该对象的值转到常量池中去,如果字符串池已有同样的值,则直接返回地址,如果没有,则在字符串池中新建⼀个,然后返回地址。
再看此例⼦,显然"ab"已经在常量池中存在了(str3 = "ab"),所以str5和str3均指向常量池中的"ab",且语法str3 == str5⽐较是引⽤地址,所以输出结输出结果为:true;
注:intern()这个⽅法API⾥的解释是:“当调⽤ intern ⽅法时,如果池已经包含⼀个等于此 String 对象的字符串 (⽤equals(Object) ⽅法判断),则返回池中的字符串引⽤。否则,将此 String 对象添加到池中,并返回此 String 对象的引⽤。”
--------第三个例⼦---------字符常量合法
String str1 = "ab";
String str2 = "a" + "b";
System.out.println(str1 == str2); //输出结果:true
这⾥⼜为什么会是true呢?
第⼀⾏:"ab"作为⼀个常量存放于字符串池中,并把引⽤地址赋值给str1;
第⼆⾏:"a"和"b"作为两个常量相加,由于编译器优化,在编译期就将+两边拼接合并了,直接认为成是⼀个常量"ab",结果发现字符串池中已经有⼀个常量"ab"了,就直接把"ab"的引⽤地址赋值给了str2;
第三⾏:str1 == str2⽐较的str1和str2的引⽤地址,当然是⼀样的,so输出结果: true ;
--------第四个例⼦---------
final String str1 = "a";
final String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
System.out.println(str3 == str4);//输出结果:true
这⾥⼜为什么会是true呢?
第⼀⾏:"a"作为⼀个常量存放于字符串池中,并将它的引⽤地址赋值给了str1; final使得变量str1被当作⼀个常量对待
第⼆⾏:"b"作为⼀个常量存放于字符串池中,并将它的引⽤地址赋值给了str2; final使得变量str2被当作⼀个常量对待
第三⾏:"ab"作为⼀个常量存放于字符串池中,并将它的引⽤地址赋值给了str3;
第四⾏:str1 + str2,此时+号两边都是常量哦(final的功劳)
即:String str4 = str1 + str2;
就等价于 String str4 = "a" + "b";
就等价于 String str4 = "ab";
第五⾏:str4指向常量"ab",str3指向常量"ab"(第三⾏),所以str3 == str4 等于true
==============================================
我不能保证⽂章中每个观点都是对的,但是⾄少保证每⼀句话、每⼀⾏代码都经过了认真的推敲、仔细的斟酌。每⼀篇⽂章的背后,希望都能看到⾃⼰对于技术、对于⽣活的态度。
==============================================
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论