웹개발/JAVA

Collection - Java List

bergerac 2025. 2. 23. 09:11

<1> ArrayList

  • 내부에서 배열을 사용한 요소저장
  • 빠른 읽기 성능/ 느린 삽입,삭제 성능
  • 빠른 조회 기능에 적합하다
  • 삽입과 삭제 시 데이터 이동이 필요하여 상대적으로 성능이 저하된다.

Ex)'사과바구니' - 사과를 일렬로 정렬하여 정리한다

: 사과를 추가하거나 제거하는 경우 공간에 대한 정리가 필요하다.따라서 속도가 저하된다(느림)

:사과를 꺼내는 경우 순차적인 수를 이용한 꺼내기가 가능하다.(빠름)

 

1. array 생성하기

ArrayList<String> arrayList = new ArrayList<>();

**List 인터페이스를 상속받는 AbstractList 추상클래스가 있고 이를 ArrayList Class가 상속받는다.

 

2. data 추가하기

//데이터 추가하기
arrayList.add("Java");//리스트 끝에 요소 추가
arrayList.add(0,"Python");//원하는 인덱스에 요소 추가
arrayList.add(0,"Java1");
arrayList.add("JavaScript");

System.out.println(arrayList);
//결과는 JAVA가 두번째, 원하는 요소에 넣어서 밀린다.

결과 : [Java1, Python, Java, JavaScript]

원하는 인덱스에 요소를 추가하면 다른 data들은 밀리게 된다.

 

3. data 읽기

tring firstElement = arrayList.get(0);//해당 인덱스의 요소를 반환
System.out.println(firstElement);//Python

 

4. 데이터 수정하기 

System.out.println("데이터 수정");
arrayList.set(2,"TypeScrit");// 해당 인덱스의 요소를 변경
System.out.println(arrayList);

 

5. 데이터 삭제하기

해당 인덱스의 요소를 삭제 후 반환한다.

System.out.println("데이터 삭제");
//해당 인덱스의 요소를 삭제 후 반환한다.
String removedElement = arrayList.remove(1);
System.out.println(removedElement);
System.out.println(arrayList);

 

6. 리스트 크기

System.out.println("리스트 크기");
System.out.println(arrayList.size());

실행결과

리스트 크기
3

 

 

<2> Linked List

  • 내부에서 이중 연결 리스트를 사용한 요소를 저장한다
  • 빠른 삽입, 삭제기능과 느린 읽기 성능을 지닌다
  • 연결 기반 데이터 관리 : 비순차적 데이터 작업에 적합하다.
  • 특정 요소 접근 시 순차 탐색이 필요하여 성능이 저하된다.

Ex) -기차' - 칸마다 서로 연결되어 있다.

새로운 칸(객차) 추가시 앞뒤 카에 연결만 하면 가능하다.(속도가 빠르다)

but, 특정 칸을 찾으려면 앞에서부터 하나씩 이동해야한다.

 

1. 새로운 리스트 만들기

System.out.println("============Linked List============");
LinkedList<String> linkedList = new LinkedList<>();

2. 데이터 추가

System.out.println("데이터 추가 " );
linkedList.add("Apple");
linkedList.add("Orange");
linkedList.add("Mango");
linkedList.add(1,"Banana");
System.out.println(linkedList);

 

 

3. 데이터 읽기

4. 데이터 포함 여부 확인

<사용방법>

리스트. contains(요소값);
포함 여부를 boolean 값으로 반환

<예시>

System.out.println(linkedList.contains("Orange"));//True
System.out.println(linkedList.contains("Strawberry"));//false

 

<3> ArrayList와 LinkedList의 성능 비교

 

**클래스 구조의 객체 타입 데이터

: 클래스 구조는 객체 타입의 데이터만 삽입 가능

ex) Integer, character, Boolean, Double

 

System.out.println("ArrayList와 LinkedList의 성능 비교");
ArrayList<Integer> arrayListTest = new ArrayList<>();
/*
**클래스 구조의 객체 타입 데이터
: 클래스 구조는 객체 타입의 데이터만 삽입 가능
  ex) Integer, character, Boolean, Double
 */

long startTime = System.nanoTime();//1초 : 1000000000나노초
System.out.println(startTime);//394791035567900

for(int i = 0; i<100000;i++){
    arrayListTest.add(0,i);
}long endTime = System.nanoTime();
System.out.println("ArrayList 삽입시간: "+(endTime-startTime)+"ns");

//--------------------------------------
LinkedList<Integer> linkedListTest = new LinkedList<>();

long startTimel = System.nanoTime();//1초 : 1000000000나노초
System.out.println(startTime);//394791035567900

for(int i = 0; i<100000;i++){
    linkedListTest.add(0,i);
}long endTimel = System.nanoTime();
System.out.println("LinkedList 삽입시간: "+(endTimel-startTimel)+"ns");

 

<4> 예제 : 이벤트 관리 시스템 만들기

*이벤트 관리 시스템 만들기

이벤트 참가자 명단과 대기열 관리를 위한 시스템

참가자는 사전 등록된 명단을 통해 이벤트에 참가하고 명단이 가득 찰 경우에는 대기열로 추가, 참가자가 떠나면 대기열의 다음 사람이 추가

 

1)이벤트 참가자 명단 관리 : 사전등록, 이벤트 당일 추가 참가자 등록이 불가능

 ArrayList(목록 추가기능은 사용하지만, 삭제가 되지 않고, 조회가 되는 리스트)

 

2)대기열 관리

: 이벤트의 한정된 좌석, 좌석이 모두 차면 추가 참가자는 대기열에 등록된다

LinkedList로 관리(목록 추가, 삭제o, 참가자를 조회하진 않는다)

 

import java.util.ArrayList;
import java.util.LinkedList;

class EventManagement{

    //필드
    ArrayList<String> participantList = new ArrayList<>();//이벤트 참가자 명단
    LinkedList<String> waitingQueue = new LinkedList<>();//대기열 명단

    //메서드
    void addParticipant(String name){
        participantList.add(name);
    }

    void addToWaitingQueue(String name){
        waitingQueue.add(name);
    }

    void leaveParticipant(String name){
        //대기열의 인원이 존재해야만 인원을 참가자 명단에 추가가 가능하다
        //대기열 크기(.size())가 0 이상이어야 한다.
        if(waitingQueue.size()>0){
            String nextParticipant = waitingQueue.remove(0);//대기열에서 제거
            addParticipant(nextParticipant);//참가자 명단에 추가
        }
    }

    boolean checkParticipant(String name){
        return participantList.contains(name);
    }

}

public class C_Practice {
    public static void main(String[] args) {
        EventManagement eventManagement = new EventManagement();
        eventManagement.addParticipant("cyrano");
        eventManagement.addParticipant("de");
        eventManagement.addParticipant("bergerac");
        eventManagement.addParticipant("crystiang");
        eventManagement.addParticipant("Ragueneau");
        //원 잠가자 명단

        eventManagement.addToWaitingQueue("Gascoyne");
        eventManagement.addToWaitingQueue("Christian");
        eventManagement.addToWaitingQueue("Ssalrano");
        eventManagement.addToWaitingQueue("korano");
        eventManagement.addToWaitingQueue("jamrano");
        //대기열 명단

        System.out.println(eventManagement.participantList);
        System.out.println(eventManagement.waitingQueue);
        //원 참가자 명단 출력 및 대기열 명단 출력

        eventManagement.addToWaitingQueue("beluga");

        eventManagement.leaveParticipant("cyrano");//cyrano는 구경 다하고 떠남
        eventManagement.leaveParticipant("Raqueneau");//Ragueneau도 시라노랑 같이 떠남

        System.out.println(eventManagement.participantList);
        //대기열에 있던 Gascoyne과 Christian이 추가됨(총 관람인원 관리)

        System.out.println(eventManagement.checkParticipant("bergerac"));
        System.out.println(eventManagement.checkParticipant("Ssalrano"));
        //Ssalrano는 아직 대기열에서 추가 되지 않았음으로 false 가 뜨게 되고,
        //bergerac의 경우에는 participantList에 추가되어 있으므로 true 가 뜨게 된다.

    }
}

'웹개발 > JAVA' 카테고리의 다른 글

Collection- Map Interface  (0) 2025.02.25
Collection - Set Interface  (1) 2025.02.24
Collection Framework  (1) 2025.02.22
Overloading vs Overriding  (2) 2025.02.21
Array(JAVA에서 배열 활용법)  (1) 2025.02.20