Java对象创建方式及JVM对字符串处理
作者:网络转载 发布时间:[ 2013/4/26 10:57:39 ] 推荐标签:
② 下面我们再看一题经典的笔试面试题:String javaStr = "小学徒" + "的" + "成长历程";总共创建了多少个字符串对象?
答案是一个,因为如果一个字符串连接表达式的值可以在编译时确定下来,那么JVM会在编译时计算该字符串变量的值,并让他指向字符串池中对应的字符串。但如果程序使用了变量,或者调用了方法,那么只能等到运行时才可确定该字符串连接式的值,也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池。
下面我们写一段代码验证一下吧:
public class Test{
public static void main(String[] args) {
String anotherStr = "小学徒的成长历程";
//虽然javaStr的值不是直接量,但是因为javaStr的值可以在编译时确定
//所以javaStr也会直接引用字符串池中对应的字符串
String javaStr = "小学徒" + "的" + "成长历程";
String a = "的";
//使用了变量,只能等到运行时才可确定该字符串连接式的值
//也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池
String contactStr = "小学徒" + a + "成长历程";
//调用了方法只能等到运行时才可确定该字符串连接式的值
//也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池
String methodStr = "小学徒的成长历程" + a.length();
//判断各个字符串是否相等
System.out.println("javaStr == anotherStr : " + (javaStr == anotherStr));
System.out.println("contactStr == javaStr : " + (contactStr == javaStr));
System.out.println(" methodStr == javaStr : " + (methodStr == javaStr));
}
}
运行结果:

③ 呵呵,我们再用一题经典面试笔试题目来抛砖引玉吧,这样比较可以诱导大家的思考,同时增加大家的兴趣,不会太过闷,而且还能提醒大家在笔试面试的时候该注意什么地方,好啦,言归正传。String name = "小学徒"; name = name + "的成长空间";两条语句总共创建了多少个字符串对象?
答案是两个,因为当一个String对象创建完成后,该String类里包含的字符串序列被固定下来了,以后永远都不能改变。(如果目前不懂这句的话,没关系,看下补充你理解的了)
public class Test{
public static void main(String[] args) {
String name = "小学徒"; //定义一个字符串变量
System.out.println(System.identityHashCode(name)); //输出该对象的hashCode值
name = name + "的成长空间"; //拼接字符串变量
System.out.println(System.identityHashCode(name));//输出该对象的hashCode值
}
}
运行结果:


sales@spasvo.com