[java] 자바 동적 배열 크기?

xClass의 배열에로드하려는 클래스-xClass가 있으므로 선언합니다.

xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();

그러나 10 개가 필요한지 모르겠습니다. 그 문제에 대해 8 개 또는 12 개 또는 다른 번호가 필요할 수 있습니다. 런타임까지 알 수 없습니다. 배열의 요소 수를 즉시 변경할 수 있습니까? 그렇다면 어떻게?



답변

아니요, 일단 생성 된 배열의 크기는 변경할 수 없습니다. 필요하다고 생각하는 것보다 더 크게 할당하거나 크기를 늘리기 위해 재 할당해야하는 오버 헤드를 수용해야합니다. 그렇다면 새 데이터를 할당하고 이전 데이터를 새 데이터로 복사해야합니다.

int[] oldItems = new int[10];
for (int i = 0; i < 10; i++) {
    oldItems[i] = i + 10;
}
int[] newItems = new int[20];
System.arraycopy(oldItems, 0, newItems, 0, 10);
oldItems = newItems;

이 상황에 처해 있다면 Java Collections를 대신 사용하는 것이 좋습니다. 특히 ArrayList기본적으로 배열을 래핑하고 필요에 따라 배열을 늘리는 논리를 처리합니다.

List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());

일반적으로는 ArrayList여러 가지 이유로 배열에 대한 바람직한 솔루션입니다. 우선, 배열은 변경 가능합니다. 이 작업을 수행하는 클래스가있는 경우 :

class Myclass {
    private int[] items;

    public int[] getItems() {
        return items;
    }
}

호출자가 개인 데이터 구성원을 변경할 수 있으므로 모든 종류의 방어적인 복사로 이어질 수 있으므로 문제가 발생했습니다. 이것을 목록 버전과 비교하십시오.

class Myclass {
    private List<Integer> items;

    public List<Integer> getItems() {
        return Collections.unmodifiableList(items);
    }
}


답변

자바에서는 배열 길이가 고정되어 있습니다.

List를 사용하여 값을 보유하고 toArray필요한 경우 메소드를 호출 할 수 있습니다 . 다음 샘플을 참조하십시오.

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class A  {

    public static void main( String [] args ) {
        // dynamically hold the instances
        List<xClass> list = new ArrayList<xClass>();

        // fill it with a random number between 0 and 100
        int elements = new Random().nextInt(100);
        for( int i = 0 ; i < elements ; i++ ) {
            list.add( new xClass() );
        }

        // convert it to array
        xClass [] array = list.toArray( new xClass[ list.size() ] );


        System.out.println( "size of array = " + array.length );
    }
}
class xClass {}


답변

다른 사람들이 말했듯이 기존 Java 배열의 크기를 변경할 수 없습니다.

ArrayList는 표준 Java가 동적 크기 배열에 가장 가깝습니다. 그러나 “배열과 유사”하지 않은 ArrayList (실제로는 List 인터페이스)에 대한 몇 가지 사항이 있습니다. 예를 들면 :

  • [ ... ]목록을 색인화하는 데 사용할 수 없습니다 . get(int)set(int, E)메서드 를 사용해야합니다 .
  • 0 요소로 ArrayList가 작성됩니다. 20 개의 요소로 ArrayList를 생성 한 다음 호출 할 수는 없습니다.set(15, foo) .
  • ArrayList의 크기를 직접 변경할 수 없습니다. 당신은 간접적으로 다양한 사용하여 그것을 할 add, insert그리고 remove방법을.

좀 더 배열과 같은 것을 원한다면 고유 한 API를 설계해야합니다. (아마도 누군가가 기존의 타사 라이브러리에 차임 할 수 있습니다. Google을 사용하여 2 분 동안 “연구”하는 라이브러리를 찾을 수 없습니다. :-))

초기화 할 때 증가하는 배열 만 필요한 경우 솔루션은 다음과 같습니다.

ArrayList<T> tmp = new ArrayList<T>();
while (...) {
    tmp.add(new T(...));
}
// This creates a new array and copies the element of 'tmp' to it.
T[] array = tmp.toArray(new T[tmp.size()]);


답변

요소 수를 만들 때 원하는 항목으로 설정합니다.

xClass[] mysclass = new xClass[n];

그런 다음 루프에서 요소를 초기화 할 수 있습니다. 나는 이것이 당신이 필요하다고 생각합니다.

배열을 만든 후 배열에 요소를 추가하거나 제거해야하는 경우 ArrayList.


답변

ArrayList를 사용할 수 있습니다.

import java.util.ArrayList;
import java.util.Iterator;

ArrayList<String> arr = new ArrayList<String>();
arr.add("neo");
arr.add("morpheus");
arr.add("trinity");
Iterator<String> foreach = arr.iterator();
while (foreach.hasNext()) System.out.println(foreach.next());


답변

Arrays.copyOf() 메서드에는 배열 길이가 동적으로 증가하는 문제를 해결하는 많은 옵션이 있습니다.

자바 API


답변

예, 래핑하고 Collections 프레임 워크를 사용합니다.

List l = new ArrayList();
l.add(new xClass());
// do stuff
l.add(new xClass());

그런 다음 필요한 경우 List.toArray ()를 사용하거나 해당 List를 반복합니다.