日期:2014-05-20  浏览次数:20754 次

java.lang.String的 intern() 方法
JDK里的解释:
intern public String intern()返回字符串对象的规范化表示形式。 一个初始时为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 所有字面值字符串和字符串赋值常量表达式都是内部的。
词霸里解释:
intern [in?t?:n] v.拘禁,软禁 n.实习生
v.拘禁,软禁 n.实习生 好象没什么意义。
intern 到底应该怎样解释呢?

------解决方案--------------------
相信绝大多数的人不会去用String类的intern方法
打开String类的源码发现这是一个本地方法,定义如下:

public native String intern();

文档告诉我们该方法返回一个字符串对象的内部化引用:
由String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用。

从程序的角度上怎么来看这个方法呢

我们假设有两个字符串s1,s2,当s1.equals(s2)时,s1.intern()==s2.intern(),
也就是说这两个字符串在内存中使用的是同一个实例。

Java语言规范中定义了字符串文字以及更一般的常量表达式的值的字符串是被内部化的,以便它们共享同一个实例。我们试验一下下面代码

String s1 = "你好,Java自由人";
String s2 = "你好," + "Java自由人";
System.out.println(s1==s2);
System.out.println(s1.intern()==s2.intern());

这段代码将打印两个true,也就是说字符串s1和s2是共享同一个实例。不过前提是尽管使用了表达式,但是表达式中必须都是常量。

当然我现在还想不出这个方法到底有什么用,不过算是对Java虚拟机内部组织结构的一些了解,
同时了解这个处理机制也可以让我们在用到字符串常量的时候了解如何节省这些字符串所占用的内存。

很奇怪的是intern这个方法居然在JBuilder 2005上被告知是一个未定义的方法,在Eclipse中表现很正常。

原帖:自由人
------解决方案--------------------
似乎就是在常量池匹配对象吧 如果没有就创建 没用过找个方法:(
------解决方案--------------------
一般很少用到这个方法。