本文主要是介绍【Java String】简述String类比较和常量池内存分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、引出正题
String
类型对象进行比较时,我们一般使用 equals()
的方式进行值比较,但是有时候可能会出现 ==
对象比较的方式。
在使用 ==
比较的时候,往往是和String在JVM内存存储结构有关,这也引起了部分同学使用时的错误,那么接下来我们来详细分析一下此问题。
二、举例说明
1、new String("xx")
都是在堆上创建字符串对象。当调用 intern()
方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。
代码示例1:
String str1 = new String("abc");String str2 = new String("abc");String str3 = new String("test");System.out.println(str1 == str2); // false
代码示例2:
String str1 = new String("abc");String str2 = new String("abc");String str3 = new String("test");System.out.println(str1.intern() == str2.intern()); //true
2、通过字面量赋值创建字符串(如:String str1 = "abc";
)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。
代码示例:
String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2); // true
3、字符串 + 操作,如果是常量做 + 操作,编译器会直接进行优化。
代码示例:
String str1 = “a” + “bc”; // 常量池创建"a"和"bc",连接过程编译器直接优化成"abc",在常量池创建"abc",在str2初始化时查询常量池中存在"abc",直接返回,所以str1和str2指向相同的"abc"
String str1 = "a" + "bc";String str2 = "abc";System.out.println(str1 == str2); // true
4、对于final字段,编译期直接进行了常量替换(而对于非final字段则是在运行期进行赋值处理的)。
代码示例:
String str1 = "abc";final String s1 = "a";final String s2 = "bc";String str2 = s1 + s2;System.out.println(str1 == str2); // true
5、intern()
方法。
代码示例:
String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1.intern() == str2.intern()); //true
三、总结
在编码中String
要进行比较,所以一般推荐使用 equals()
,直接进行值比较,不要使用==
,因为可能会带来一些你所不熟悉的(内存结构)问题。
感谢阅读,下次再见。ヾ( ̄▽ ̄)ByeBye!
这篇关于【Java String】简述String类比较和常量池内存分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!