Java의 == 및 equals () 메소드에 대해 이야기하기

== 연산자

Java에서 두 변수가 같은지 여부를 측정하는 방법에는 두 가지가 있습니다. 첫 번째는 == 연산자를 사용하는 것이고 두 번째는 equals () 메서드를 사용하는 것입니다.

  1. 기본 데이터 유형
    ==를 사용하여 변수가 같은지 여부를 판단합니다. 변수가 4 가지 유형과 8 가지 기본 데이터 유형이고 모두 숫자 유형 인 경우 두 변수의 값이 같으면 true를 반환 할 수 있습니다.
public class Test {
    
    
    public static void main(String[] args) {
    
    
        char a='A';
        int b =65;
        double c=65.0d;
        System.out.println(a==b);//end=true
        System.out.println(b==c);//end=true
        System.out.println(a==c);//end=true
    }

}

위의 코드에서 문자 a의 ASCII 코드 값은 65이므로 == 연산자를 사용하여 abc의 세 변수를 판단하여 참이됩니다.

  1. 참조 유형

참조 유형 변수의 경우 두 변수가 동일한 유형이거나 상위-하위 관계를 가질 때만 사용할 수 있습니다. 그렇지 않으면 오류가보고됩니다. 두 참조 유형 변수가 == 연산자를 사용하는 경우 동일한 객체를 가리키는 경우에만 true를 반환합니다.

 public static void main(String[] args) {
    
    
    String a=new String("abc");
    String b=new String("abc");
        System.out.println(a==b);//end=false
}

위의 프로그램에서 변수 a와 변수 b의 값은 모두 abc이지만 a와 b의 참조가 다르므로 false가 반환됩니다.

문자열 상수 풀

초보자를 위해 String에는 매우 혼란스러운 곳이 많이 있습니다. "abc"와 new String ( "abc")의 차이점은 무엇입니까? 이 문제를 해결하려면 Java 문자열 상수 풀 메커니즘을 이해해야합니다. 문자열 상수 풀
의 위치
문자열 상수 풀은 메소드 영역에 위치합니다. 문자열을 생성 할 때 먼저 문자열이 상수 풀에 존재하는지 확인합니다. 문자열이 있으면 문자열에 대한 참조를 직접 반환합니다. 존재하지 않으면 문자열 상수에 있습니다. 풀에 문자열을 만들고 참조를 반환합니다. JVM 상수 풀은 동일한 문자열의 직접 수량이 하나뿐임을 보장하며 여러 사본을 생성하지 않습니다.

   String a="我爱学习";
   String b="我爱"+"学习";
   String c="学习";
   final String d="学习";
   String e="我爱"+c;
   String f="我爱"+d;
   System.out.println(a==b);//end=true,因为b在编译阶段可以确定下来,
   //因此b直接返回字符串常量池中的引用,所以相等。
   System.out.println(a==e);//变量e="我爱"+c;变量c在编译时不能确定下来,因此返回false
   System.out.println(a==f);
  /*end=true 变量d加入final修饰符,final会告诉编译器变量d这个数据不会修改,在编译时直接将变量d替换成"学习",因此编译时变量f可以确定下来为"我爱学习",直接返回字符串常量池的引用,故a==f
  */

new String ( "abc")을 사용할 때 JVM 가상 머신은 먼저 상수 풀에 "abc"가 있는지 확인하고 "abc"문자열이없는 경우 생성 한 다음 String 클래스의 생성자를 호출하여 힙 메모리에 생성합니다. 새 String 개체는 abc 값을 가지며 힙 메모리의 개체에 대한 참조를 반환합니다. 간단히 말해 new String ()을 사용하면 두 개의 객체가 생성됩니다.

String a=new String("abc");
String b="abc";
System.out.println(a==b);//end=false

위 그림에서 변수를 선언 할 때 JVM은 먼저 문자열 상수 풀에 "abc"개체를 만든 다음 힙 메모리에 "abc"개체를 만든 다음 힙 메모리의 개체에 대한 참조를 a로 반환합니다. 변수 b가 선언되면 JVM은 문자열 상수 풀에서 "abc"를 찾고 상수 풀의 개체 참조를 b에 직접 반환합니다. 변수 a와 변수 b의 내용은 동일하지만 하나는 상수 풀에 대한 참조이고 다른 하나는 힙 메모리에 대한 참조입니다. 따라서 a == b의 결과는 거짓입니다.

equals () 메서드

equals () 메소드는 Object 클래스에서 제공하는 인스턴스 메소드로 두 참조 형 변수가 같은지 판단하는 데 사용됩니다. Object 클래스의 소스 코드를 클릭하면 확인할 수 있습니다.이 메소드는 두 객체가 같은지 == 연산자가 차이가 없는지 판단하므로 Object 클래스의이 메서드는 의미가 거의 없으며 실제 개발에서 종종이 메서드를 재정의합니다.

//Object类源码
public boolean equals(Object obj) {
    
    
        return (this == obj);
    }

String 클래스는 equals () 메서드를 재정의합니다. 두 문자열의 시퀀스가 ​​같으면 true를 반환 할 수 있습니다. 따라서 다음 코드의 실행 결과는 모두 사실입니다.

   String a="我爱学习";
   String b="我爱"+"学习";
   String c="学习";
   final String d="学习";
   String e="我爱"+c;
   String f="我爱"+d;
   System.out.println(a.equals(b));//end=true
   System.out.println(a.equals(e));//end=true
   System.out.println(a.equals(f));//end=true

실제 개발에서는 보통 equals 메소드를 다시 작성해야합니다. 메서드를 다시 작성할 때 동일한 조건은 비즈니스 요구 사항에 따라 결정되므로 equals () 메서드의 실현도 비즈니스 요구 사항에 따라 결정됩니다.
일반적으로 재 작성 quals () 당사자는 다음 조건을 충족해야합니다.

  • 반사성 : null이 아닌 참조 값 x에 대해 x.equals (x)는 true를 반환해야합니다.
  • 대칭 : null이 아닌 참조 값 x 및 y에 대해 x.equals (y)는 y.equals (x)가 true를 반환하는 경우에만 true를 반환해야합니다.
  • Transitivity : null이 아닌 참조 값 x, y 및 z의 경우 x.equals (y)가 true를 반환하고 y.equals (z)가 true를 반환하면 x.equals (z)가 true를 반환해야합니다.
  • 일관성 : null이 아닌 참조 값 x 및 y의 경우 x.equals (y)를 여러 번 호출하면 객체의 같음 비교에 사용 된 정보가 수정되지 않은 경우 항상 true를 반환하거나 항상 false를 반환합니다.
  • null이 아닌 참조 값 x의 경우 x.equals (null)은 false를 반환해야합니다.

추천

출처blog.csdn.net/ln82799/article/details/109149947