String理解

基本概念

  1. 直接使用字符串会直接进入常量池
String s1 = new String("he")// 会产生两个对象一个在堆中的s1字符串对象,一个使用"he"生成的字符串对象并加入常量池中

2.String#intern() 方法的作用就是

  • 如果字符串未在 Pool 中,那么就往 Pool 中增加一条记录,然后返回 Pool 中的引用。
  • 如果已经在 Pool 中,直接返回 Pool 中的引用。
  1. JDK1.6的实现
    它的string pool实现是要求要将被string pool引用的String实例放在PermGen里的,而随便造个普通的String实例不在PermGen里,所以这里会在PermGen内创建一个原String的拷贝,尽量小心使用 String.intern() 方法,容易导致 OutOfMemoryError!
  2. JDK1.7以上的版本
    返回的使用存在堆中字符串是引用
    4.实例说明
String s1 = new String("he") + new String("llo"); // ①
        String s2 = new String("h") + new String("ello"); // ②
        String s3 = s1.intern(); // ③
        String s4 = s2.intern(); // ④

运行main方法,先看第一句,会创建"he"和"llo"对象,并放入字符串常量池,然后会创建一个"hello"对象,没有放入字符串常量池,s1指向这个"hello"对象。第二句,创建"h"和"ello"对象,并放入字符串常量池,然后会创建一个"hello"对象,没有放入字符串常量池,s2指向这个"hello"对象。第三句,字符串常量池里面还没有,于是会把s1指向的String对象的引用放入字符串常量池(换句话说,放入池中的引用和s1指向了同一个对象),然后会把这个引用返回给了s3,所以s3==s1是true。第四句,字符串常量池里面已经有了,直接将它返回给了s4,所以s4==s1是true。

参考文章

字符串常量池与intern
发现String#intern的API描述有问题
Java 字符串常量池介绍
https://www.zhihu.com/question/55994121/answer/147296098

你可能感兴趣的:(String理解)