java String 常量变量
Posted mangues
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java String 常量变量相关的知识,希望对你有一定的参考价值。
编译时替换
final String a = "hello"; //字面常量
final String b = "world"; //字面常量
String c = a+b; //此处会在编译时直接替换成String c = "helloworld"
final String a = "hello"; //字面常量
String b = "world"; //变量
String c = a+b; //此处会new StringBulider().append()
举例:
“” 括起来的都是字面常量 放在常量池中
public static void main(String[] args)
String hello = "hello",lo="lo";
String.out.print(hello == "Hello"); //true hello引用常量池中的"hello"所以相等
String.out.print(Other.hello == "Hello"); //true 都是引用常量池中的hello
String.out.print(hello == "Hel"+"lo"); //true 两个常量池字符串拼接 直接相等
String.out.print(hello == "Hel"+lo); //false 常量+变量 = new StringBuilder
String.out.print(hello == ("Hel"+lo).intern()); //true 字符串对应的常量池中的字符串(有返回引用,没有加一个返回引用)
public static class Other
public static String hello = "Hello";
jdk6 和 jdk7 下 intern 的区别
相信很多 JAVA 程序员都做做类似 String s = new String(“abc”)这个语句创建了几个对象的题目。 这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了2个对象,第一个对象是”abc”字符串存储在常量池中,第二个对象在JAVA Heap中的 String 对象。
1.将String常量池 从 Perm 区移动到了 Java Heap区
2.String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。
public static void main(String[] args)
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);
打印结果是
- jdk6 下false false
- jdk7 下false true
jdk 1.6下:
“1” 直接存在perm常量池中,s 引用的是堆里面的1,s.intern() 检查常量池中有不操作,s2 引用常量池中的”1”,所以不相等。
“1” 直接存在perm常量池,s3 引用堆里面建立的”11”对象,s3.intern() 检查不存在,常量池中加入”11”,,s4 引用常量池中的”11”,所以不相等
jdk 1.7下: 常量池存在堆中,没有perm区了
“1” 直接存在堆中常量池中,s 引用的是堆里面的新建的”1”对象,s.intern() 检查常量池中有不操作,s2 引用常量池中的”1”,所以不相等。
“1” 直接存在堆中常量池,s3 引用堆里面建立的”11”对象,s3.intern() 检查不存在,常量池中直接引用堆中的”11”,s4 引用常量池中的”11”引用 也就引用的第一次堆中建立的”11”,也就是s3,所以相等
参考: https://blog.csdn.net/goldenfish1919/article/details/80410349
以上是关于java String 常量变量的主要内容,如果未能解决你的问题,请参考以下文章