面试冲刺——StringTable(串池)

  1. StringTable
    String table又称为String pool,字符串常量池,其存在于堆中(jdk1.7之后改的)。最重要的一点,String table中存储的并不是String类型的对象,存储的而是指向String对象的索引,真实对象还是存储在堆中。

此外String table还存在一个hash表的特性,里面不存在相同的两个字符串。

此外String对象调用intern()方法时,会先在String table中查找是否存在于该对象相同的字符串,若存在直接返回String table中字符串的引用,若不存在则在String table中创建一个与该对象相同的字符串。

String s1 = “a”;
String s2 = “b”;
String s3 = “a” + “b”;
String s4 = s1 + s2;
String s5 = “ab”;
String s6 = s4.intern();

// 问
System.out.println(s3 == s4); // false
System.out.println(s3 == s5); // ture
System.out.println(s3 == s6); // ture

String x2 = new String(“c”) + new String(“d”);
String x1 = “cd”;
x2.intern();

// 问,如果调换了【最后两行代码】的位置呢 // ture
System.out.println(x1 == x2); // false
3 StringTable 特性
常量池中的字符串仅是符号,第一次用到时才变为对象
利用串池的机制,来避免重复创建字符串对象
字符串变量拼接的原理是 StringBuilder (1.8)
字符串常量拼接的原理是编译期优化
可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池
1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回
1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,放入串池, 会把串池中的对象返回

发布了92 篇原创文章 · 获赞 3 · 访问量 2789

猜你喜欢

转载自blog.csdn.net/weixin_44993313/article/details/104582948
今日推荐