본문 바로가기
> 프로그래밍 언어/JAVA

[ch11-7~11] ArrayList

by 자몽주스 2023. 1. 20.
728x90

ArrayList 하고 Vector은 같음

Vector은 옛날 거

 

vector은 동기화처리가 돼있다

ArrayLIst는 동기화 안돼있음

 

List가 붙은 애들은 

List 인터페이스 구현했다는 뜻

Vector 클래스의 소스

소스를 보면 아래에 객체배열이 있다

모든 종류의 객체를 저장할 수 있다

ArrayList class가 갖고있는 메서드

생성자(3)

1) ArrayList() - 기본생성자

 

2) ArrayList(Collection c) 

- 매개변수로 어떤 collection을 주면

그 collection에 저장돼있는 걸 저장하는 

ArrayList를 만들 수 있음

Collection끼리 변환할 때 많이 씀

 

3) 배열의 길이를 늘려줌

1) 추가하는 메서드

ArrayList에 어떤 객체 

저장하려면 add 쓰면 된다

성공하면 true 반환

실패하면 false

 

2) index - 저장위치

어느 위치에 저장할 지 정할 수 있음

 

3) addAll - Collection 주면 

Collection이 갖고 있는 요소를 

저장할 수 있음. 

어디에 추가할 지 위치 정할 수 있다

1) 저장한 걸 삭제할 땐 remove

2) 특정위치에 있는 객체를 삭제할 때

3) collection에 있는 객체들을 삭제하는 것

4) clear은 arrays에 있는 모든 객체를 삭제

1) index of - 검색

객체가 몇 번 째에 저장돼있는지

못찾으면 -1을 반환한다

2) last index of 

- 오른쪽 끝에서부터 왼쪽으로 찾음 

(index of 와 반대)

3) contains - 객체가 존재하는 지

4) 특정 개체 읽기

5) 특정위치에 있는 객체를

다른 걸로 변경하는 것

1) from 위치에서 to 사이에있는 

객체들을 뽑아서 

새로운 list를 만드는 것

2) Arraylist의 객체 배열을 반환

3) boolean isEmpty()

arraylist가 비어있는 지 

확인하는 메서드

4) 빈공간 제거

5) arraylist에 저장된 객체의 갯수를 반환

실습

길이 10 인 ArrayList 생성

add 메서드 호출하면

맨 뒤에 하나씩 추가되는 것

숫자로만 표현했지

객체 있고 객체 주소가 하나씩 들어감

Object 배열임 이게

참조형이니까 주소값 저장

간단히 5라고 써도 된다

List에는 객체배열이니까

객체만 저장가능하다

 

근데 어떻게 숫자 5가 저장될 수 있을까?

: autoboxing에 의해서

기본형이 참조형으로 자동변환

List의 subList

: List의 일부를 뽑아서

새로운 List를 만듦

1이상 4미만

1<=x<4

라서 4는 안들어감

그래서 인덱스 4는 빠진,

4,2,0,이 출력된다

 

subList에 의해서 만들어진

List는 읽기전용임

그래서 새로운 ArrayList로

(new ArrayList)

만들어줘야지만 바꿀 수 있다

이 부분 잘 이해안감 ㅠㅠ 15:37

이건 ArrayList(Collection C)를 이용한 것

따로 지시 안하면 오름차순으로 정렬

 

Collection 은 인터페이스고

Collections 는 util클래스

 

Collections.sort

: Collection을 정렬하는 기능

containsAll

 

<containsAll >

List1이 List2의 모든 요소를 포함하고 있느냐고 묻는 것

그래서 그 결과는 맞으니

true가 나옴

(List2의 요소가

List1에 다 있기 때문)

B,C 를 list2 에 추가
출력값

그냥 뒤에다가 추가할 수도 있는데

인덱스 3번째 자리에 A 추가
출력값

추가할 위치를 지정해서

추가할 수도 있음

중간에 뭘 끼워넣는건

부담가는 작업이긴 함

set - 변경

index 3 에 있는 걸

AA로 변경하는 것 (치환)

기존에 있는 A는 없어지고

새로운 객체

집어넣은 것이다

인덱스 0번째 위치에다가

문자열 1을 넣는다면,

기존에 있는 요소들이

한 칸 씩 옮겨감

그나저나 들어온 숫자는 문자열이지만

나머지 숫자들은 integer임

indexOf

indexOf

: 지정된 객체의 위치(인덱스) 알려줌

list1에서

문자열1이 어딨는지

index로

알려준다

remove

: 지우는 것

인덱스 0번째 위치 지우기

또는 이렇게 지울 수도 있다

 파란 커서 위치의

1이 사라짐

 

맨 앞의 1이 왜 아닐까?

아까 맨 앞에 있던 건

Integer가 아니라

String이었음

<주의!>

list1.remove(1);

이것의 의미는 숫자 1을

삭제한다는 것이 아니라

인덱스가 1인 객체를 삭제한다는 뜻

숫자 1을 삭제하려면 이렇게 쓰기

retainAll

list1에서 list1 하고 list2 둘의

겹치는 부분 남기고

나머지 삭제

출력

반대로 list2에서

list1에 있는걸 삭제

list2에 있는 요소들을

하나씩 읽어가면서 확인

 

list2.get(i)

: list2에 있는 걸 갖고오는 것

i = 0이면 

0번째 index에 있는 걸

갖고오는 거라 숫자 0을 갖고옴

list1.contains

: list1에 있는 지를 물어보는 것

index 2 에 있는걸 삭제하려고

list.remove(2)를 호출

그러면 아래에 있는 것을

한 칸 씩 위로 복사함

대신 덮어쓴거라

마지막에 4가 남음

그 마지막 4를

null로 바꾸고

(size - 저장된 객체의 개수)

개수가 5인 걸

하나 줄었으니 4로

사이즈 값을 바꿔줘야 함

삽입할 땐,

뭔가 넣고 싶으면

한 칸 밑에 칸으로 복사함

삽입할 떈 아까의

반대로 하면 됨

만약, 마지막 데이터

data[4]

를 삭제할 때는

data를 옮길 필요가 없으므로

1의 과정을 생략한다

null 집어넣고

size 1 감소시키면 됨

ArrayList에 저장된 객체 삭제하는 반복문

size가 5고

i가 0부터

1씩 증가하면서

삭제되는 것

data[0]이 삭제되면

나머지들이 위로 한 칸 씩

올라감

 

remove(1)이되면

index 1 인 숫자 2가 삭제됨

 

이런식으로 하면 

for문을 다 돌아도

남아있는 숫자가 있음

(1,3)

(삭제할때마다 아래 숫자가 올라와서)

그래서,

맨 뒤에부터 삭제해야 함

list.size()-1;

size 5 - 1 이니까

index 4 부터 사라짐

 

즉, 배열복사

data 이동이 없다

34:00

 

 

728x90