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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ╰青青子佩ˊゝ 中级黑马   /  2014-4-3 19:40  /  1351 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么会出现下面的情况啊?
  1. String str1 = "hello";
  2.                 String str2 = new String("hello");
  3.                 System.out.println(str1.equals(str2));//这里为true
  4.                 int[] arr1 = {1,2,3};
  5.                 int[] arr2 = {1,2,3};
  6.                 System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
  7.                 Person p1 = new Person("zhangsan");
  8.                 Person p2 = new Person("zhangsan");
  9.                 System.out.println(p1.equals(p2));//这里也为false?
复制代码

10 个回复

正序浏览
http://bbs.itheima.com/thread-112461-1-1.html   里面说的很详细自己去看吧
回复 使用道具 举报
class Person{
        String name = null;
        public Person(String name){
                this.name = name ;
        }
}
public class demo2 {
     public static void main(String args[]){
             String str1 = "hello";
         String str2 = new String("hello");
         System.out.println(str1.equals(str2));//这里为true
         //这里比较的是字符串中的内容,所以是真的
         int[] arr1 = {1,2,3};
         int[] arr2 = {1,2,3};
         System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
         //这里虽然内容相同,但这是数组,比较的则是地址,而比较内容是相对字符串而言的
         Person p1 = new Person("zhangsan");
         Person p2 = new Person("zhangsan");
         System.out.println(p1.equals(p2));//这里也为false?
         //这里则比较的是Person类的对象地址,地址不可能一样
     }
}
回复 使用道具 举报
String str1 = "hello";
                String str2 = new String("hello");
                System.out.println(str1.equals(str2));//这里为true
                int[] arr1 = {1,2,3};
                int[] arr2 = {1,2,3};
                System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
                Person p1 = new Person("zhangsan");
                Person p2 = new Person("zhangsan");
                System.out.println(p1.equals(p2));//这里也为false?
equals方法在各个类的实现的时候需要重写 ;各类实现的方法并不一样;
数组和对象里调用equals时, 比较的是数组的引用和对象引用的哈希码值, 这两组引用均指向不同的对象,所以返回false

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 491138002 于 2014-4-3 21:53 编辑

String str1 = "hello";
                String str2 = new String("hello");
                System.out.println(str1.equals(str2));//这里为true    这里比较的是字符串
                int[] arr1 = {1,2,3};
                int[] arr2 = {1,2,3};
                System.out.println(arr1==arr2);//false    比较的是地址,arr1和arr2指向不同的地址
                Person p1 = new Person("zhangsan");
                Person p2 = new Person("zhangsan");
                System.out.println(p1==p2);//   false    比较的是对象,p1和p2是两个不同的对象
回复 使用道具 举报
Object类中的equals方法比较是否引用同一个类的同一个对象,如果是同一个对象的引用,则返回true,反之则为false,但是String类复写了Object类的equals方法,比较两个对象引用的字符串内容是否相等,所以疑问中的第一个输出语句虽然是两个对象引用,但是因为两个对象的字符串相同,所以返回ture,另外两个因为是两个不同的对象引用,所有返回fals。
回复 使用道具 举报
String字符串,数组, 自定义对象Persont它们都属于Object的子类,object中有equals方法,String重写了object的equals方法,所以两个字符串比较就是看它们的组成是否相同。数组和自定义对象因为没有重写object的equals方法,所以它们比较的是内存中的地址值,比较地址值两个不同的对象就不会相同
回复 使用道具 举报
清风有意 发表于 2014-4-3 19:50
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x ...

equals比较的是内存地址?==比较的内存地址?那equals和==怎么区别啊
回复 使用道具 举报
本帖最后由 2528870651 于 2014-4-3 20:19 编辑
  1. String str1 = "hello";
  2.                 String str2 = new String("hello");
  3.                 System.out.println(str1.equals(str2));//这里为true
  4.                 int[] arr1 = {1,2,3};
  5.                 int[] arr2 = {1,2,3};
  6.                 System.out.println(arr1==arr2);//那为什么这里为false?这不是相等的数组嘛?
  7.                 Person p1 = new Person("zhangsan");
  8.                 Person p2 = new Person("zhangsan");
  9.                 System.out.println(p1==p2);//这里也为false?
复制代码

刚刚试了一下 把equals()换成“==” 结果还是没变,还是“true    false  false”前面的true就不解释了,他是String的equals比较的是内容是否相同。而后面的2个false,说明他们的内存地址都不相同 ,更不要说equals了。object类的 equals其实是比较内存地址,而String类的equals复写了object的equals,赋予了equals新的含义
String的equals是比较的内容是否相等。  

评分

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

查看全部评分

回复 使用道具 举报
equals比较的是地址
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));字符串是最特殊的,因为当创建一个“hello”后,内存中就存在“hello”。当str2建立时,是会先查看内存中是否存在“hello”。如果存在,那么它们地址值相同,所以是ture.
而数组和建立一个新的对象都是每建立一个就会有一个新的地址值。所以是flase;
回复 使用道具 举报
本帖最后由 清风有意 于 2014-4-3 19:52 编辑

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
所以只要引用不是同一个对象,那么就是false而String 类中 的equals复写了Object中的equals方法,所以String 类中的equals比较的是字符串内容是否相等。
所以在做排序的时候,需要复写Object中的equals方法,来确定输入内容的唯一性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马