搜索

首页  >  问答  >  正文

Java String 的 intern() 方法问题

请问两种方式是否等价?

    HashMap map = new HashMap<>();
    map.put("abc", 1); //1
    map.put("abc".intern(), 1);//2
ringa_leeringa_lee2807 天前823

全部回复(3)我来回复

  • 高洛峰

    高洛峰2017-04-17 16:12:00

    .class文件中的常量池,在运行期会被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用.
    所以这两个应该是等价的

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 16:12:00

    是等价的,首先你的第二条语句的intern()完全是多此一举,“abc”本身就会编译进常量池,所以你的intern()不会做什么操作。

    回复
    0
  • PHPz

    PHPz2017-04-17 16:12:00

    1. HashMap的put方法是会计算key的哈希值,所以不管String是从常量池返回还是new出来的都一样

    2. 从intern()方法的注释中看到,它会从String的常量池中找这个字符串,找到了就返回常量池中的字符串,没找到就常量池新增这个字符串,然后返回。

        • When the intern method is invoked, if the pool already contains a

        • string equal to this String object as determined by

        • the {@link #equals(Object)} method, then the string from the pool is

        • returned. Otherwise, this String object is added to the

        • pool and a reference to this String object is returned.

    回复
    0
  • 取消回复