5. == 和 equals 的区别

== 和 equals

  1. == 比较基本的数据类型,比较的是值 ; 比较引用类型 : 比较引用指向的值(地址)
String s1 = new String("xsj");
String s2 = new String("xsj");
//指针指向不同的堆内存 false
System.out.println(s1 == s2);
String s3 = "xsj";
String s4 = "xsj";
//指针指向常量池  true
System.out.println(s3 == s4);
//s1指向堆内存,s3指向常量池  false
System.out.println(s1 == s3);
String s5 = "xsjxsj";
String s6 = s3 + s4;
//字符串是一个不可变的对象,字符串相加时会通过new StringBuilder()创建新的对象 false
System.out.println(s5 == s6);
final String s7 = "xsj";
final String s8 = "xsj";
String s9 = s7 + s8;
//final修饰变成了常量,常量运算编译器会再转一个常量  true
System.out.println(s5 == s9);
final String s10 = s3 + s4;
//s3和s4任然是变量,final只是影响s10的特性 false
System.out.println(s5 == s10);
  1. equals 默认比较的也是地址,因为这个方法的最初定义在Object上,默认的实现就是比较地址,如果是自定义的类,如果需要比较的是内容,那么就要像String,重写equals方法
import java.util.Objects;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Student s1 = new Student(1);
        Student s2 = new Student(1);
        //如果没有重写equals方法,则比较的是地址,返回false
        System.out.println(s1.equals(s2));
    }
}

class Student {
    
    
    int val;

    public Student(int val) {
    
    
        this.val = val;
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return val == student.val;
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(val);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/115335891