龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

String类的intern内部化方法释疑

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String 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中表现很正常。
  
精彩图集

赞助商链接