contains()
메소드 사용 시 주의사항결국 포함 여부도 객체 간 비교를 통해 검사하게 된다.
Integer
, String
같은 건 이미 적절하게 비교가 되도록 equals()
가 override되어 있어서 상관 없는데, 임의로 만든 객체의 경우 적절하게 override해야 한다.
ArrayList
의 contains()
구현을 보면 위와 같다.
내부적으로는 indexOf()
의 반환값으로 포함 여부를 판단한다.
다시 indexOf
의 구현을 보면 위와 같다.
포함 여부를 검사할 객체가 null
이라면 null
의 인덱스를 반환하고,
그게 아니라면 equals()
메소드로 비교한다.
결론적으로 equals()
메소드를 적절하게 override해야 의도한 대로 포함 여부를 검사할 수 있다는 것이다.
List<String> list = new ArrayList<String>();
...
for(int i = 0; i < list.size(); i++) { //방법1
System.out.println(list.get(i));
}
for(String s : list) { //방법2
System.out.println(s);
}
Iterator<String> iter = list.iterator(); //방법3
while(iter.hasNext()) {
System.out.println(iter.next());
}
list.stream() //방법4
.forEach(s -> System.out.println(s));
방법2(for-each 문)이나 방법4(Stream
클래스)가 권장된다.
s -> System.out.println(s)
와 같은 표현을 람다식 Lambda expression이라 한다.
ArrayDeque implements Deque
, Deque extends Queue
ArrayDeque
객체를 생성하자LinkedList
, Stack
보다 ArrayDeque
이 더 빠름LinkedList
는 List
도 구현하고 Queue
도 구현하고 있어서 아무데나 쓸 수 있긴 함List
의 구현 객체로만 쓰인다.List<MyClass> myClassList = new ArrayList<MyClass>();
...
Collections.sort(list);
정수를 정렬하는 방법은 명백하다.
정렬의 기준은 정수의 크기고, 비교하는 방법은 정수의 크기의 대소 비교다.
public class User {
public String name;
public int age;
}
그러나 객체는 그렇지 않다.
위와 같은 사용자 클래스를 어떻게 정렬할까?
이를 위해서 Comparable
인터페이스를 구현함으로써 정렬하는 방법을 제시해야 한다.
Comparable
public class User implements Comparable<User> {
public String name;
public int age;
@Override
public int compareTo(User user) {
if(this.age > user.age) {
return 1;
} else if(this.age < user.age) {
return -1;
} else {
return 0;
}
}
}
<User>
에는 비교 대상의 타입을 쓴다(Generic).public class User implements Comparable<User> {
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(User user) {
if(this.age > user.age) {
return 1;
} else if(this.age < user.age) {
return -1;
} else {
return 0;
}
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
import java.util.*;
public class Example {
public static void main(String[] args) {
List<User> list = new ArrayList<User>(5);
list.add(new User("A", 13));
list.add(new User("B", 93));
list.add(new User("C", 33));
list.add(new User("D", 53));
list.add(new User("E", 73));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
}
정렬 방향을 반대로 하고 싶다면 compareTo
메소드에서 1
과 -1
만 반대로 써주면 된다.
Comparator
public class Example implements Comparator<TARGET> {
@override
public int compare(TARGET target1, TARGET target2) {
return target1 - target2;
}
}
Comparable
과 마찬가지로 양수, 0, 음수 중 하나를 반환하며,target1
과 target2
의 위치를 바꾸지 않는다.Comparable
과 다르다.Collection.sort
의 parameter로 넘겨주는 경우가 많다(어차피 정렬할 때 말고는 안 쓰니까).public class User {
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
import java.util.*;
public class Example {
public static void main(String[] args) {
List<User> list = new ArrayList<User>(5);
list.add(new User("A", 13));
list.add(new User("B", 93));
list.add(new User("C", 33));
list.add(new User("D", 53));
list.add(new User("E", 73));
System.out.println(list);
Collections.sort(list, new Comparator<User>() { //Anonymous object
public int compare(User user1, User user2) {
if(user1.age > user2.age) {
return 1;
} else if(user1.age < user2.age) {
return -1;
} else {
return 0;
}
}
});
System.out.println(list);
}
}
Comparator
는 메소드가 하나뿐인 함수형 인터페이스 functional interface이므로 람다식도 쓸 수 있다.
import java.util.*;
public class Example {
public static void main(String[] args) {
List<User> list = new ArrayList<User>(5);
list.add(new User("A", 13));
list.add(new User("B", 93));
list.add(new User("C", 33));
list.add(new User("D", 53));
list.add(new User("E", 73));
System.out.println(list);
Collections.sort(list, (user1, user2) -> user1.age - user2.age);
System.out.println(list);
}
}
HashMap
, Hashtable
(thread-safe HashMap
), TreeMap
HashMap implements Map
Hashtable implements Map
TreeMap implements NavigableMap
, NavigableMap extends SortedMap