黑马程序员技术交流社区
标题:
请看下下面代码的疑问之处
[打印本页]
作者:
dongyangzhang
时间:
2013-4-17 13:34
标题:
请看下下面代码的疑问之处
本帖最后由 dongyangzhang 于 2013-4-17 17:50 编辑
<p>class A{
public static void main(String []agrs){</p><p> String a="a";
String b="b";
String c=a+b;
String d="a"+"b";
System.out.println(c=="ab");//运行结果为false
System.out.print(d=="ab");//运行结果为true
}
}</p><p> </p>
复制代码
打印c和d的时候在控制台同样输出的都是ab,为什么判断的时候一个为false一个为true呢?想知道其中的原理,请帮助我分析下,谢谢
作者:
偏執旳、靑春
时间:
2013-4-17 14:09
在编程中,通常比较两个字符串是否相同的表达式是“==”,但在Java中不能这么写。在Java中,如果要比较a字符串是否等于b字符串,需要这么写:
if(a.equals(b)){
}
返回true或false
equals()方法
String的equals()方法用于比较两个字符串是否相等。由于字符串是对象类型,所以不能简单的用“==”(双等号)判断两个字符串是否相等,而使用equals()方法比较两个对象的内容。
语法:
boolean equals(String str)
str:要作比较的字符串对象。
返回:如果和String相等则为true;否则为false。
例如字符串“abc”和一个新的字符串“abc”比较的结果为“true”,因为它们内容相同。
equals()方法比较的是对象的内容(区分字母的大小写格式),但是如果使用“==”双等号操作符比较两个对象时,比较的是两个对象的内存地址,所以它们不相等(即使内容相同,不同对象的内存地址也是不相同的)。
楼主到底比较内存地址还是内容。
c的内存地址一定不会和“ab”一样的。
作者:
JavaUtil
时间:
2013-4-17 15:21
本帖最后由 JavaUtil 于 2013-4-17 15:24 编辑
字符串处理比较特殊,如果你是new对象的的形势传值(String a=new String("a")),
他会先为变量a分配一块内存空间,然后传给你右面的内存地址;
如果你是用引号传值(String a="a"),他会先把“a”放在一个字符串池中保存,方便以后调用,然后再负值给你。
所以在你的程序中操作变量a和操作字符串a的本质是不同的(虽然显示字符串效果相同),得到的答案也就不同了。
一般字符串的比较都用它的equals方法,因为前辈们帮我们解决了这些问题。
作者:
殇_心。
时间:
2013-4-17 15:47
因为
String d = "a" + "b" = “ab”;
运行之后,把ab存入到常量池里面,以后出现相同的字符串就调用。
和对象"ab"比较的时候,这里就会调用常量池里面的“ab”,所以返回是true;
String c = a+b;
c后面的字符串不能在编译时期就确定下来。
不能引用常量池里面的字符串。
和“ab”比较的时候 一个在栈内存,一个常量池中,地址不一样,所以返还false。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2