자바의 컬렉션은 객체 그룹으로 작업하기 위한 데이터 구조를 구현합니다. 주요 구조는 다음과 같습니다:
ArrayList (List 인터페이스를 구현)는 배열에 요소를 저장하여 인덱스를 통한 빠른 접근을 보장하지만, 중간에서 요소를 삽입/삭제하는 것은 느리며, 이는 요소들을 이동해야 하기 때문입니다.
LinkedList (역시 List를 구현)는 이중 연결 리스트로 구성되어 있습니다. 중간에 요소를 빠르게 삽입/삭제할 수 있지만, 인덱스를 통한 접근은 느리며, 이는 목록의 시작이나 끝에서부터 이동해야 하기 때문입니다.
HashMap은 Map 인터페이스를 구현합니다. 키-값 쌍을 저장합니다. 해시 함수로 키를 통해 값에 빠른 접근(O(1))이 가능하지만, 요소의 순서를 보장하지는 않습니다.
List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // 빠름 arrayList.get(0); // 빠름 List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // 약간 느림 linkedList.add(0, "B"); // 빠름 Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // 빠름
HashMap과 Hashtable의 근본적인 차이점은 무엇이며, 왜 Hashtable은 현대 코드에서 거의 사용되지 않습니까?
답변: HashMap은 동기화되지 않으며, null을 키와 값으로 모두 허용합니다. Hashtable은 동기화되어 (여러 스레드가 동일한 객체에 대해 무결성을 위협하지 않고 작업할 수 있음) 있지만, null을 허용하지 않으며 느립니다. 현대 코드에서는 보다 효율적이고 다중 스레드 계산을 위해 더 세밀하게 조정할 수 있는 ConcurrentHashMap을 자주 사용합니다.
Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException
이야기
학생 관리 시스템에서 빈번한 삽입 및 삭제를 위해 ArrayList를 사용하는 바람에 대량의 데이터로 인해 성능이 크게 저하되었습니다. LinkedList로 교체한 후 상황이 정상화되었습니다.
이야기
멀티 스레드 CRM 시스템에서 동기화 없이 스레드 간 데이터 저장을 위해 HashMap을 사용하여 가끔씩 불일치한 데이터 및 경쟁 조건으로 인한 충돌이 발생했습니다. ConcurrentHashMap으로 전환한 후 버그가 사라졌습니다.
이야기
개발자가 Hashtable에 null 키를 추가하려고 시도했으나 금지 사항을 몰랐습니다. 이로 인해 NullPointerException이 발생했고, 애플리케이션이 예기치 않게 중단되는 이유를 오랫동안 찾지 못했습니다.