String理解

2019-11-22  本文已影响0人  懵逼猴

基本概念

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

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

  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

上一篇 下一篇

猜你喜欢

热点阅读