개발일지/Java

Java List<E>, ArrayList, LinkedList

E-room 2022. 9. 14. 22:48
728x90

List

  • 배열과 같이 객체를 일렬로 늘어놓은 구조를 가지고 있음
  • 객체를 저장하면 자동으로 인덱스가 부여됨
  • 인덱스로 객체를 검색, 추가, 삭제할 수 있음


ArrayList

  • 객체가 인덱스로 관리된다
  • 저장 용량 초과 시, 자동으로 늘어남 (기본적으로 10이 지정됨)
  • 데이터가 연속적으로 존재 (순서 유지)
  • 특정 인덱스 객체 제거 시, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐

 

ArrayList의 데이터 추가 방식

ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);

ArrayList<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됨 

ArrayList<String> container2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정
public class ArrayListExample {
	public static void main(String[] args) {

		// ArrayList를 생성하여 list에 할당
		ArrayList<String> list = new ArrayList<String>();

		// String 타입의 데이터를 ArrayList에 추가
		list.add("Java");
		list.add("egg");
		list.add("tree");

		// 저장된 총 객체 수 얻기
		int size = list.size(); 

		// 0번 인덱스의 객체 얻기
		String skill = list.get(0);

		// 저장된 총 객체 수 만큼 조회
		for(int i = 0; i < list.size(); i++){
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}

		// for-each문으로 순회 
		for (String str: list) {
			System.out.println(str);
		}		

		// 0번 인덱스 객체 삭제
		list.remove(0);
	}
}

LinkedList

  • 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
  • 데이터가 불연속적으로 존재하며, 서로 연결(link)되어 있음
  • LinkedList의 각 요소(node)들은 자신과 연결된 이전 요소 및 다음 요소의 주소 값과 데이터로 구성
  • 배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 훨씬 빠름

LinkedList의 데이터 저장 방식

public class LinkedListExample {
	public static void main(String[] args) {
		
		// Linked List를 생성하여 list에 할당
		ArrayList<String> list = new LinkedList<>();

		// String 타입의 데이터를 LinkedList에 추가
		list.add("Java");
		list.add("egg");
		list.add("tree");

		// 저장된 총 객체 수 얻기
		int size = list.size(); 

		// 0번 인덱스의 객체 얻기
		String skill = list.get(0);

		// 저장된 총 객체 수 만큼 조회
		for(int i = 0; i < list.size(); i++){
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}

		// for-each문으로 순회
		for (String str: list) {
			System.out.println(str);
		}		

		// 0번 인덱스 객체 삭제
		list.remove(0);
	}
}

ArrayList vs LinkedList

데이터의 잦은 변경이 예상될 시 LinkedList

데이터의 개수가 변하지 않을 시 ArrayList

 

속도 비교

  • 데이터를 순차적으로 추가하거나 삭제 시 : ArrayList
  • 데이터 검색 시 : ArrayList
  • 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우 : LinkedList

 

ps) 사실 요즘 컴퓨터 성능이 좋아서 엄청나게 방대한 자료가 아닌 이상 드라마틱한 차이가 나지는 않는다ㅋ

728x90