String之intern疑问,过来围观

六只 发布于 2012/02/17 13:38
阅读 449
收藏 1

 

public static void main(String[] args) {
	String s1 = "hello";
	String s2 = new String("hello");
	s2.intern();
}

目的:使用new创建字符串后,再调用intern规范化,那么规范化之后那个引用是用原先s1的,还是新生成了一个?反正不是s2的,因为调用s2 == s2.intern()返回false。

javap之后是这样的,实话是:我不太能看懂,请大家帮忙解释:

public static void main(java.lang.String[]);
  Code:
   Stack=3, Locals=3, Args_size=1
   0:   ldc     #2; //String hello
   2:   astore_1
   3:   new     #3; //class java/lang/String
   6:   dup
   7:   ldc     #2; //String hello
   9:   invokespecial   #4; //Method java/lang/String."<init>":(Ljava/lang/Strin
g;)V
   12:  astore_2
   13:  aload_2
   14:  invokevirtual   #5; //Method java/lang/String.intern:()Ljava/lang/String
;
   17:  pop
   18:  return
  LineNumberTable:
   line 9: 0
   line 10: 3
   line 11: 13
   line 12: 18

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      19      0    args       [Ljava/lang/String;
   3      16      1    s1       Ljava/lang/String;
   13      6      2    s2       Ljava/lang/String;

 

 

 

加载中
0
张海雷

http://stackoverflow.com/questions/5777131/java-string-intern-and-literal

 

String s2 = new String("hello");

s2 == s.intern 肯定是false

intern方法的作用这个url已经讲得很清楚

 

 

张海雷
@六只 抱歉@六只兄 确实误解了
六只
六只
你似乎没有理解我想要的是什么,不过那个url的内容启发我了。我画张图弄上来,我们再来讨论。另外,我知道它是用来干嘛的,只是有个细节没弄清楚。
0
六只
六只

@张海雷 图来了,上面三行代码,下面是引用。我的理解,可以在这个基础上讨论。速度来哈!

 

也就是说,s2的引用根本就不变,堆中的hello不会被回收。

0
六只
六只
咋木有人和我一起讨论了呢。。。
0
Jeky
Jeky

研究到这个程度,建议你去看深入Java虚拟机了,或者直接看这个:http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html

第6章的指令集有很详细的说明

P.S. 关于intern不妨看看这个:http://www.iteye.com/topic/1112592

六只
六只
就等着兄弟你来指点下呢。我研究下。嘿嘿。
0
aiasfina
aiasfina

深入JVM在链接模型那章提到过..

s1是直接量,在生成string对象的时候将字符串“记录”到“intern表”上面,s2用new String();创建一个字符串,在调用intern()方法之后在"intern表"上查询,存在相同字符串,返回s1

返回顶部
顶部