Collections - Set, Map

장석빈·2022년 6월 6일
0

Set

-중복을 허용하지 않음.
-순서가 없음.

ex1)

public class SetEx1 {
    public static void main(String[] args) {
        Set<String> words = new HashSet<>();//Set은 순서가 없다.
        words.add("java");
        words.add("database");
        words.add("java");//중복 데이터를 넣으면 안들어감.

        System.out.println(words);//[database, java]
        System.out.println(words.contains("java"));//true

        for(String element : words)
            System.out.println(element);
    }
}

hashCode()와 equals()

-hashCode()는 이름표나 사인과 같은 개념으로 생각한다.
-hashCode()가 다르면 다른 오브젝트로 판단한다.
-hashCode()가 같으면 equals()를 실행해서 같은 오브젝트인지 다른 오브젝트인지 최종 판단
-hashCode()가 equals()보다 빠르기 때문에 hashCode()를 사용하면 두 오브젝트가 다른지 빠르게 판단할 수 있다.
-Set에 오브젝트를 넣을 때에는 그 오브젝트의 hashCode()와 equals()를 제대로 구현해야 중복방지를 할 수 있다.

ex2)

//Point.class
public class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Point){
            Point p = (Point) obj;
            return this.x == p.getX() && this.y == p.getY();
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
}

//SetEx2.class
public class SetEx2 {
    public static void main(String[] args) {
        //두 점이 같은지 아닌지 판단하려면 Point에 hashCode()와 equals()를 구현해야한다
        //hashCode() 값이 같고 equals()가 true이면 같은 오브젝트이다.
        Set<Point> points = new HashSet<>();
        Point p1 = new Point(3,4);
        Point p2 = new Point(1,2);
        Point p3 = new Point(1,2);
        points.add(p1);
        points.add(p2);
        points.add(p3);
        System.out.println(points);

        System.out.println(p2.equals(p3));
        System.out.printf("p2.hashCode()=%d, p3.hashCode()=%d\n", p2.hashCode(), p3.hashCode());
    }
}

Map

-key~value 쌍을 이룬다.
-key값은 중복을 허용하지않는다.
-순서가 없다.

ex3)

public class MapEx1 {
    public static void main(String[] args) {
        Map<String, String> dic = new HashMap<>();

        dic.put("baby", "아기");
        dic.put("love", "사랑");
        dic.put("apple", "사과");
        System.out.println(dic);//{love=사랑, apple=사과, baby=아기}

        System.out.println(dic.get("baby"));
        System.out.println(dic.get("love"));
        System.out.println(dic.get("apple"));
    }
}

ex4)

public class MapEx2 {
    public static void main(String[] args) {
        Map<String, Integer> scoreMap = new HashMap<>();

        scoreMap.put("김성동", 97);
        scoreMap.put("황기태", 88);
        scoreMap.put("김남윤", 98);
        scoreMap.put("이재문", 70);
        scoreMap.put("한원선", 99);
        System.out.println(scoreMap);
        System.out.println("HashMap의 요소 개수 : " + scoreMap.size());

        System.out.println(scoreMap.get("이재문"));

        //모든 엔트리 꺼내기(방법1)
        Set<String> keySet = scoreMap.keySet();//키 컬렉션은 set
        for (String key : keySet) {
            int value = scoreMap.get(key);
            System.out.printf("%s : %d\n", key, value);
        }

        //모든 엔트리 꺼내기(방법2) map은 entry의 set
        Set<Map.Entry<String, Integer>> entrySet = scoreMap.entrySet();
        for (Map.Entry<String, Integer> entry : entrySet) {
            System.out.printf("%s : %d\n", entry.getKey(), entry.getValue());
        }
    }
}
profile
회피형 인간의 개과천선기

0개의 댓글