date: 2024-10-07 15:56:11 title: Java字符串的几种创建方式及原理 author: zaqai tags:
- JVM
- java
- string
- 直接赋值
- new String()
- intern方法
Jdk1.7 之后字符串常量池在堆中
Jdk 1.6 及之前: 有永久代, 运行时常量池包含字符串常量池 Jdk 1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里 Jdk 1.8 及之后: 无永久代,运行时常量池在元空间,字符串常量池里依然在堆里
直接赋值
String s = "aaa"; // s指向常量池中的引用
只会在常量池创建对象。返回的也只是字符串常量池中的对象引用!
如果常量池中有相同的字符串, 直接返回引用, 否则在常量池创建再返回常量池引用
new String ()
String s1 = new String("aaa"); // s1指向堆内存中的对象引用
保证字符串常量池和堆中都有这个对象,最后返回堆内存中的对象引用!
常量池含有这个对象, 就在堆中创建对象并返回
常量池不含有, 先在常量池创建, 再堆中创建
intern 方法
String s1 = new String("aaa");
String s2 = s1.intern();
System.out.println(s1 == s2); //false
s1在堆中, s2 在常量池中
如果字符串常量池中已经包含一个等于 "aaa"
的字符串(用 equals(oject)
方法确定),则返回字符串常量池中的字符串 "aaa"
。
如果字符串常量池中不存在, 返回堆中的字符串对象
String s1 = new String("he") + new String("llo");
String s2 = s1.intern();
System.out.println(s1 == s2);
在 JDK 1.7 及以上的版本输出是 true
,创建了 5
个对象
回复