equals와 ==의 차이를 간단히 말하다

3620 단어 equals
이전에 자바를 배울 때 equals와 ==는 별 차이가 없다고 생각했는데 당연히 그들이 어떤 차이가 있는지 몰랐지?그때 수업을 들은 후에 스스로 자료를 찾아서 그들 둘에 대해 조금 알게 되었다. 다음은 내가 equals와 ==의 차이에 대한 견해이다.
1.==에는 두 가지 용법이 있다. 첫째, 8가지 기본 유형에 사용할 때 두 변수의 값이 같은지 아닌지를 판단하고, 같을 때true를 되돌려주고, 같지 않을 때false를 되돌려준다.둘째, 인용 유형에 사용할 때 두 대상의 내용이 같은지 아닌지를 판단하는 것이 아니라 두 대상이 가리키는 메모리 주소가 같은지 판단하는 것이고, 같을 때true를 되돌려주고, 같지 않을 때false를 되돌려준다.
2. equals는 인용 유형에만 사용할 수 있고 기본 유형에 사용할 수 없다. 왜냐하면 equals는 방법이기 때문에 기본 유형은 equals 방법이 없기 때문이다. equals는 대상이 가리키는 내용이 같은지 비교하는 것이다. 같으면true로 돌아가고 다르면false로 돌아간다.
3. equals는 방법이고 ==는 연산자이다. 하나의 클래스가 equals 방법을 다시 쓰지 않을 때 기본적으로 object의 equals 방법이고 Object의 equals 방법은 사실 ==로 판단한다.
먼저 코드를 살펴보겠습니다.
public class A{
publci static void main(String [] args){
int a=15;
int b=15;
System.out.println("a b "+(a==b);}
}

이것은 비교적 간단한 코드이지만 만약에 내가 equals로 비교할 때 오류가 발생할 수 있다. 왜냐하면 equals 방법은 기본 데이터 형식에 사용할 수 없기 때문이다. 만약에 억지로 equals 방법을 사용하려면 정형만 봉인할 수 있기 때문이다.
		Integer a1=1;
		Integer b1=1;
		Integer a2=new Integer(1);
		Integer b2=new Integer(1);
		System.out.println("a1 b1 == , ?"+(a1==b1));
		System.out.println("a1 b1 equals , ?"+a1.equals(b1));
		System.out.println("a2 b2 == , ?"+(a2==b2));
		System.out.println("a2 b2 equals , ?"+a2.equals(b2));
		System.out.println("a1 a2 == , ?"+(a1==a2));
		System.out.println("a1 a2 equals , ?"+a1.equals(a2));
		

 
이렇게 하면 잘못 보고되지 않을 것이다. 운행의 결과는 다음과 같다.
a1과 b1을 ==로 비교할 때 같습니까?truea1과 b1을 equals로 비교할 때 같습니까?truea2와 b2를 ==로 비교할 때 같습니까?falsea2와 b2를 equals로 비교할 때 같습니까?truea1과 a2를 ==로 비교할 때 같습니까?falsea1과 a2를 equals로 비교했을 때 같습니까?true 실행 결과는 String 유형과 같습니다. 잠시 후 String의 실행 결과만 분석하겠습니다.
4. String 클래스에서 equals와 ==의 차이점에 대해 이야기
먼저 코드를 살펴보십시오.
		String s1="abc";
		String s2="abc";
		String s3=new String("abc");
		String s4=new String("abc");
		String s5="de";
		String s6="abcde";
		String s7=s1+s5;

우리가 equals 방법이든 ==이든 s1과 s2를 비교할 때 출력하는 것은true이다. 그러나 우리가 주의해야 할 것은 우리가 이렇게 쓰면 시스템이다.out.println ("s1과 s2는 같습니까?"+s1==s2), 이렇게 출력된 답안은false이다. + 연산자의 우선순위가 ==보다 높기 때문에 s1은 먼저 앞의 문자열에 추가한 다음에 s2와 비교하면 답안은false가 될 것이다. 우리는 나중에 프로그램을 쓸 때 반드시 주의해야 한다.
s1과 s2를 비교할 때 구체적인 절차는 다음과 같다. 먼저 s1의 abc를 문자열 탱크에 넣은 다음에 s2는 문자열 탱크에서 이와 같은 문자열이 있는지 찾고 abc를 찾으면 그 문자열을 문자열 탱크에 넣지 않아도 된다. 문자열 탱크의 문자는 자원 공유에 도달하고 공간을 절약할 수 있다.
s3과 s4를 ==로 비교할 때 되돌아오는 값은false이다. 이것은 두 개의 서로 다른 대상이기 때문에 그들이 만들 때 메모리 주소가 틀림없이 다르다. ==비교한 것은 바로 두 대상의 메모리 주소가 같은지 여부이다. 그러므로 되돌아오는 값은false이다. equals로 비교할 때 두 개의 값이 같은지 판단하는 것이다. 프로그램에서 알 수 있듯이 두 사람의 내용이 같기 때문에true로 되돌아간다.
s6과 s7:s6을 비교하면 문자열 상수로 문자열 탱크에 놓이지만 s7은 문자열 탱크에 놓이지 않기 때문에 s6와 s7을 ==로 비교할 때false로 되돌아오고 equals로 비교하면true로 되돌아간다. 그러나 만약에 내가 변수를 성명한다면 Strings8="abc"+ "de".이때 s6와 s8을 ==로 비교했을 때 되돌아오는 것은true이고 equals 방법으로 되돌아오는 것도 틀림없이true이다.이것은 s8이 지금도 문자열 탱크에 놓여 있기 때문에 그들 두 사람의 주소는 같다.
만약에 ==과 equals가 인용 유형에 사용된다면 ==로 판단할 때 ture로 되돌아온다면 equals로 판단해서 되돌아온 것도true가 분명하지만 반대로 반드시 성립된 것은 아니다. 내용이 같고 그들의 주소도 같지 않기 때문에 뚜렷하다. 위의 s3과 s4는 이 관점을 증명했다.그러나 이런 문장을 더하면 달라진다. s3=s4, 이때 어떤 방법으로 판단하든지 되돌아오는 값은ture이다. s4를 s3에 부여하는 것이기 때문에 그들 둘은 같은 대상을 가리킨다.
5. 물론 모든 클래스에 자신의 equals 방법이 있다. 대기열과 맵의 속성을 비교할 때 ==로 비교할 수 없고 equals 방법으로만 비교할 수 있다. 이런 비교는 앞에서 말했듯이 String류와 차이가 많지 않다. 그들이 각자 쓴 equals 방법을 보면 된다.
6. 한마디로 기억하자면 ===기본 데이터 형식의 값이 같은지 인용 유형에서 대상의 메모리 주소가 같은지 비교하는 것이고 equals 방법은 대상의 내용이 같은지 판단하는 것이다

좋은 웹페이지 즐겨찾기