답변:
x
컬렉션은 어디에 있습니까?
Foo[] foos = x.toArray(new Foo[x.size()]);
x.toArray(new Foo[0])
--- 문서 : 읽을 시간 없음 ...
(new Foo[0])
. Collection.toArray 문서에 따르면`@param a이 컬렉션의 요소가 저장 될 배열입니다. 충분히 크면 새 배열에 직접 저장할 것입니다. 크기 0 배열을 지정하면 새 배열이 만들어집니다. 즉, 작은 배열과 불필요한 경우 큰 배열이 만들어집니다.
toArray
올바른 유형의 대상 배열을 생성하기 위한 힌트 일뿐 입니다. 그리고이 경우 솔직히 내 응용 프로그램에서 하나의 추가 빈 배열에 대해 신경 쓰지 않을 것입니다. 소음 수준보다 훨씬 낮습니다.
new Foo[0]
간단하다 "최고 (메모리)하지만"... 즉, 나는 내 솔루션을 쉽게하지만 것을 의미하지 않는 것이 좋습니다 (내가 사용하는 이유의 그 :
).
new Foo[0]
카를로스에 의해 제안 된 변형은이 문제를 겪지 않는다.
Java 8을 사용하여 업데이트 된 질문에 대한 대체 솔루션 :
Bar[] result = foos.stream()
.map(x -> new Bar(x))
.toArray(size -> new Bar[size]);
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
두 번 이상 사용하거나 루프에서 사용하는 경우 상수를 정의 할 수 있습니다.
public static final Foo[] FOO = new Foo[]{};
다음과 같은 변환을 수행하십시오.
Foo[] foos = fooCollection.toArray(FOO);
이 toArray
메서드는 빈 배열을 사용하여 대상 배열의 올바른 유형을 결정하고 새 배열을 만듭니다.
업데이트에 대한 제 제안은 다음과 같습니다.
Collection<Foo> foos = new ArrayList<Foo>();
Collection<Bar> temp = new ArrayList<Bar>();
for (Foo foo:foos)
temp.add(new Bar(foo));
Bar[] bars = temp.toArray(new Bar[]{});
const
Java가 아닙니다! public static final Foo[] FOO = {}
import static
하여 중앙 클래스를 만든 다음이를 사용 하여 얻을 수도 있습니다.
JDK / 11에서 a Collection<Foo>
를 로 변환하는 다른 방법은 다음 Foo[]
과 Collection.toArray(IntFunction<T[]> generator)
같이 사용하는 것입니다.
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
에 의해 설명으로 메일 링리스트에 @Stuart (강조 광산), 이것의 성능은 기본적으로 기존의 것과 동일해야합니다 Collection.toArray(new T[0])
-
결론적으로 그 구현이 사용하는 것입니다
Arrays.copyOf(
) 아마 때문에 가장 빠르다 는 고유이다 .전체 배열 내용을 덮어 쓸 것임을 알고 있기 때문에 새로 할당 된 배열을 0으로 채우는 것을 방지 할 수 있습니다. 이는 공개 API가 어떻게 생겼는지에 관계없이 사실입니다.
JDK 내의 API 구현은 다음과 같습니다.
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
기본 구현은
generator.apply(0)
길이가 0 인 배열을 가져 오기 위해 호출 한 다음 단순히toArray(T[])
. 이것은Arrays.copyOf()
빠른 경로 를 통과 하므로 기본적으로toArray(new T[0])
.
참고 :-값이있는코드에 사용할 때API 사용은 이전 버전 과의 비 호환성 과 함께 안내되어야null
합니다. 예를 들어toArray(null)
이러한 호출은 기존 때문에 모호toArray(T[] a)
하고 컴파일에 실패하기때문입니다.
프로젝트에서 Guava를 사용하는 경우 Iterables::toArray
.
Foo[] foos = Iterables.toArray(x, Foo.class);
다음은 업데이트 섹션의 사례에 대한 최종 솔루션입니다 (Google 컬렉션의 도움으로).
Collections2.transform (fooCollection, new Function<Foo, Bar>() {
public Bar apply (Foo foo) {
return new Bar (foo);
}
}).toArray (new Bar[fooCollection.size()]);
그러나 여기서 핵심 접근 방식 은 doublep의 답변 에서 언급되었습니다 (나는 toArray
방법을 잊었습니다 ).
new Bar[0]
문제를 피합니다.
예를 들어 Student 클래스 요소가있는 컬렉션 ArrayList가 있습니다.
List stuList = new ArrayList();
Student s1 = new Student("Raju");
Student s2 = new Student("Harish");
stuList.add(s1);
stuList.add(s2);
//now you can convert this collection stuList to Array like this
Object[] stuArr = stuList.toArray(); // <----- toArray() function will convert collection to array
Stream.toArray
은 JDK 의 기존 API 와 일치합니다 .