-ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트입니다. 일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는 점등이 유사하지만 한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다는 특징
-ArrayList선언시 ArrayList list = new ArrayList()로 선언 후 내부에 임의의 값을 넣고 사용할수도 있지만 이렇게 사용할경우 값을 뽑아내기 위해서는 캐스팅(Casting) 연산이 필요하고 잘못된 타입으로 캐스팅을 한 경우에는 에러가 발생하기에 위와 같은 방식은 추천하지 않습니다. ArrayList를 사용할시에는 ArrayList에 타입을 명시해주는것이 좋습니다. JDK 5.0이후부터 자료형의 안정성을 위해 제너릭스(Generics)라는 개념이 도입되었습니다. ArrayLIst list = new ArrayList(); 이라고 되어있다면 String객체들만 add되어질수있고 다른 타입의 객체는 사용이 불가능합니다.
※제네릭스는 선언할 수 있는 타입이 객체 타입입니다. int는 기본자료형이기 때문에 들어갈수 없으므로 int를 객체화시킨 wrapper클래스를 사용해야함.
-HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조입니다. 여기서 키와 값은 모두 객체입니다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없습니다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다. HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보임
-HashMap은 synchronized 키워드가 없기 때문에 동기화가 보장되지 못한다. (싱글 스레드 환경에서 사용하길) 따라서 동기화처리를 하지 않기 때문에 값을 찾는 속도가 상당히 빠르다. 또한 HashTable과 다르게 key,value null값을 허용한다. 즉 속도가 빠르지만, 신뢰성 안정성은 떨어진다. (thread-unsafe)
-HashSet은 Set 인터페이스의 구현 클래스입니다. 그렇기에 Set의 성질을 그대로 상속받습니다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있습니다. 또한 저장 순서가 유지되지 않습니다. 만약 요소의 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 됩니다. Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데 HashSet의 경우 정렬을 해주지 않고 TreeSet의 경우 자동정렬을 해준다는 차이점이 있습니다. Set의 가장 큰 장점은 중복을 자동으로 제거해준다.
-HashTable의 메서드는 전부 synchronized 키워드가 붙어있기 때문에 메서드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해준다. 또한 key,value값의 null을 허용하지 않는다. 즉 동기화 락때문에 속도는 느리지만, data의 안정성이 높고 신뢰가 높은 컬렉션 (thread-safe)
-Hashtable이 동기화를 지원하면서 발생되는 성능적인 단점과 HashMap이 동기화를 보장하지 않는 단점을 보완하기 위해 Multi-Thread 환경에서 사용할 수 있도록 자바8에 나온 클래스가 ConCurrentHashMap이다. (thread-safe)
concurrent 패키지에 존재하는 컬렉션들은 락을 사용할 때 발생하는 성능 저하를 최소한으로 만들어두었으며, 여러 개의 락을 가지고 해시값을 이용해 이러한 락을 분할하여 사용하는 Lock Striping 기법을 사용하여 동시에 여러 스레드가 하나의 자원에 접근하더라도 동시성 이슈가 발생하지 않도록 도와줍니다.
하지만 HashMap과 다르게 key,value에 null을 허용하지 않는다. putIfAbsent 메서드를 가지고 있음.
-getOrDefault : key 값이 없다면 입력시 설정한 default 값을 반환
-putIfAbsent : map에 key가 없으면 key, value를 넣고 map에 key가 있으면 건너뛴다.
*Thread-safe
Multi Thread 프로그래밍에서 여러 Thread로부터어떤 method나, variable, object에 동시에 접근이 이뤄져도프로그램의 실행에 문제가 없음!
하나의 function이 한 Thread로 부터 호출되어 실행 중일 때,다른 Thread가 동일한 함수를 호출하여 동시에 실행되더라도각 Thread에서 함수의 수행 결과가 바르게 나오는 것!