• java中的equals 与 ==


    总结来说:

      1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

        如果作用于引用类型的变量,则比较的是所指向的对象的地址

      2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

        诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

    简单来说,如果是普通基础数据类型,判断是否想等,就用==比较;

    如果是引用数据类型,== 和 equals方法比较的都是引用对象的地址,每个实例化的对象在内存中都是单独存放的,及时实例化两个对象属性都相同,也是不同的内存空间,所以会返回false;

    但是,String的equals比较的是字符串内容,因为String中重写了euquals方法。

    字符串还有一点需要注意:

    String s1 ="abc";
    String s2 = "abc";
    System.out.println(s1==s2); //输出 true,因为这里从字符串池里取,没有新创建对象
            
    String s3 = new String("abc");
    String s4 = new String("abc");
    System.out.println(s3==s4);  //输出 fasel,因为创建了两个不同内存空间的对象

    System.out.println(s1.equals(s2));System.out.println(s3.equals(s4) ; //输出都是 true,因为String已重写equals方法,比较的是内容
     

    Java中怎样判断两个对象是否相等呢?

      对象必须同时重写 hashCode() 和 equasl() 方法,自定义比较方式。例如:

      

     1 import java.util.*;
     2 
     3 /**
     4  * Set测试用例
     5  */
     6     class Student {
     7     private String name;
     8     private String number;
     9 
    10     Student(String name, String number) {
    11         this.name = name;
    12         this.number = number;
    13     }
    14 
    15     /**
    16      * 重载equals()和hashcode()
    17      */
    18     @Override
    19     public boolean equals(Object obj) {
    20         if(obj == null) {
    21             return false;
    22         }
    23         if(getClass() != obj.getClass()) {
    24             return false;
    25         }
    26         final Student other = (Student) obj;
    27         return true;
    28     }
    29 
    30     @Override
    31     public int hashCode() {
    32         int hash = 5;
    33         hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0);
    34         hash = 13 * hash + (this.number != null ? this.number.hashCode() : 0);
    35         return hash;
    36     }
    37 
    38 
    39     @Override
    40     public String toString() {
    41         return String.format("(%s, %s)", name, number);
    42     }
    43 }
    44 
    45     public class Students {
    46         public static void main(String[] args) {
    47             Set set = new HashSet();
    48             set.add(new Student("Tom", "001"));
    49             set.add(new Student("Sam", "002"));
    50             set.add(new Student("Tom", "001"));
    51             System.out.println(set); //此时set中只有两个元素:[(Tom,001),(Sam,002)]
    52         }
    53     }

    其他:

    对象的toString方法,如果对象中没有重写toString方法,则返回的是类名+@+哈希码,例如:System.out.println(Studnet);  将打印出: Student@6e1408

  • 相关阅读:
    wc
    1.11考试
    diff
    C++11新利器
    vimdiff
    [学习笔记]多项式
    rev
    [AH2017/HNOI2017]礼物
    tr
    bzoj2555: SubString
  • 原文地址:https://www.cnblogs.com/crazytrip/p/7154162.html
Copyright © 2020-2023  润新知