JVM运行的时候,将内存分为两个部分,一部分是堆,一部分是栈。堆中存放的是创建的对象,而栈中存放的是方法调用过程中的局部变量或引用。而设计Java字符串对象内存实现的时候,而堆中又开辟了一块很小的内存,称之为字符串常量池,专门用来存放特定的字符串对象。 例如 String s1="yes i do!" 现实查看字符串常量池中是否存在内容与"yes i do!"相同的字符串对象。 若没有,则新创建一个包含该内容的字符串对象,并让引用变量指向该对象;若存在则引用直接指向该对象。 而 public String intern()此方法将指定字符串对象在字符串常量池中对应对象的引用返回,若本身就在字符串常量池中,则直接将自己的引用返回,若该字符串在堆中,则返回字符串常量池中其联系对象的引用;
如果a.equals(b),则一定有a.intern() == b.intern()它是返回这个字符串在常量池中的引用
我是从来没有用过这个方法,个人觉得也不是经常有用
String str1 = new String("123");
String str2 = "123";
String str3 = str1.intern();
System.out.println((str1 == str2) +","+ (str3 == str2));
String str4 = new String("234");
String str5 = new String("234");
String str6 = str4.intern();
String str7 = str5.intern();
System.out.println((str4 == str5) +","+ (str6 == str7));
至于String.intern(),好像没用过嘿嘿,看了下API,是这样写的
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
http://yiliner.javaeye.com/blog/207723
例如 String s1="yes i do!"
现实查看字符串常量池中是否存在内容与"yes i do!"相同的字符串对象。
若没有,则新创建一个包含该内容的字符串对象,并让引用变量指向该对象;若存在则引用直接指向该对象。
而 public String intern()此方法将指定字符串对象在字符串常量池中对应对象的引用返回,若本身就在字符串常量池中,则直接将自己的引用返回,若该字符串在堆中,则返回字符串常量池中其联系对象的引用;