<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 |