黑马程序员技术交流社区
标题:
==比较String问题求解
[打印本页]
作者:
沈样
时间:
2012-3-2 15:26
标题:
==比较String问题求解
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b));//返回是false
作者:
马胜平
时间:
2012-3-2 15:33
你应该不会不知道equals和==的区别吧 a和b引用的地址不同
作者:
张开开
时间:
2012-3-2 15:42
== 和 equals 的用法你要清楚。==是比较的对象在内存中的地址,而equals是比较对象的内容是否相同,你所写的a和b指向的不是同一个对象,即便其值相同,对象地址也不同。
作者:
沈样
时间:
2012-3-2 15:48
找了半天或许以上解释可以解释这个问题:
字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
作者:
沈样
时间:
2012-3-2 15:50
这就可以解释
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b));//返回是false
String x = "ab";
String y = "a" +"b";
System.out.println((a == b));//返回是true
一个小问题拿出来跟大家分享一下
作者:
李成航
时间:
2012-3-2 16:28
“==”等号比较的是引用地址,你的两个string是不同的对象地址,当然返回false。
equals比较的是对象的内容是否相同,显然你那两个内容是相同的,若用equals判断将会返回true。
作者:
陈建凡
时间:
2012-3-2 16:58
本帖最后由 陈建凡 于 2012-3-2 17:04 编辑
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b));//返回是false
String a="ab" 和String a=new String();是一样的效果,都是new 产生了 新的对象,新的对象分配的内存肯定不一样,在String中
使用“+”拼接字符串时会生成新的String对象,“==”比较是两个是不是同一对象,所以会是 false,如果 是比较相等的话。使用equals。来比较它们的大小。
但是有一个比较有趣的问题
代码
String str3="chenjianfan";
String str4="chenjianfan";
System.out.println(str3==str4);
System.out.println(str3.equals(str4));、
这两个输出的结果都是 true; 有点矛盾咯。这个是有关于是”字符串池“的问题,这个我看别的视频看到的,跟大家分享下。
String str3="chenjianfan";(采用字面值方式赋值)
1)首先会在 String Pool(“字符串池”)查找有没有“chenjianfan”这个字符串对象,如果没有有,则在String Pool中再去创建一个“chenjianfan”字符串对象,然后将在String Pool中的这个“chenjianfan”字符串对象的地址返回,赋给引用变量str3,这样str3就会指向String Pool中的这个“chenjianfan”字符串对象
2)如果有的话,不会在String Pool中再创建这个字符串对象,直接把存在的这个“chenjianfan”字符串对象的地址赋给Str3.
所以String str3="chenjianfan"时,已经在String Pool中创建了“chenjianfan”字符串对象,当String str4="chenjianfan"时,在StringPool中找到了这个对象,直接把这个字符串对象的地址,赋给str4.!所以“==”和equals()都是true。
作者:
黄业凌
时间:
2012-3-2 17:32
1."=="用于标识标识相等的意思
2.比较基本数据类型的时候,通过比较它们实际的值来判断是否相同
3.比较引用类型的时候,比较两个引用的地址是否相等(也就是是否指向同一对象)
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println((a == b));//返回是false
a 在内存中开辟了一块空间 ab
b 在内存中开辟了一块空间 a,
两者对指向的内存地址不是同一对象.
作者:
陈斌
时间:
2012-3-2 18:34
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2