".equals"와 "=="의 차이점은 무엇입니까? [복제하다
문제
이 질문은 이미 여기에 답이 있습니다.
나는 오늘 강사를 바꾸었고 그는 나에게 이상한 코드를 사용하여 언급했다. (그는 사용하는 것이 낫다고 말했다 .equals
그리고 내가 왜 그런지 물었을 때, 그는 "그랬기 때문에!"라고 대답했습니다.
예를 들어 다음과 같습니다.
if (o1.equals(o2))
{
System.out.println("Both integer objects are the same");
}
내가 익숙한 대신 :
if (o1 == o2)
{
System.out.println("Both integer objects are the same");
}
둘의 차이점은 무엇입니까? 그리고 왜 그의 길은 (사용 .equals
) 더 나은?
이것을 찾았습니다 빠른 검색에서는 그 대답을 실제로 이해할 수 없습니다.
해결책
자바에서 ==
항상 두 가지 참고 문헌을 비교합니다.
그러나, 그 equals
메소드가 재정의 될 수 있으므로 두 개의 별개의 객체가 여전히 동일 할 수 있습니다.
예를 들어:
String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
또한 두 사람이 동등하다는 것을 알고 있어야합니다. 문자열 상수 (주로 문자열 리터럴뿐만 아니라 연결을 통한 문자열 상수 조합)는 동일한 문자열을 참조합니다. 예를 들어:
String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!
여기 x
그리고 y
동일한 문자열에 대한 참조입니다 y
컴파일 타임 상수입니다 "hello"
.
다른 팁
== 연산자는 객체가 동일한지 비교합니다. 사례. equals () oerator는 비교합니다 물체의 상태 (예 : 모든 속성이 동일하다면). 객체가 다른 물체와 동일 할 때 자신을 정의하기 위해 equals () 메소드를 무시할 수도 있습니다.
당신과 내가 각각 은행에 걸어 가면, 각각은 새로운 계정을 열고 각각은 $ 100를 입금합니다.
myAccount.equals(yourAccount)
~이다true
그들은 가지고 있기 때문에 같은 값, 하지만myAccount == yourAccount
~이다false
그들은 아니기 때문에 같은 계정.
(적절한 정의를 가정합니다 Account
물론 수업. ;-)
==는 연산자입니다. Equals는 객체 클래스에 정의 된 메소드입니다
== 두 객체가 메모리에 동일한 주소를 가지고 있는지 확인하고 원시의 경우 동일한 값이 있는지 확인합니다. 다른 손에 equals 메소드는 비교중인 두 객체가 동일한 값을 가지고 있는지 확인합니다 (물론의 방법에 따라 객체에 대해 Equals 메소드가 구현되었습니다. 기본 요소에 동등한 방법을 적용 할 수 없습니다 (a가 원시 A.Equals (someObject)가 허용되지 않지만 someObject.equals (a)가 허용됨).
== 운영자는 두 개의 객체 참조를 비교하여 동일한 인스턴스를 참조하는지 확인합니다. 이것은 또한 성공적인 경기에서 True를 반환합니다.
public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2) //true
test(s1 == s3) //false
}}
위의 예 ==는 참조 비교입니다. 즉, 두 개체는 동일한 메모리 위치를 가리 킵니다.
String Equals ()는 객체의 값 비교로 평가됩니다.
public class EqualsExample1{
public static void main(String args[]){
String s = "Hell";
String s1 =new string( "Hello");
String s2 =new string( "Hello");
s1.equals(s2); //true
s.equals(s1) ; //false
}}
위의 예는 문자열의 내용을 비교합니다. 문자열이 일치하면 true가 반환되고 그렇지 않으면 false를 반환합니다.
자바에서 “==” 연산자는 2 개의 객체를 비교하는 데 사용되며 객체가 메모리의 동일한 위치를 참조하는지 확인합니다. 전:
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1 == obj2)
System.out.println("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
문자열이 동일한 정확한 문자 ( "xyz")를 가지고 있지만 위의 코드는 실제로 출력됩니다. OBJ1 == OBJ2는 False입니다.
Java 문자열 클래스는 실제로 기본값을 무시합니다 equals () 객체 클래스에서 구현 - 메모리의 위치가 아니라 문자열의 값 만 확인하도록 메소드를 무시합니다. 즉, 2 개의 문자열 객체를 비교하기 위해 equals () 메소드를 호출하면 실제 문자 순서가 동일하다면 두 객체 모두 동일하게 간주됩니다.
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1.equals(obj2))
System.out.printlln("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
이 코드는 다음을 출력합니다.
OBJ1 == OBJ2는 사실입니다
public static void main(String[] args){
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
////
System.out.println(s1 == s2);
System.out.println("-----------------------------");
String s3 = "hello";
String s4 = "hello";
System.out.println(s3.equals(s4));
////
System.out.println(s3 == s4);
}
여기이 코드에서 u는 '=='및 '.equals'를 모두 캠페인 할 수 있습니다.
여기 .equals는 참조 객체를 비교하는 데 사용되며 '=='는 객체 상태를 비교하는 데 사용됩니다.
(1) == 프리미티브와 객체 유형 모두에 적용될 수 있지만 equals () 메소드는 객체 유형에만 적용될 수 있습니다.
(2) == 컨텐츠 비교를 위해 재정의 할 수는 없지만 컨텐츠 비교를 위해 동등한 방법을 재정의 할 수 있습니다 (예 : 문자열 클래스, 래퍼 클래스, 수집 클래스).
(3) == 이기종 유형을 신청하려고 할 때 비교할 수없는 유형 오류가 발생합니다.
그만큼 equals( )
방법과 ==
운영자는 두 가지 다른 작업을 수행합니다. 그만큼 equals( )
메소드 a 내부의 문자를 비교합니다 String
물체. 그만큼 ==
연산자는 두 개의 객체 참조를 비교하여 동일한 인스턴스를 참조하는지 여부를 확인합니다. 다음 프로그램은 두 개의 다른 문자열 객체에 동일한 문자를 포함 할 수있는 방법을 보여 주지만 이러한 객체에 대한 참조는 동일하게 비교하지 않습니다.
// equals() vs ==
class EqualsNotEqualTo {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = new String(s1);
System.out.println(s1 + " equals " + s2 + " -> " +
s1.equals(s2));
System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
}
}
변수 s1
작성자가 생성 한 문자열 인스턴스를 나타냅니다 “Hello”
. 에 의해 언급 된 대상s2
함께 만들어졌습니다 s1
이니셜 라이저로. 따라서 두 문자열 객체의 내용은 동일하지만 별개의 객체입니다. 이것은 그것을 의미합니다 s1
그리고 s2
동일한 개체를 언급하지 않으므로 ==
, 여기에 이전 예제의 출력에 의해 표시되는 것처럼 :
Hello equals Hello -> true
Hello == Hello -> false
두 피연산자가 동일한 객체에 속하면 "=="연산자가 true를 반환하지만 단일 객체 다중 값을 할당 할 수 없으므로 true를 반환 할 때 true를 반환한다고 가정 해 봅시다.
public static void main(String [] args){
String s1 = "Hello";
String s1 = "Hello"; // This is not possible to assign multiple values to single object
if(s1 == s1){
// Now this retruns true
}
}
이제 이것이 실제로 말하면, 그것이 일어나지 않으면 이것이 == 인 이유는 기능을 비교합니다 ....
다음은 문제에 대한 간단한 해석입니다.
== (동일) 산술 표현을 평가하는 데 사용
반면
string을 비교하는 데 사용되는 equals () 메소드
따라서 문자열 관련 작업에 대한 숫자 작업 및 equals () 메소드의 경우 ==를 사용하는 것이 좋습니다. 따라서 객체를 비교하기 위해 equals () 메소드가 올바른 선택입니다.