Java
中的
String
字符串常量池:在堆中开辟出来的一块内存
创建字符串:
1. 用简单方法创建:
String s1 = “String”; String s2 = “String”;
创建s1的时候,因池中没有”String” ,故在字符串常量池中创建之,并使s1指向它
创建s2的时候,在池中搜索到”String”,故直接将s2指向它
2. 用new关键字创建:String s3 = new String(“String”);
在堆中,注意不是在字符串常量池中,创建之,并用s3指向它
然后去字符串常量池中查看是否有之,有则将两个联系起来;没有则再在池中创建一个并将池中新创建的与s3联系起来 (fix me: 那在堆中的对象是否就被回收了?)
有以上分析,故:s3. Intern () == s1. Intern (); //即s3和s1在字符串常量池中指向同一个对象
String对象永远不会变,保证了复用,保证了高效的比较操作(只用比较两个String对象在池中的联系即可——将内容比较转化成了引用的比较)
但是这样一来,连接、截取等操作
都将引起老对象的丢弃和新对象的生成,效率低
StringBuffer和StringBuilder则允许对内存进行修改而不会产生冗余的中间对象
(高效的:append
insert delete reverse toString 操作)