Stack
LIFO(Last In First Out) 후입선출 구조
ex) jvm call stack, browser 뒤로가기/앞으로가기
Queue
FIFO(First In First Out) 선입선출
ex) 대기리스트 관리
Set
Collection 내부에 set. set내부에 HashSet이 존재.
중복 요소를 추가하지 않는다.
Set<String> setName = new Set<>(); 일 때
*Set은 인덱스 관련 메소드가 없다.
요소 개수 : setName.size()
요소의 포함 여부 : setName.contains("abc") //abc가 setName에 존재하는지 확인
요소 제거 : setName.remove("abc") //abc를 제거
요소 열람하기
- for문은 인덱스가 없어서 사용불가.
- for each와 iterator 사용가능
1. for each문
for(String s: setName){
System.out.println("> "+s);
}
2. iterator
Iterator<String> iter = setName.iterator();
while(iter.hasNext()){
String next=iter.next();
System.out.println(next);
}
다른 Set객체와 병합하기 :
Set<String> other=new HashSet<>(); 가 존재할 때,
setName.addAll(other);
List < - > Set 바꾸기
1. List -> Set 중복제거
2. Set -> List 순서관련처리
1.
List<Integer> intList = new ArrayList<>();
Set<Integer> intSet = new HashSet<>(intList);
// 프린트 해보면 intList의 중복요소가 제거됨. List의 함수 get 사용 불가
2.
Set<Integer>intSet = new HashSet<>(intList);
List<Integer>otherList = new ArrayList<>(intSet);
// List의 함수인 get을 사용할 수 있게 되어 List가 된 것을 확인 가능.
이미 Set이 한번 되었기 때문에 intList의 중복 요소들은 없음.
중복판단
Set은 equals와 hashCode 모두 비교해서 중복을 판단한다.
private void test3() {
Set<Student> set=new HashSet<>();
set.add(new Student(1, "홍길동"));
set.add(new Student(2, "신사임당"));
set.add(new Student(3, "장보고"));
set.add(new Student(1, "홍길동"));
System.out.println(set);
}
다음과 같은 코드에서, 결과는
사진 설명을 입력하세요.
다음과 같다. no=1, name=홍길동은 Set에서 같다고 판단하지 않은 것이다.
그 이유는 Set에서 중복을 판단할 때, equals (내용) 와 hashCode(주소) 를 모두 비교하기 때문이다.
String은 immutable이라 같은 홍길동이어도 다른 주소값에 저장된다!
Set의 종류
HashSet (저장된 순서 유지 X / 중복제거 X)
LinkedHashSet (저장된 순서 유지 O / 중복제거 X)
TreeSet (기본 정렬, 중복 제거 O )
set.add(new Student(2, "신사임당"));
set.add(new Student(3, "장보고"));
set.add(new Student(1, "홍길동"));
set.add(new Student(1, "홍길동"));
다음과 같은 요소를 추가하는 코드를 가진 set 이 존재할 때를 비교해보자.
HashSet
사진 설명을 입력하세요.
LinkedHashSet
사진 설명을 입력하세요.
TreeSet
사진 설명을 입력하세요.
LinkedHashSet은 들어간 순서를 기억해서 출력하고,
TreeSet은 내용을 비교해서 삭제하는 것을 알 수 있다.
Map
key와 value를 하나의 요소로 관리한다.
key는 중복될 수 없다.
HashMap<String,Object> map1 = new HashMap <String, Object>();
Map<String, Object> map2 = map1;
일때, 내장 함수들을 알아보자.
요소 추가 : map1.put("abc",123); //key 가 "abc"이고 value 가 123인 요소 추가.
중복키 추가 : map1.put ("abcd",123)l //key가 "abcd"이고 value가 123인 요소 추가. value는 중복 가능
요소 가져오기 : map1. get("abc"); //get안에는 key를 써야하고, 이는 반환형을 가져 사용할 수 있음.
ex ) Object value = map1.get("abc");
요소 제거하기 : map1.remove("abc"); //remove 안에는 key를 써야하고 이 역시 반환형 가져 사용 가능.
ex ) Object removed = map1.removed("abc");
키 존재확인 : map1.containsKey("abc"); // true or false 반환
밸류 존재 확인 : map1.containsValue(123); // true or false 반환
밸류 사용 : Collection<Object> values = map1.values(); //values는 이제 하나의 변수.
다른 맵과 병합
Map<String, Object> other = new HashMap<>();가 존재할 때,
map1.putAll(other) ;
맵의 요소 확인하기
1. key Set() : key값만 모아서 Set으로 반환
Set<Integer> keysSet = map.keySet();
1.1 for each
for (Integer key : keySet) {
String value = map.get(key);
System.out.println(key + " = " + value);
}
1.2 iterator
Iterator<Integer> iter1 = keySet.iterator();
while (iter1.hasNext()) {
Integer key = iter1.next();
String value = map.get(key);
System.out.println(key+" = "+value);
}
2. entrySet() : Entry타입 요소를 가진 Set을 반환. Entry<K,V> 는 Node<K,V>의 부모타입
Set<Entry<Integer,String>> entrySet=map.entrySet();
2.1 for each
for(Entry<Integer,String> entry:entrySet) {
Integer key=entry.getKey();
String value=entry.getValue();
System.out.println(key+" = "+value);
}
2.2 iterator
Iterator<Entry<Integer,String>> iter2=entrySet.iterator();
while(iter2.hasNext()) {
Entry<Integer,String> entry=iter2.next();
Integer key=entry.getKey();
String value=entry.getValue();
System.out.println(key+" = "+value);
}
Set과 마찬가지로
LinkedHashMap 은 저장된 순서가 유지되는 맵
TreeMap은 key값 기준 기본정렬