[Java] ArrayList & LinkedList

eeminsu·2021년 11월 15일
0
post-thumbnail

자바의 정석을 통해 공부한 내용을 요약하였습니다.

ArrayList

1. 특징

  • List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다.
  • 기존의 Vector를 개선한 것으로 Vector는 동기화 처리가 되어있는 반면 ArrayList는 동기화처리가 되어있지 않다는 차이점이 있다.
  • Object 배열을 이용해서 데이터를 저장하며 모든 종류의 객체를 담을 수 있다.


2. 메서드

2-1) 생성자

  • ArrayList() - 크기가 10인 ArrayList를 생성
  • ArrayList(Collection c) - 주어진 컬렉션이 저장된 ArrayList를 생성
  • ArrayList(int initialCapacity) - 지정된 초기용량을 갖는 ArrayList를 생성
//예시
ArrayList list = new ArrayList(10);
ArrayList<Integer> list2 = new ArrayList<>();

2-2) 추가

  • boolean add(Object o) - ArrayList의 마지막에 객체를 추가(성공 true, 실패 false)
  • void add(int index, Object element) - 지정된 위치에 객체를 저장
list.add(new Integer(10));
list.add(new String("java"));

list2.add(1);
list2.add(2);
list2.add(3);

2-3) 검색

  • int indexOf(Object o) - 지정된 객체가 저장된 위치를 찾아 반환
  • int lastIndexOf(Object o) - 객체가 저장된 위치를 마지막 위치부터 역방향으로 검색하여 반환
  • boolean contains(Object o) - 지정된 객체가 ArrayList에 포함되어 있는지 확인
  • Object get(int index) - 지정된 위치에 저장된 객체를 반환
  • Object set(int index, Object element) - 주어진 객체를 지정된 위치에 저장

2-4) 삭제

  • Object remove(int index) - 지정된 위치에 있는 객체를 제거
  • boolean remove(Object o) - 지정한 객체를 제거(성공 true, 실패 false)
  • void clear() - ArrayList를 완전히 비움
list.remove(0); //0번째 위치에 있는 객체를 제거
list.remove(new Integer(2)); //2를 가지고 있는 Integer객체 제거

2-5) 기타

  • boolean isEmpty() - ArrayList가 비어있는지 확인
  • int size() - ArrayList에 저장된 객체의 개수를 반환
  • Object[] toArray() - ArrayList에 저장된 모든 객체들을 객체배열로 반환
  • Object[] toArray(Object[] o) - ArrayList에 저장된 모든 객체들을 객체배열 o에 담아 반환



3. 비고

  • ArryaList와 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데 효율이 좋음
  • 용량을 변경해야할 때는 새로운 배열을 생성하여 데이터를 복사해야하기 때문에 효율이 떨어짐
  • 처음에 인스턴스를 생성할 때 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋음



LinkedList

1. 특징

  • 배열은 크기를 변경할 수 없고, 비순차적인 데이터의 추가 및 삭제에 많은 시간을 소요한다.
  • 또한 배열의 크기를 처음부터 크게 설정하게 되면 메모리의 낭비가 발생한다.
  • linked list는 이러한 단점을 보완한 자료구조이다.
  • linked list의 각 요소(node)는 자신과 연결된 다음 요소에 대한 참조(주소 값) 데이터로 구성되어 있다.
  • 데이터 변경시 요소가 가지고 있는 다음 요소의 주소 값만 변경하면 되므로 배열처럼 복사하는 과정이 없기 때문에 처리속도가 매우 빠르다.
  • linked list는 다음 요소에 대한 접근이 쉬우나 이전 요소에 대한 접근이 어렵다, 이를 보완한 것이 doubly linked list이다.
  • doubly linked list는 다음 요소의 주소 뿐만 아니라 이전 요소의 주소도 가지고 있어 linked list보다 접근과 이동이 쉽다.
  • 자바의 LinkedList클래스는 doubly linked list로 구현되어 있다.


2. 메서드

  • LinkedList 역시 List 인터페이스를 구현했기 때문에 ArrayList와 구현방법만 다를 뿐 메서드의 종류와 기능이 거의 같다.



3. 비고

  • 순차적인 작업은 ArrayList가 빠르고 비순차적인 작업은 LinkedList가 빠르다.
  • 데이터의 개수가 변하지 않는 경우라면 ArrayList, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는 것이 바람직하다.
profile
안되면 될 때까지

0개의 댓글