在Java中String是个十分特殊的类,因为JVM和用户自定义的类中会大量用到String,不仅是指String变量,还有大量的变量名,类名,方法名,都被统一称为String Literal。
为了性能和内存资源上的考虑,JVM对String类型的数据做了特殊的处理。也就是大家都知道的String是immutable的或者是constant。其实很多面试或者笔试里面都会考到。有时觉得没事找事,确实,对于一般的系统,不需要考虑到底创建了几个string,只管用就是,似乎JVM会处理,至少会GC他们的。其实不然。对于大型项目,或者运行很长时间的项目,或者使用到大量字符串的项目来说,String的开销就不得不考虑。
1. String Literal Constant Pool
JVM 维护了一个String Literal Constant Pool,用来存储String Literal。String Literal不同于String 变量 variable。比如 String s = “abc”。首先s作为变量名是一个literal。如果你的程序里面循环定义了1000个这样的s变量,在literal pool里面也只有一个s。对于“abc”,它首先是一个自定义的String,它在创建之后,立即利用String的intern方法,装入到了Literal Pool,也就成为Literal了。也就是说你循环1000变,内存里面也只有这么一个String。
Java代码
package ;
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
(s1 == s2);
}
}
输出 true。也就是只生成了一个对象。
2. 编译时计算和运行时计算的区别
上面的程序,编译器就可以计算s1 和 s2的值了,这就是编译时计算。如果:String s3 = s1+s2;那么s3的值就只能在运行的时候才能确定,这就是运行时计算。看下面:
Java代码
package ;
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = s1 + s2;
String s4 = "abc" + "abc";
String s5 = "ab" + "cabc";
(s3 == s4);
(s4 == s5);
}
}
输出:false true。可见运行时会创建一个新的String,并且不会放入Literal Pool。
3. Intern
String提供了方法Intern让我们把String对象放入到Literal Pool里面并返回这个新的引用。
Java代码
package
Java String Literal 来自淘豆网m.daumloan.com转载请标明出处.