Frudy
7k
2019-06-05 14:49:21 작성 2019-06-05 14:55:51 수정됨
2
1140

List의 equals() 비교


List 비교 질문글을 보고, 평소에 갖고있던 지식 확인해볼겸 실제 코드를 까봤어요.

어쩌다 저도 유용한 경험을했네요.


기존지식)

리스트 두개를 서로 equals()로 비교할 때,

요소로 true, false를 판단하고싶으면

요소의 클래스에서 equals()를 오버라이딩 해야한다.


라는 말을 어디서 본적이있어요.


궁금해서  List의 가장흔한 구현체인 ArrayList의 실제 소스를 보니,

equals()가 없더라구요.




그래서, 바로 위에있는 AbstractList 클래스를 까서보니,

equals()가 있었어요.



여기서 주목해야할점은,

o1.equals(o2); 에요.

그리고 o1의 타입은 E죠.


즉, list의 equals()내부에서, 요소의 equals()로 비교를 하기 때문에,

제네릭 E에 해당하는 실제 클래스에서 equals()를 오버라이딩 해야,

온전히 요소로 비교를 할 수 있겠더라구요.


만약 오버라이딩하지 않았다면,

Object의 equals()를 사용하게 될거구요.


그래서 Object equals()도 한번 까봤어요.


변수에 저장된 객체의 주소값만 비교하네요?


그래서 찾아낸 개념대로 테스트해보니 정확하게 일치했어요.

일단 둘의 주소값이 같으면 true를 반환하구요,


VO클래스에서 equals()를 오버라이딩하면 저기서 true가 나오고,

오버라이딩하지않으면 false가 나와요.


이렇게 순서를 다르게집어넣으니 false가 나와요.


실제 코드에서, 두개의 리스트에서 요소를 순서대로 꺼내서 equals로 비교하기때문에,

aList 1번요소 = bList 1번요소

aList 2번요소 = bList 2번요소

순서와, 실제 그 요소까지 모두 동일해야 true를 반환한다는 사실과 정확히 일치했어요.


실제 코드 까보는것도 재밌네요!

0
  • 댓글 2

  • madlife
    2k
    2019-06-05 14:54:58

    저도 이글보고 하나배웠네요~ 

    좋은글 감사함니다

  • 사는게힘듭니다
    2019-06-05 21:38:02

    컬렉션프레임워크에서는 주소값비교메소드를

    contains 라는 메소드를 사용합니다. 이 매소드는

    equals를 본떠 만든거에요.

  • 로그인을 하시면 댓글을 등록할 수 있습니다.