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

解决方案 »

  1.   

    相信绝大多数的人不会去用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中表现很正常。原帖:自由人
      

  2.   

    我看帮助文档里:
    直接是: public String intern()没想到 其  是个 native方法啊。源码里的:   
        public native String intern();这个方法有什么用途啊,为什么要用这么个单词(intern)来定义这个方法呢?
      

  3.   

    其中一个可以使用场景,在应用服务器端处理客户端请求任务的时候,也就是多线程访问的时候,进行同步处理:
    synchronized( _key.intern() )
    {
    .....                     
    }
      

  4.   


    String本身没有提供修改自身值的方法,subString、concat等方法也都是读取了一下当前String对象的值,然后进行一系列操作,然后返回一个新的String。也就是说对String的操作不涉及到同步的问题吧?还请六楼的明示。
      

  5.   

    不妨看下面这段代码、  String str1 = "Hello";
     String str2 = new String("Hello");
     System.out.println(str1==str2.intern()); System.out.println(str2==str2.intern());控制台输出"true"与"false" 第一个"true"就解释了第一个疑问、intern把str2的内存指向为str1、所以二者相等、字符串池中应该有两个"Hello",一个是str1的引用,另外一个则是str2用new出来的空间,但使用intern后其实已经指向str1的内存空间了,所以才会输出"false"再说点题外话,Stirng str2 = new Stirng("Hello");其实应该有两个对象,一个是存在于栈中的"Hello",另外一个是对变量"str2"的指向,存在于堆内存中。用new关键字不管池中有没有都会开辟一块内存空间。