"나 여기있어."

"안녕, 엘리!"

"오늘은 흥미로운 주제에 대해 이야기하겠습니다. ArrayList 클래스 에 대해 말씀드리겠습니다 ."

"새로운 클래스? 멋지다! 무엇을 할 수 있을까?"

"비하인드 스토리부터 시작하겠습니다. 프로그래머가 배열에 대해 싫어하는 유일한 점은 배열의 크기를 변경할 수 없다는 것입니다. 여유 슬롯이 하나만 있는 배열에 세 개의 요소를 더 추가해야 하는 경우 어떻게 하시겠습니까? "

"이 문제에 대한 유일한 해결책은 모든 요소를 ​​위한 충분한 공간을 보장하기 위해 매우 큰 배열을 만드는 것입니다. 그러나 이것은 종종 메모리 낭비를 의미합니다. 배열에 일반적으로 세 개의 요소가 포함되어 있지만 가장 작은 기회가 있는 경우 100개 요소를 수용해야 할 수도 있으므로 100개 요소 배열을 만들어야 합니다."

"그래서, 프로그래머들은 무엇을 생각해냈습니까?"

"그들은 Array와 동일한 작업을 수행하지만 크기를 변경할 수 있는 ArrayList 클래스를 작성했습니다."

"흥미로운 움직임이군요. 어떻게 한 거죠?"

"모든 ArrayList 개체는 요소의 일반 배열을 저장합니다. ArrayList 에서 요소를 읽을 때 내부 배열에서 읽습니다. ArrayList 에 쓸 때 내부 배열에 씁니다. 여기에서 다음 열을 비교하십시오."

정렬 배열목록
요소에 대한 컨테이너 만들기
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
요소 수 얻기
int n = list.length;
int n = list.size();
배열/컬렉션에서 요소 가져오기
String s = list[3];
String s = list.get(3);
배열에 요소 쓰기
list[3] = s;
list.set(3, s);

"그래서 ArrayList가 더 나은 이유는 무엇입니까? 제가 아는 한 코드가 더 길어졌습니다."

"첫째, ArrayList는 프로그래머가 항상 수행해야 하는 몇 가지 추가 작업을 지원합니다. 일반 배열은 이러한 작업을 지원하지 않습니다. 예를 들어 구멍을 남기지 않고 배열 중간에서 요소를 삽입하거나 삭제합니다. "

"두 번째, 배열의 크기를 변경하는 기능입니다. 하나 이상의 요소를 추가해야 하지만 내부 배열에 여유 슬롯이 없는 경우 ArrayList 내부에서 다음과 같은 일이 발생 합니다 .

a) 현재 내부 배열보다 50% 더 큰 다른 배열과 하나의 요소가 생성됩니다.

b) 이전 배열의 모든 요소가 새 배열로 복사됩니다.

c) 새 배열은 ArrayList 개체의 내부 배열로 저장됩니다. 이전 배열은 쓰레기로 선언됩니다 (단지 해당 배열에 대한 참조 저장을 중지함)."

정렬 배열목록
배열 끝에 요소 추가
이 작업은 지원되지 않습니다.
list.add(s);
배열 중간에 요소 추가
이 작업은 지원되지 않습니다.
list.add(15, s);
배열의 시작 부분에 요소 추가
이 작업은 지원되지 않습니다.
list.add(0, s);
배열에서 요소 삭제
로 요소를 삭제할 수 있습니다 list[3] = null. 그러나 이것은 어레이에 '구멍'을 남길 것입니다.
list.remove(3);

"이 ArrayList로 어떻게 작업합니까?"

"실제로 일반 배열을 사용하는 것과 같습니다. 보세요. ArrayList 작업을 배열 작업과 비교해 봅시다. ' 10개의 문자열을 읽고 화면에 역순으로 표시 '해야 한다고 가정해 보겠습니다."

"이거 봐요:

배열로
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
ArrayList 사용
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

각 열에서 유사한 작업을 강조하기 위해 동일한 색상을 사용했습니다."

"한편으로는 모든 것이 다릅니다. 다른 한편으로는 여전히 동일합니다."

"맞아요. ArrayList 로 작업할 때 대괄호를 사용하지 않는다는 점만 빼면요. 대신 get , setadd 메서드를 사용합니다 ."

"네, 이만큼 모았습니다. 그래도 너무 똑같아 보여요."