版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014491519/article/details/81322126
使用String.intern()方法可以保证相同内容的字符串引用相同类型的内存对象。
先来两个例子
String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2); // false
String s3 = s1.intern();
System.out.println(s1.intern() == s3); // true
这里s1.intern()会将 s1放入常量池(String Pool)中,然后返回这个对象的引用。
如果采用”aaa”使用双引号创建字符串实例,会先在字符串常量池里面找,如果找到就返回对象引用,没有找到,新建对象并将对象引用放入常量池。
String s4 = "bbb";
String s5 = "bbb";
System.out.println(s4 == s5); // true
在 Java 7 之前,字符串常量池被放在运行时常量池中,它属于永久代。而在 Java 7,字符串常量池被放在堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。