Java의 가변 길이 (동적) 배열


답변:


121

예 : ArrayList를 사용 합니다.

Java에서 "일반"배열은 고정 크기입니다. 크기를 지정해야하며 확장하거나 축소 할 수 없습니다. 크기를 변경하려면 새 어레이를 만들고 원하는 데이터를 복사해야합니다. 이는 비효율적이고 고통 스럽습니다.

다행히도 일반적인 데이터 구조를 구현하는 모든 종류의 내장 클래스와 기타 유용한 도구도 있습니다. 전체 목록을 보려면 Java 6 API 를 확인 해야합니다.

한 가지주의 사항 : ArrayList는 기본 요소 (예 : 정수)가 아닌 개체 (예 : 정수) 만 포함 할 수 있습니다. 대부분의 경우 autoboxing / autounboxing은이 문제를 자동으로 처리하지만 수행중인 작업에 따라 이상한 동작이 발생할 수 있습니다.


2
Java에서 다음 코드가 올바른 이유가 궁금합니다. int[] array = new int[size]; size? 내가 바로 @Lord Torgamus 오전, 변수가 있지만, 배열의 길이는 고정되어 있어야합니다
jerry_sjtu

12
@jerry_sjtu 예, 배열은 size프로그램이 진행될 때 일치하도록 크기를 변경하지 않습니다 . size해당 라인이 실행될 때 발생하는 크기를 가져옵니다 .
Pops

ArrayList에서 항목을 제거 할 때마다 끝에 a가 표시 null됩니다. 이유는 무엇입니까?
Aaron Franke

37

Java의 배열은 고정 된 크기입니다. 필요한 것은 Java에서 사용할 수있는 매우 중요한 컬렉션 중 하나 인 ArrayList입니다.

대신에

Integer[] ints = new Integer[x]

너는 사용한다

List<Integer> ints = new ArrayList<Integer>();

그런 다음 사용 목록을 변경 ints.add(y)하고 ints.remove(z)다른 많은 편리한 방법 사이에 적절한 Javadoc과에서 찾을 수 있습니다.

Java에서 사용할 수있는 Collections 클래스는 매우 강력하고 Java 초보자가 불필요하게 다시 작성하려고하는 많은 내장 기능을 제공하므로 공부하는 것이 좋습니다.


시도 할 때까지 작업하고 싶습니다. List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
List<Integer>대신 왜 사용 ArrayList<Integer>합니까?
Dean Meehan

24

배열은 인스턴스화되면 고정 크기입니다. 대신 목록을 사용할 수 있습니다.

Autoboxing은 List를 배열과 유사하게 사용 가능하게 만들고, 단순히 int- 값을 넣을 수 있습니다 :

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
ArrayList가 아닌 List 유형의 참조 변수를 선언하는 이유는 무엇입니까?
LppEdd

2
필요한 경우 단순히 List 구현간에 전환 할 수 있으므로 새 XYZList () 만 변경하면됩니다. 변수가 ArrayList로 선언 된 경우 oyu는이 구현에 특정한 방법을 사용하여 변경이 더 복잡해질 수 있습니다.
Mnementh

1
감사합니다, 이해합니다.
LppEdd

11

나는 이전의 대답이 제안에 동의 ArrayList하기 때문에, ArrayList입니다 하지 동적 배열 있지만 목록은 배열에 근거. 차이점은 다음을 수행 할 수 없다는 것입니다.

ArrayList list = new ArrayList(4);
list.put(3,"Test");

지원 배열이 그러한 추가를 허용하더라도 아직이 위치에 요소가 없기 때문에 IndexOutOfBoundsException을 제공합니다. 따라서 @ randy-lance가 제안한대로 확장 가능한 사용자 지정 배열 구현을 사용해야합니다.



Java8 소스 코드에서 볼 수 있듯이 ArrayList에 put 메소드가 있는지 확실하지 않습니다. 주어진 용량에서 어떻게 작동하는지 알아 내려고합니다. 그러나 ArrayList.add () 메서드를 찾았습니다.
Sanjeet

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

출처 : 동적 배열을 만드는 방법


7
  1. 소규모 크기를 처리하려면 List를 사용하는 것이 좋습니다.

  2. 숫자가 너무 많으면 목록과 오토 박싱을 사용하지 마십시오 .

    List <Integer> 목록

모든 단일 정수에 대해 새로운 정수가 자동으로 생성됩니다. 목록의 크기가 커지면 속도가 느려집니다. 이러한 정수는 불필요한 개체입니다. 이 경우 예상 크기를 사용하는 것이 더 좋을 것입니다.

int[] array = new int[ESTIMATED_SIZE];


4

배열의 크기는 변경할 수 없습니다. 그러나 올바른 크기로 새 어레이를 만들고 이전 어레이의 데이터를 새 어레이로 복사 할 수 있습니다.

그러나 가장 좋은 방법은 jacarta commons의 IntList를 사용하는 것입니다. ( 여기 )

List처럼 작동하지만 공간을 덜 차지하고 int에 래퍼 객체를 저장하는 대신 int를 저장하기 때문에 더 효율적입니다 (이것이 Integer 클래스입니다).


-4

나는이 질문에 대답했고 당신은 arraylist 나 다른 어떤 것이 필요하지 않습니다. 이것은 할당이었고 나는 그것을 완료했습니다. 그래야 배열의 크기가 커질 수 있습니다. 여기에 Java Dynamic Array 사용 방법 링크가 있으며 여기에 Java Dynamic Arrays 에 대한 내 질문에 대한 링크가 있습니다.


1
이것은 단지 잘못되었습니다. 연결된 응답은 System.arrayCopy ()를 호출하여 이전 배열을 크기가 증가한 새 배열에 복사 한 다음 새 항목을 추가합니다. 배열은 여전히 ​​동적 크기를 가질 수 없습니다.
katzenhut 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.