15. 컬렉션 자료구조
모음? 객체를 모은다. 객체를 저장할수잇는 자료구조
예를들어 배열
배열의 특징 : 1.같으타입만 저장가능 2.길이변경불가
15장은 배열과 유사하지만 조금다름
1.같은타입만 가능이지만 다른타입도 가능하긴함.
2.길이 변경가능함. 길이 고정x
3.키를주고 값을 저장하는 것도 존재함. 배열과 다르게 저장하는것도잇음.
15.1 컬렉션 프레임 워크
프레임워크? = 미리 짜여진 틀 자바는 객체를 저장할수있는 클래스를 미리 제공을 한다.
java.util 패키지에 있다.
인터페이스 용도? 객체 사용설명서 인터페이스만 공부하면 밑에잇는 객체들 사용할수잇다.
List Set -> Collection /Map
사진참조 자바 사용설명서잇다. 화살표 채워진거 상속 빈삼각형화살표 인터페이스-구현객체
리스트 인덱스가 잇어서 배열과 비슷하다.
Map은 키와 엔트리가잇어서 키값을 주고 객체를 찾는다.
15.2 List 컬렉션
List 컬렉션은 객체를 인덱스롤 관리하기때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색 삭제할 수있는 기능을 제공한다.
실제 객체가 저장되는게아니라 객체의 번지가 저장이되는거임!
List 컬렉션안에는 ArrayList Vector LinkedList 등이 있다.
List<T> 제네릭 타입이라 저장하고 싶은 타입을 저장하면됨. 어떤게 추가되어있냐에 따라 사용함.
add(E e) 맨끝에 추가하기 add(int index, E element) 주어진 인덱스에 추가
clear()다지우기 remove(int index) 인덱스지정 제거 remove(Object o) 객체 그냥 제거
get(int index) 특정 인덱스의 값 가져와
구체적인 타입 제공햇으면 E에 타입 들어가는것임.
정적메소드도 잇음. 디폴트메소드도있음.
리스트는 인덱스로 저장하기 때문에 인덱스 매개변수가 많다.
15.2.1 ArrayList
가장 많이 사용하는 컬렉션으로 인덱스로 번지를 저장한다. 번지로 저장하기 때문에 동일한 객체도 중복으로 넣을 수잇다.
List<E> list = new ArrayList<E>(); //E에 지정된 타입의 객체만 저장
List<E> list = new ArrayList<>(); //E에 지정된 타입의 객체만 저장
List list = new ArrayList(); //모든 타입의 객체를 저장 E대신 Object사용
만약 구체적인 타입 안주면? Object라 아무거나 가능한데 보통 잘 안씀
ArrayList에 객체를 추가하면 인덱스 0번부터 차례대로 작성된다.
특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 앞으로 1씩 당겨짐.
마찬가지로 중간에 삽입하면 뒤로 1씩 밀려남
package ch15.sec02.exam01;
public class Board {
private String subject;
private String content;
private String writer;
public Board(String subject, String content,String writer ) {
this.subject = subject;
this.content = content;
this.writer = writer;
}
public String getSubject() {return subject;}
public void setSubject(String subject) {this.subject = subject;}
public String getContent() {return content;}
public void setContent(String content) {this.content = content;}
public String getWriter() {return writer;}
public void setWriter(String writer) {this.writer = writer;}
}package ch15.sec02.exam01;
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
//ArrayList 컬렉션 생성
//이 인터페이스에 보드 객체만 넣을 수 있음.
List<Board> list = new ArrayList<>();
// 객체추가
list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));
//실제 저장된 객체 수 얻기 size() 메소드 사용
int size = list.size();
System.out.println("총 객체 수: " + size); //5개 저장했으니 총개채수 5
System.out.println();
//특정 인덱스의 객체 가져오기 get()메소드
Board board = list.get(2);
System.out.println(board.getSubject() + "\t" + board.getSubject() + "\t" + board.getWriter());
System.out.println();
//모든 객체를 하나씩 가져오기
for(int i = 0; i < list.size(); i++) {
Board b = list.get(i);
System.out.println(b.getSubject() + "\t" + b.getSubject() + "\t" + b.getWriter());
}
System.out.println();
//객체 삭제
list.remove(2);
list.remove(2); //뒤에게 당겨지니 2번째 삭제후 2번이된 3번삭제
//향상된 for문으로 모든 객체 하나씩 가져오기
// 5장 10절
for(Board b : list) {
System.out.println(b.getSubject() + "\t" + b.getSubject() + "\t" + b.getWriter());
}
}} 
15.2.2 Vector
Vector는 ArrayList와 동일한 내부구조를 가지고 있다. 작성방법은 구현객체만 달라서 사용법이 같음.
언제 ArrayList를 쓸건지 Vector를 쓸건지를 정해야함.
차이점은? Vector는 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 Vector()메소드를 실행할 수 없다.
어떤게 더좋냐? 알수없음. 싱글스레드는 뭘쓰던 같다. 멀티스레드에서 공유객체일땐 Vector를 사용하는게 낫다. 겹치면 오류나서!
List<E> list = new Vector<E>(); //E에 지정된 타입의 객체만 저장
List<E> list = new Vector<>(); //E에 지정된 타입의 객체만 저장
List list = new Vector(); //모든 타입의 객체를 저장 E대신 Object사용
Board는 위의 예제와 같음
package ch15.sec02.exam02;
import java.util.List;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
//Vector 컬렉션 생성
List<Board> list = new Vector<>();
//List<Board> list = new ArrayList<>();
//ArrayList로하면 두 스레드가 동시에 add()메소드를 호풀할수있기때문에 경합이 발생헤 결국 하나만 저장되서
// 총개수가 맞지않거나 오류가 발생한다.
//Vector의 add()는 동기화 메소드이므로 한번에 하나의 스레드만 실행할수잇어서 경합이 발생하지 않는다.
//작업 스레드 객체 생성
Thread threadA = new Thread() {
@Override
public void run() {
//객체 1000개 추가
for(int i=1; i<=1000; i++) {
list.add(new Board("제목"+i, "내용"+i, "글쓴이"+i));
}
}
};
//작업 스레드 객체 생성
Thread threadB = new Thread() {
@Override
public void run() {
//객체 1000개 추가
for(int i=1001; i<=2000; i++) {
list.add(new Board("제목"+i, "내용"+i, "글쓴이"+i));
}
}
};
//작업 스레드 실행
threadA.start();
threadB.start();
//작업 스레드들이 모두 종료될때까지 메인 스레드를 기다리게함
try {
threadA.join();
threadB.join();
} catch(Exception e) {
}
//저장된 총 객체 수 얻기
int size = list.size();
System.out.println("총 객체 수: " + size);
System.out.println();
}
}15.2.3 LinkedList
LinkedList와 ArrayList사용방법은 동일하지만 내부 구조는 완전히 다르다.
ArrayList는 배열에 객체를 저장하지만 LinkedList는 인접객체를 체인처럼 연결해서 관리한다.
ArrayList제거시 매우 여러개잇을땐 중간에 빼면 하나씩 앞으로 당겨지니가 성능상으로 안좋아짐.
이를해결하기 위해 나온게 LinkedList 서로서로 연결되어있다.
본인을 기준으로 좌우에 뭐가 있다를 연결함.
중간에 제거시 연결정보만 바꿈 다른거는 수정할 필요가 없음.
중간 삭제 추가시 좀더 좋은 성능임.
List<E> list = new LinkedList<E>(); //E에 지정된 타입의 객체만 저장
List<E> list = new LinkedList<>(); //E에 지정된 타입의 객체만 저장
List list = new LinkedList(); //모든 타입의 객체를 저장 E대신 Object사용
package ch15.sec02.exam03;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
//ArrayList 컬렉션 객체 생성
List<String> list1 = new ArrayList<String>();
//LinkedList 컬렉션 객체 생성
List<String> list2 = new LinkedList<String>();
//시작 시간과 끝 시간을 저장할 변수 선언
long startTime;
long endTime;
//ArrayList 컬렉션에 저장하는 시간 측정
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
list1.add(0, String.valueOf(i));//제일앞에 삽입 하나씩 밀고 넣기
}
endTime = System.nanoTime();
System.out.printf("%-17s %8d ns \n", "ArrayList 걸린 시간: ", (endTime-startTime) );
//LinkedList 컬렉션에 저장하는 시간 측정
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
list2.add(0, String.valueOf(i)); //제일앞에 삽입 앞에 넣고 새로운 링크만 만들기
}
endTime = System.nanoTime();
System.out.printf("%-17s %8d ns \n", "LinkedList 걸린 시간: ", (endTime-startTime) );
}}
2022.11.30 리뷰
벌써 12월이라니 믿을 수가 없다.
집중력이 초반에 비해 아주 많이 떨어졌다. 오늘도 적은 분량밖에 나가지 못했다.
하루하루 하나씩 나아가고 싶지만 벌써 12월이라는 사실이 나를 힘들게 만드는 것 같다.
학원에서 알아먹을 정도만 하려고 공부를 시작했지만
결국 알아가는게 별로 없을 거 같아서 매일매일 자괴감이 올라온다.
매일매일이 힘들다. 감정이 매일 바뀐다. 힘내고 싶다.
결국 중요한 것은 꺾이지 않는 마음이다
'기초단계 > JAVA' 카테고리의 다른 글
| 2022.12.02 JAVA 람다식 (0) | 2022.12.02 |
|---|---|
| 2022.12.01 JAVA 컬렉션 자료구조 (0) | 2022.12.02 |
| 2022.11.30-1 JAVA 멀티 스레드 (1) | 2022.11.30 |
| 2022.11.29-1 JAVA 멀티 스레드 (1) | 2022.11.29 |
| 2022.11.28-2 JAVA 제네릭 (1) | 2022.11.28 |