标签:总结 ora 就会 串操作 字符串池 固定 冲突 方法 编译
String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为byte []
字符串常量池中是不会存储相同内容的字符串的。
1.常量与常量的拼接结果在常量池,原理是编译期优化
2.常量池中不会存在相同内容的常量。
3.只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder
4.如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址。
String s1 = "a";
String s2 = "b";
String s3 = "c";
/*
s1+s2执行细节
1. StringBuilder s = new StringBuilder();
2. s.append("a");
3. s.append("b");
4. s.toString();
*/
String s4=s1+s2;
如果不是用双引号声明的String对象,可以使用string提供的intern方法: intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
也就是说,如果在任意字符串上调用String. intern方法,那么其返回结果所指向的那个类实例,必须和直接以常量形式出现的字符串实例完全相同。因此,下列表达式的值必定是true:
通俗点讲,Interned String就是 确保字符串在内存里只有一份拷贝,这样可以节约内存空间,加快字符串操作任务的执行速度。注意,这个值会被存放在字符串内部池(String Intern Pool )
public class stringIntern1 {
public static void main(String[] args) {
string S = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);//jdk6:false jdk7/8:false
string s3 = new String("1") + new String("1");
//执行完上一行代码常量池中不存在"11”
s3.intern();//在字符串常量池中添加"11"
//jdk6会创建一个新的对象在字符串常量池中
//jdk7时因为字符串常量池在堆中,并不会创建新的对象而是在字符串常量池中记录弟7行创建的对象的地址。
String s4 = "11" ;//使用常量池的"11"
System.out.println(S3 == s4);//jdk6:false jdk7/8:true
}
}
public class stringIntern2 {
public static void main(String[] args) {
string s3 = new String("1") + new String("1");
//执行完上一行代码常量池中不存在"11”
String s4 = "11" ;//在字符串常量池中生成"11"将对象的的地址赋给s4
String s5 = s3.intern();//字符串常量池中已经有11了所以不会添加s3的地址到字符串常量池
System.out.println(S3 == s4);//false
System.out.println(S5 == s4);//true
}
}
总结String的intern ()的使用:
标签:总结 ora 就会 串操作 字符串池 固定 冲突 方法 编译
原文地址:https://www.cnblogs.com/junlinsky/p/13396631.html