# java字符串常量池
#1.什么是字符串常量池
字符串常量池的概念不是java独有的,它为每个不同的字符串对象保留唯一的副本,以节省空间并提高程序运行效率。
## 2.java的字符串常量池
~~~
publicstaticvoidmain (string . args ) throws Exception { )。
字符串str1=' ABC ';
字符串str2=' ABC ';
stringstr3=新字符串(ABC );
stringstr4=新字符串(ABC );
String str5=str3.intern (;
stringstr6=新字符串(ABCD );
system.out.println (str1==str 2: ) ) str1==str2);
system.out.println (str1==str : ) ) str1==str3);
system.out.println (str3==str 4: ) ) str3==str4);
system.out.println (str1==str 5: ) ) str1==str5);
}
~~~
` ` ` java
str1==str2: true
str1==str3: false
str3==str4: false
str1==str5: true
``````
! ((3359 box.Kan cloud.cn/fc 5165 d 072145911 a C1 B9 ca 2224 F5 C1 d _ 700 x498.png ) ) ) ) ) )。
1. `String str1='abc ' `检查常量池,找出是否有' abc '字符串,然后创建并放入' abc '对象
2. `String str2='abc ' `检查常量池,发现' abc '已经存在,直接返回对象引用
3. `String str3=new String('abc ' `在堆中创建字符串对象。 值为“abc”,如果检查常量池,则常量池中有“abc”对象,无需创建
4.` stringstr4=新字符串(ABC ),与步骤3相同的逻辑
5. `String str5=str3.intern (`返回常量池中对str3的引用,并代入str5
6. `String str6=new String('abcd ' `在堆中创建字符串对象。 值为“abcd”,通过检查字符串常量池中是否没有“abcd”对象来创建完成
7 .比较阶段: str1、str2和str5都指向同一对象,str3.intern ()返回常量池中字符串的引用。 ) str3和str4分别指向两个不同的对象
注意:在: jdk1.7之前,字符串常量池位于方法区域中,而1.7之后位于堆中
#3.字符串常量池注意事项
1 .字符串常量池必须是全局共享的,因此设计者必须考虑多线程问题
2 .使用的时候必然有很多字符串只使用一次就不使用了,所以有必要考虑字符串回收的问题
这些都是我们不需要使用者的担心,设计者必须注意的地方。
[ https://www.geeksforgeeks.org/interning-of-string/(https://www.geeksforgeeks.org/interning-of-string/)
[ https://segment fault.com/a/119000000988357 ] (https://segment fault.com/a/119000000988357 ) )。
[ https://en.Wikipedia.org/wiki/string_ interning ] 65https://en.Wikipedia.org/wiki/string _ interning ]