黑马程序员技术交流社区
标题:
比较的问题
[打印本页]
作者:
冷叙辰
时间:
2013-3-14 11:49
标题:
比较的问题
本帖最后由 冷叙辰 于 2013-3-14 18:51 编辑
public class Student {
private String name;
private int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public static void main(String[] args)
{
Student st1 = new Student("zhang",20);
Student st2 = new Student("zhang",20);
if(st1.equals(st2))
System.out.print("相等");
else
System.out.print("不相等");
}
}
复制代码
为什么输出不相等?
作者:
何仕映
时间:
2013-3-14 11:59
在超类Object中定义的equals(Object obj)方法,实现对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true。即st1和st2指向的是同一个对象,才返回true.在你的代码中,创建了两个对象,在对内存中就就产生了两个对象。st1里面装的是第一对象的内存地址值,st2里面装的是第二个对象的内存地址值。折射到现实生活中,意思就是两个同名同年龄的人,而不是同一个人。两个不同的人,当然不相等啊。
作者:
李洪因
时间:
2013-3-14 12:10
本帖最后由 李洪因 于 2013-3-14 12:11 编辑
老问题,没有复写equals()方法:
public class Student {
private String name;
private int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public static void main(String[] args)
{
Student st1 = new Student("zhang",20);
Student st2 = new Student("zhang",20);
if(st1.equals(st2))
System.out.print("相等");
else
System.out.print("不相等");
}
public boolean equals(Object obj){
if(obj==null) return false;
else
{
if(obj instanceof Student){
Student c=(Student)obj;//强制转换
if(c.name==this.name && c.age==this.age ){
return true;
}
}
}
return false;
}
}
复制代码
作者:
HM张超
时间:
2013-3-14 12:54
有意思!你是两个对象进行比较,你可以分别打出来这两个对象的值!他们是不一样的,两个内存地址。只有字符串的比较用equals。
作者:
yhnan
时间:
2013-3-14 13:14
equals是指示其他某个对象是否与此对象相等。
Student st1 = new Student("zhang",20);
Student st2 = new Student("zhang",20)
st1和st2分别new了student 。 也就是说在堆内存中有两个student他们没别属于st1和st2,有两个地址值
这里的equals就是在比较st1、 st2在堆内存中的地址值。当然就不相等了
作者:
tianyun
时间:
2013-3-14 17:06
任何类都有一个超类object,该类具有判断两对象是否相等方法equals(),规则是,如果两对象通过==判定后相等就相等,而==比较两对象的地址,如果需要更改比较规则,需要重写equals();
作者:
王龙涛
时间:
2013-3-14 17:31
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2