请问两种方式是否等价?
HashMap map = new HashMap<>(); map.put("abc", 1); //1 map.put("abc".intern(), 1);//2
ringa_lee
.class文件中的常量池,在运行期会被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用.所以这两个应该是等价的
是等价的,首先你的第二条语句的intern()完全是多此一举,“abc”本身就会编译进常量池,所以你的intern()不会做什么操作。
HashMap的put方法是会计算key的哈希值,所以不管String是从常量池返回还是new出来的都一样
从intern()方法的注释中看到,它会从String的常量池中找这个字符串,找到了就返回常量池中的字符串,没找到就常量池新增这个字符串,然后返回。
When the intern method is invoked, if the pool already contains a
string equal to this String object as determined by
String
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.
.class文件中的常量池,在运行期会被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用.
所以这两个应该是等价的
是等价的,首先你的第二条语句的intern()完全是多此一举,“abc”本身就会编译进常量池,所以你的intern()不会做什么操作。
HashMap的put方法是会计算key的哈希值,所以不管String是从常量池返回还是new出来的都一样
从intern()方法的注释中看到,它会从String的常量池中找这个字符串,找到了就返回常量池中的字符串,没找到就常量池新增这个字符串,然后返回。
When the intern method is invoked, if the pool already contains a
string equal to this
String
object as determined bythe {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this
String
object is added to thepool and a reference to this
String
object is returned.