黑马程序员技术交流社区
标题:
String类的小问题,求解释
[打印本页]
作者:
吴凯
时间:
2013-5-3 01:11
标题:
String类的小问题,求解释
问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;
String str3 = "efg";
String str4 = new String("efg");
System.out.println(str3 == str4);
结果是false;
作者:
吴凯
时间:
2013-5-3 01:12
为什么第二个例子会是 false
作者:
花开花落总相似
时间:
2013-5-3 07:57
存放的位置不一样
String str1 = "abc"; // date segment
String str2 = "abc"; //date segment
System.out.println(str1 == str2);
输出了true;
String str3 = "efg"; // date segment
String str4 = new String("efg"); //堆内存空间
System.out.println(str3 == str4);
结果是false;
date segment 是存放 字符串常量和静引态变量的地方 同时呢 他还对立面的内容有一个优化 当date segment里面存在一个字符串常量的时候,他就不会再创建了 也就是说 str1 创建了一个 abc str2就不会创建了 他直接指向str1的对象 两个引用指向一个相同的对象 所以 str1 == str2当然是真。 而下面str4你new出来的对象存在堆内存里面 str3和str4当然不等的了 说的不好的话还请见谅 呵呵
作者:
海不扬波
时间:
2013-5-3 09:18
String str3 = "efg";是在栈内存中
String str4 = new String("efg");这个是实例化对象,是在堆内存中,两个内在地址值不一样,所以是false啦。
作者:
一直在路上
时间:
2013-5-3 09:30
问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;
String str3 = "efg";是放在栈内存中,通过赋值得到的常量都是放在栈内存中
String str4 = new String("efg");通过new获得的对象都是放在堆内存中,只是提供了一个地址指向这个对象,所以结果肯定不一样了啊。
作者:
于海龙
时间:
2013-5-3 09:38
== 比的是对象("abc")地址.
如果"abc"存在, str2指向此地址不会新创建对象。两者比较为true
new出来的都会新创建对象,所以指向地址不同,两者比较为false.
作者:
孟群峰
时间:
2013-5-3 09:51
String str1 = "abc";
String str2 = "abc";
第一句执行时,"abc"被创建存储在String常量池中,并返回其地址。
第二句执行时,虚拟机会先查找是否有将要创建的字符串,如果有直接返回其地址
所以第一句和第二句创建的字符串的地址相同。System.out.println(str1 == str2);则为true。
String str3 = "efg";
String str4 = new String("efg");
第一句和上面相同,字符串被创建在string常量池中,返回常量池中的地址。
第二句使用new创建字符串在对内存中,返回堆内存中的地址。
所以两个语句创建的字符串地址一定不相同
System.out.println(str3 == str4);为false
懂了吗楼主?
作者:
曹德君
时间:
2013-5-3 10:10
是这样子的。第一个情况,str1="abc"和str2是开辟的同一个对内存空间的,他们是同一个对象。第二种情况因为你是用new相当于建立了两个对象。而==是比较两个对象的地址值,所以第一个就会是true第二个是false。
作者:
harborbest
时间:
2013-5-3 10:57
这个问题问的人实在是太多了!而且也有很多人都做回答了!
作者:
李阳阳
时间:
2013-5-3 14:39
"=="用来比较对象时,是比较地址值。就是要对象内容和地址是否相同,equals()比较对象时只要对象内容相同就行。
代码:
class EqualDemo
{
public static void main(String[] args)
{
String str1 = new String("hello");
String str2 = new String("hell0");
String str3 = str2;
//用“==”比较str1与str2
System.out.println("str1与str2的比较结果为:"+(str1==str2));
//用“==”比较str2与str3
System.out.println("str1与str2的比较结果为:"+(str2==str3));
//用equals方法比较str1与str2
System.out.println("str1与str2的比较结果为:"+str1.equals(str2));
//用equals方法比较str2与str3
System.out.println("str1与str2的比较结果为:"+str2.equals(str3));
}
}
qq.jpg
(47.36 KB, 下载次数: 0)
下载附件
2013-5-3 14:38 上传
作者:
吴文彬
时间:
2013-5-3 18:26
String str1 = "abc";
String str2 = "abc";
第一句执行时,"abc"被创建存储在String常量池中,并返回其地址。
第二句执行时,虚拟机会先查找是否有将要创建的字符串,如果有直接返回其地址
所以第一句和第二句创建的字符串的地址相同。System.out.println(str1 == str2);则为true。
1.String str3 = "efg";
2.String str4 = new String("efg");
第一句属于字符串常量赋值,jvm是先去检查字符串常量池,如果常量池中没有"efg"这个字符串,则在String常量池中创建,并返回该字符串在常量池中的地址;如果常量中有"efg"这个字符串,直接返回该字符串在常量池中的地址。如果字符串被创建在string常量池中,有且只有一份,返回常量池中的地址。所以相等。
第二句是使用new在堆内存中创建字符串对象,每一个新创建的对象都是唯一的,所以返回堆内存中的唯一的地址。所以不相等。
作者:
黄玉昆
时间:
2013-5-3 22:09
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2