컬렉션 프레임워크에 대해 간략히 정리 해보자.
중복
을 허용하지 않는 특징을 갖는다.순서
가 유지되지 않는 특징을 갖는다.public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<>();
set.add("Toy");
set.add("Robot");
System.out.println("인스턴스의 수 : " + set.size());
for(Iterator<String> itr = set.iterator(); itr.hasNext();) {
System.out.println(itr.next() + '\t');
System.out.println();
}
for(String s : set) {
System.out.println(s + "\t");
System.out.println();
}
}
public boolean equals
(Object obj)
Object
클래스의 equals 메소드
호출 결과를 근거로 동일 Instance를 판단 한다.public int hashCode
()
Object 클래스의 hashCode 메소드
호출 결과가 같아야 한다.hashCode() 메소드
를 통해 저장되는 데이터의 부류를 나눈다.분류
를 A, B, C, D로 구분한 후 들어오는 값을 Object의 equals 메소드를 통해 구분.분류 기법 알고리즘
)분류 대상
이 하나의 집합이 된다.num % 3
3 부류
100 부류
속도
가 매우 빨라진다.Hash 알고리즘
을 통해 탐색의 속도 증가
.class Num {
private int num;
public Num(int n) {
this.num = n;
}
@Override
public int hashCode() {
return num % 3; // num의 값이 같으면 부류도 같다.
}
@Override
public boolean equals(Object obj) {
if(num == ((Num)obj).num) {
return true;
} else {
return false;
}
}
}
class car {
private String model;
private String color;
@Override
public int hashCode() {
return (model.hashCode() + color.hashCode()) / 2;
}
/**
* 모든 인스턴스 변수의 정보를 다 반영하여 해쉬 값을 얻으려는 노력이 깃든 문장.
* 결과적으로 더 세밀하게 나뉘고, 따라서 그만큼 탐색 속도가 높아진다.
*/
}
모든 정보를 전부 반영하여 HashCode의 값을 반영하라?
무슨 소리인지 생각 해봐야 할듯..
hash
(Object...values)java.util.Objects
에 정의된 메소드, 전달된 인자 기반의 해쉬 값 반환.@Override
public int hashCode() {
return Objects.hash(model, color);
}
set< E > 인터페이스를 구현하는 Tree< E > 클래스
중복
을 허용하지 않는다.순차적인 저장
을 지원하지 않는다.집합
을 통해 데이터를 저장 한다.오름 차순
기준으로 값의 참조가 이루어진다 → 즉 오름 차순으로 데이터를 가져온다.Instance
가 저장이 되는데 어떤 기준
으로 데이터의 오름 차순을 결정 할 것 인가?Comparable Interface
의 구현을 통하여 두 Instance의 크고 작음
을 결정
할 수 있다.compareTo
(Object o)를 구현하여 사용.interface Comparable → interface Comparable< T >
int compareTo(Object o) → int compareTo(T o)
양의 정수
반환.음의 정수
반환.0
을 반환.따라서 TreeSet< T >에 저장할 Instance들은 모두 Comparable< T > 인터페이스를 구현한 클래스의
Instance이어야 한다. 아니면 예외 발생!!
String 클래스의 정렬 기준은 사전 편찬 순으로 compareTo()를 구현 하고 있다.
하지만 정렬 기준을 변경하고 싶은 상황에서는?
생성자
를 제공 한다.위 같은 기능을 제공 받기 위해서 해당 클래스는 ComparaTor<T> 인터페이스
를 구현해야 한다.
class PersonComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return p2.age - p1.age;
// p2 : 50 - p1 : 4
}
}
public static void main(Stirng[] args) {
TreeSet<Person> tree = new TreeSet<>(new PersonComparator());
tree.add(new Person("Yoon", 37));
tree.add(new Person("Hong", 53));
tree.add(new Person("Park", 22));
for(Person p : tree) {
System.out.println(p);
}
}
양의 정수
반환.음의 정수
반환.0
을 반환.기존 Comparable<T> Interface의 compareTo()를 무시 한다.
public static void main(String[] args) [
List<String> lst = Arrays.asList("A", "B", "C", "A");
ArrayList<String> list = new ArrayList<>(lst);
for(String s : list)
System.out.println(s.toString() + "\t");
System.out.println();
// 중복된 인스턴스를 걸러 내기 위한 작업
HashSet<String> set = new HashSet<>(list);
// 원래대로 ArrayList<String> 인스턴스로 저장물을 옮긴다.
list = new ArrayList<>(set);
for(String s : list)
System.out.println(s.toString() + "\t");
System.out.println();
}