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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ﹎◇waiting﹎ 初级黑马   /  2012-8-1 13:37  /  2269 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:
    明明两个值相等,但是用==比较时确得到 false
    代码:
    if(model.getYxsh()==temp.getYxsh()){
    ```
    }
但是用equals 比较时确得到 ture
    代码:
    if(model.getYxsh()equals temp.getYxsh()){
    ```
    }
这是为什么,什么时候可以使用“==”,什么时候使用“equals ”

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 鼓励一下

查看全部评分

9 个回复

倒序浏览
本帖最后由 杨锦 于 2012-8-1 13:45 编辑

在我们使用运算符“==”来比较两个对象时,其实比较的是两个对象的地址。如果运算符两边是同一个对象,地址相同则会等到true,只要是不同对象地址就会不同,返回false。
我们在编程过程中经常会比较两个对象的属性,这时我们就无法用“==”来比较了,因为即使两个对象所有属性都相同但不是同一个对象“==”号比较后也会得到false。这种情况下我们一般会定义一个equals()方法来进行比较。

楼主看看下面这个例子

class EqualsDemo {
        
        public static void main(String[] args) {
                              
                     
                Person p1 = new Person("张三", 19);
                Person p2 = new Person("张三", 19);
                System.out.println(p1);                                        // 打印toString返回值
                System.out.println(p2);
                System.out.println(p1 == p2);                        // 比较是否地址相同
                System.out.println(p1.equals(p2));                // 使用自定义的equals比较属性是否完全相同
        }        
        
}

class Person {
        private String name;
        private int age;
        
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }        
        
        public String toString() {               
                return "Person(" + name + ", " + age + ")";        
        }
        
        @Override
        public boolean equals(Object obj) {        
                if (this == obj)                                        // 地址相同, 代表是同一个对象, 属性肯定相同, 没必要再比较了, 直接返回true
                        return true;
                if (obj == null)                                        // 传入的对象如果为空, 不用比较直接返回false
                        return false;
                if (!(obj instanceof Person))                // 如果obj不是Person类型, 直接返回false
                        return false;
                Person other = (Person)obj;                        // 为了访问name和age, 先将Object类型的实参强转回Person类型
               
                if (this.name == null) {                        // 如果名字一个为null另一个不为null, 返回false
                        if (other.name != null)        
                                return false;
                } else if (!this.name.equals(other.name))        // 如果name不同, 返回false
                        return false;
                if (this.age != other.age)                        // 如果age不同, 返回false
                        return false;
                return true;                                                // 上面如果没有返回, 就代表属性都相同, 返回true
        }
回复 使用道具 举报
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
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的方式是生成不同的对象。每一次生成一个。

所以当产生了不同对象时 哪怕数值相等 用==还是会得出false。
回复 使用道具 举报
尤洋 发表于 2012-8-1 13:53
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用 ...

这个是今天上午我问我朋友一些关于java”==“的问题他给我发了以下问题,
以下java小程序到底是等于,还是不等于?


    代码片段1
  
Java代码
public static void main(final String[] args) {
     Integer a = new Integer(100);
     Integer b = 100;
     System.out.println(a == b);  
}
  
  
  这段代码的输出是什么?相信很多人都会很容易的猜到:false,因为a、b两个对象的地址不同,用“==”比较时是false。恭喜你,答对了。
  
  
  
再看下面的一段代码:
  
  
  
    代码片段2
  
Java代码
public static void main(final String[] args) {
     Integer a = 100;
     Integer b = 100;
     System.out.println(a == b);  
}
  
  
你可能会回答,这没什么不一样啊,所以还是false。很遗憾,如果你执行上面的一段代码,结果是true。
  
  
  
上面的代码可能让你有些意外,那好吧,再看看下面的这段代码:
  
  
  
     代码片段3
  
Java代码
public static void main(final String[] args) {
     Integer a = 156;
     Integer b = 156;
     System.out.println(a == b);  
}
  结果是true吗?很遗憾,如果你执行上面的一段代码,结果是false。
  
  
  
  感到吃惊吗?那最后再看下面的一段代码:
  
  
  
     代码片段4
  
Java代码
public static void main(final String[] args) {
     Integer a = Integer.valueOf(100);
     Integer b = 100;
     System.out.println(a == b);  
}
最后的结果,可能你已经猜到了,是true。

这里为什么会出现这样的答案啊?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 尤洋 于 2012-8-1 14:31 编辑
﹎◇waiting﹎ 发表于 2012-8-1 14:04
这个是今天上午我问我朋友一些关于java”==“的问题他给我发了以下问题,
以下java小程序到底是等于,还是 ...

代码片段1 是false 因为new了新的对象
代码片段2 java为了提高效率,初始化了-128--127之间的整数对象,所以在赋值在这个范围内都是同一个对象。引用是指向同一个对象 自然是true。
代码片段3看起来和2一样,为什么是false呢,原因在于数值150超出了[-128,127]的区间范围了,所以是false
代码片段4 最简单,其实他与代码片段2的写法等效。相当于代码2中interer a=100 在编译后的情况

代码太多了 看起来会有点习惯性眼花
   要是有点精神奖励就好了{:soso_e102:}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当是基本类型时,如浮点型,整型,字符,相比较时:两个变量相比较,==,equals是比较的他们的内容,这里一般不用equals,
当是对象时,比如String时,==比较的是变量的引用是否相等,而equals比较的是变量引用地址的中该地址中的内容是否相等。,
所以基本类型比较用==,对象比较用equals();
依你得代码看,楼主这里返回的是个字符串,所以得用equals()比较,希望楼主理解
回复 使用道具 举报
值类型是存储在内存中的堆栈,而引用类型的变量在堆栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
“==”操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即堆栈中的内容是否相同。
“equals”操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
“==”比较的是2个对象的地址,而“equals”比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;
回复 使用道具 举报
这位同学,请改一下名字,要不然没有技术分可加了,,这里是版规http://bbs.itheima.com/thread-21055-1-1.html

改名字的地址http://bbs.itheima.com/thread-19719-1-1.html
回复 使用道具 举报
"问题已经解决"
谢谢各位!
回复 使用道具 举报
田向向 发表于 2012-8-1 22:44
这位同学,请改一下名字,要不然没有技术分可加了,,这里是版规http://bbs.itheima.com/thread-21055-1-1. ...

谢谢提醒啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马