A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风轻扬 中级黑马   /  2014-9-4 20:57  /  1353 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这两天在学习做练习的时候用到数值的比对,例如:
String a="123";
String b=new String ("123");
System.out.prinlt("a=b"+(a=b));//结果是:false
System.out.prinlt("a=b"+(a.equals(b));//结果是:true
不知道为什么,有没有同学帮我解答一下?

8 个回复

正序浏览
==为比较运算符,equals是方法。==如果是基本数据类型,比较的是具体数值。equals是引用数据类型,比较的是实际的内存地址。 重写equas方法 使他比较的实际是对象中具体的值 所以后面的是对的  前面的对象数量都不相同
回复 使用道具 举报
如果在Object类中  ==  与equals 没有区别  都是对于内存地址而言的  但是所有的类都是集成自Object  所有大部分类都重写了Equals方法  所以相应的重写hashcode   hashcode是识别内存的标示  因为重写了 所以就不能以equals确定地址引用的关系  只能判断内容  若是判断地址 只能用==
回复 使用道具 举报
对于字符串 ==比较的是地址是否相同 而.equals是比较字符串的值是否相同
回复 使用道具 举报
==和equals都是比较的,而前者是运算符,后者则是一个方法,基本数据类型和引用数据类型都可以使用运算符==,而只有引用类型数据才可以使用equals,下面具体介绍一下两者的用法以及区别. ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身
占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。 equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码: String a=new String("heima"); String b=new String("heima"); 两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。 equals本身是一个方法,它是根类Object里边的方法,所有类和接口都直接或者间接继承自Object,所以在所有的类中都有equals()方法,都是继承来的 在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。 如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下: boolean equals(Object o){ return this==o; } 这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。 代码,试一下equals和==的区别/* * ==和equals的用法以及区别 * */
public class TestEqulas{
public static void main(String[] args) {
String s = new String("heima");
String s2 = new String("heima");
System.out.println(s.equals(s2));//输出true,因为String类已经重写了equalsSystem.out.println(s == s2);
//输出false,因为两者的地址是不同的
//创建三个动物对象
//a1和a2name和age都相同
Animal a1 = new Animal("Tom",5);
Animal a2 = new Animal("Tom",5);
//先试一下用==比较链各个对象
System.out.println(a1 == a2);
//输出false,两个对象内容相同,但是他们的引用首地址不同
// 首先将自己写的equals方法注释掉,看输出结果是什么
boolean b = a1.equals(a2); System.out.println(b);
//结果为false,证明是调用的继承来的那个equals方法
// 然后我们调用自己已经重写的equals,再看下结果
b = a1.equals(a2);
//现在调用的是已经重写后的方法 System.out.println(b);
//所以打印的是true
}
private String name;
private int age; public Animal(){}
public Animal(String name,int age){
this.name = name; this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
} public int getAge(){
return age;
} //重写了equals方法 public boolean equals(Object o){
//判断两个对象是否为同一个对象,如果是就直接返回true
if (this == o) {
return true;
}
// 再判断另一个对象o是否是null,如果是null就没有必要再比了,肯定不相等,直接返回false
if (o == null) {
return false;
}
// 如果前两个要求都符合,那么再判断对象o是否为Animal的实例,如果对象o是一个Student对象也就直接返回false if (o instanceof Animal) {
// 如果是当前类的实例,那么就强制转换成当前类的实例,再依次比较成员变量是否相等
Animal s = (Animal)o;
// 注意:String类型的成员变量也可以看做是一个String对象,需要用equals比较,而不能用==比较
if (this.getName().equals(s.name) && this.age == s.age) {
return true;
}
}
return false;
}
}
这是总结里面的介绍,你可以看一下。。你这题可以简单理解为b中有2个对象 一个new对象 一个“123”对象  而a中只有一个对象 ==比较的是地址值 而equal比较的是2个对象的内容是否一样

点评

真详细。  发表于 2014-9-4 22:01
回复 使用道具 举报
很老很经典的问题了~
回复 使用道具 举报
枫听月下 发表于 2014-9-4 21:10
==为比较运算符,equals是方法。==如果是基本数据类型,比较的是具体数值。equals是引用数据类型,比较的是 ...

感谢!感谢!同学,好励害啊!
回复 使用道具 举报
==为比较运算符,equals是方法。==如果是基本数据类型,比较的是具体数值。equals是引用数据类型,比较的是实际的内存地址。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马