黑马程序员技术交流社区
标题:
高手进来,关于字符串引用类型
[打印本页]
作者:
kebingxing
时间:
2015-10-2 09:00
标题:
高手进来,关于字符串引用类型
String a2="aa";
String b2=new String("aa");
sop(a2==b2);
sop("aa"==b2);
sop("aa"==a2);
说下运行结果,并说明为什么,我自己运行了,但是不知道原因,特别是最后两句
说下
作者:
xuxu5112
时间:
2015-10-2 10:54
本帖最后由 xuxu5112 于 2015-10-2 10:57 编辑
package com.xuchang.start;
public class Tset {
/**
* @param args
*/
public static void main(String[] args) {
String a = "a";
String b = "a";
//先去JVM的常量池中寻找,如果有直接返回该对象的引用
//如果没有则先创建对象再把它放到常量池中返回该引用
System.out.println(a == b); //true
String c = "a" + "b";
String d = "ab";
//因为"a","b"都是常量字符串,所以 c在编译时就可以被确定了
//相当于String c = "ab";
System.out.println(c == d); //true
String e = a + "b";
//在编译时 a时变量不能确定所以会创建新的对象
System.out.println(d == e);//false
}
}
复制代码
所以
String a2 = "aa";//创建"aa"并放入常量池中
String b2 = new String("aa");//在堆中new一个对象b2 指向常量池中的"aa"
System.out.println(a2 == b2);//a2指向常量池,b2指向堆显然是false
System.out.println("aa" == b2);//同上false
System.out.println("aa" == a2);//这两个指向同一个对象所以true
作者:
风语
时间:
2015-10-2 15:16
// String a2 = "aa"创建了一个对象,这个对象在方法区的常量池中,常量池中会为aa开辟一个空间并给一个地址值
//并把地址值赋值给a2
//如果常量池中有 那么就直接把这个地址给a2
String a2 = "aa";
// String b2 = new String("aa"); 创建了两个对象一个在方法区中的常量池中"aa" , 在堆内存中开辟一个空间,
//并提供一个地址值然后将常量池中aa这个值复制一份在堆内存中,再将堆内存中"aa"地址值复制给b2
String b2 = new String("aa");
// 两个对象等于号所比较的是地址值
System.out.println(a2 == b2);// flase b2是堆内存中的地址值,所以和a2不一样
System.out.println("aa" == b2);// flase b2是堆内存中的地址值, 所以地址值和常量池中的aa地址不一样
System.out.println("aa" == a2);// true a2本身拿的是常量池中的aa地址所以一样
作者:
yuzhouyichen
时间:
2015-10-2 17:38
二楼正解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2