黑马程序员技术交流社区
标题:
equals()和“==”有什么区别
[打印本页]
作者:
万坤
时间:
2014-5-5 14:05
标题:
equals()和“==”有什么区别
本帖最后由 万坤 于 2014-5-6 10:03 编辑
String a=“aaa”;String b=“aaa”;
在比较时 if(a==b)结果是 flash;
if( a.equals(b))结果是true;
能仔细解释一下这是为什么吗?
作者:
神马
时间:
2014-5-5 14:21
本帖最后由 神马 于 2014-5-5 14:29 编辑
a、b都是引用数据类型,本身的值是哈希地址值,指向的是对应的对象,你这就是相应的字符串。String的equals方法比较的就是字符串内容。equals方法在Object中就存在,String类中重写了这个方法。而且你的问题有错:
String a="aaa";
String b="aaa";
System.out.print(a==b); //结果应该是true
因为字符串常量池的存在,当你String b="aaa";的时候,因为常量池中存在“aaa”,会让b也指向a所指向的“aaa”,所以两者的哈希地址值相等。如果:
String a="aaa";
String b=new String("aaa");
System.out.print(a==b); //结果应该是false
因为new的存在,不管常量池中有没有“aaa”,都会在堆内存中新建一个“aaa”,所以a、b是两个不同的地址值。
作者:
邵景伦
时间:
2014-5-5 15:00
"=="一般比较的是基本数据类型的值和引用类型的对象是否相等,引用类型指向的是对象堆中的变量,实质就是堆中对象的地址储存在栈中。
String a=“aaa”;String b=“aaa”;
if(a==b)结果是false。
"equals"比较的是两个对象是否相等(即对象里对应的属性是否对应的相等),而在字符串中String类中复写了equals方法,比较两个字符串的内容是否相等。
作者:
heima_xyu
时间:
2014-5-5 16:23
1.“==”用于基本数据类型时,是判断值是否相等;
而用于判断引用数据类型时,则是比较HashCode值,即该对象在内存中的地址值是否相等
而你说的String a=“aaa”;String b=“aaa”;
打印 System.out.print(a==b); 应该为true。 建立“aaa”字符串时,内存会分配字符串常量池,所以String a和String b指向的都是同一个“aaa”.应该相等
2.equals方法是Object类的方法,String类也只是复写了equals方法。而String的equals()判断字符串是否相同,a和b的值都是“aaa”.因此为true
作者:
大恶魔先森~
时间:
2014-5-5 16:53
public class StringTest
{
public static void main()
{
String a=“aaa”;
String b=“aaa”;
System.out.print(s1==s2);//为true
System.out.print(s1.equals(s2));//也为true
}
}
你可以在编译器验证下。结果都为true;
首先:String s1="aaa";系统会在常量池中寻找是否存在内容为"aaa"的字符串对象,发现不存在,就建立了指向该字符串对象的
引用变量。当执行String s2="aaa";时,如上所诉,它也会在常量池中寻找是否存在内容为"aaa"的字符串,存在就直接将s2指向该字符串。在内存中只开辟了一个空间。所以(s1==s2)==true;由于字符串String类复写了equals方法,表示比较对象的内容是否相等,所以s1.equals(s2)==true.
复制代码
1,"equals"比较的是两个对象是否相等(即对象里对应的属性是否对应的相等),而在字符串中String类中复写了equals方法,比较两个字符串的内容是否相等。
2."=="一般比较的是基本数据类型的值和引用类型的对象是否相等,引用类型指的是对象的别名指向堆中的变量,实质就是堆中对象的地址储存在栈中。
3,当比较栈中的内容是否相等时用"=="进行比较比较;当比较堆中的内容是否相等时,用equals进行比较。基本数据类型以及引用类型储存在栈中,数组以及new出来的对象储存在堆中。
作者:
千曲生
时间:
2014-5-5 19:12
“==”和“equals()”方法比较字符串时,其比较方法不同。
1)“==”比较两个变量本身的值,即两个对象在内存中的首地址。
2)“equals()”比较字符串中所包含的内容是否相同。
如果按照你所给的话String a="aaa",String b="aaa"的话equals和“==”的效果是一样的为ture:
(原因)equals为ture无可置疑,而a和b仅仅只是串常量,常量的存储地址是一样的!
你的情况1)可能是你对两个中某一个初始化,类似:String a=new String("aaa");String b=new String("aaa"), 导致首地址不同而flase
2)就是你定义的不是object中的,因为object中存在equals语句,像StringBuffer中就不存在!
作者:
姜蕾蕾
时间:
2014-5-5 23:02
验证了一下二楼的说法,程序:
class TestStringEqual
{
public static void main(String[] args)
{
String a = "abc";
String b = "abc";
String c = new String("abc");
System.out.println("a==b结果为:"+(a==b));
System.out.println("a.equal(b)结果为:"+(a.equals(b)));
System.out.println("a==c结果为:"+(a==c));
System.out.println("a.equal(c)结果为:"+(a.equals(c)));
}
}
运行结果为:
D:\>javac TestStringEqual.java
D:\>java TestStringEqual
a==b结果为:true
a.equal(b)结果为:true
a==c结果为:false
a.equal(c)结果为:true
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2