programing

Arrays.asList() vs Collections.singletonList()

prostudy 2022. 8. 15. 09:19
반응형

Arrays.asList() vs Collections.singletonList()

Arrays.asList(something)를 Collections.singletonList(something)보다 사용하여 하나의 항목을 포함하는 목록을 만드는 데 이점(또는 큰 차이)이 있습니까?후자는 반환된 목록도 불변하게 만듭니다.

Collections.singletonList(something)변치 않는 반면Arrays.asList(something)고정 크기입니다.List목록과 배열이 힙에 결합되는 배열의 표현입니다.

Arrays.asList(something)에서는 비구조적인 변경이 허용되며, 이는 목록과 결합된 배열 모두에 반영됩니다.특정 인덱스에 대해 요소를 설정할 수 있지만 요소를 추가하거나 제거할 때 사용합니다.

반환된 목록에 대한 변경 사항Collections.singletonList(something)이 됩니다.

또한 반환된 목록 용량:Collections.singletonList(something)항상 1이 됩니다.Arrays.asList(something)백업 어레이의 용량이 됩니다.

싱글톤 리스트는 배열에 의해 백업되는 것이 아니라 하나의 아이템에 대한 참조가 있을 뿐이라는 것을 덧붙입니다.메모리 사용량이 적고 작성하는 목록의 수에 따라 큰 영향을 미칠 수 있습니다.

방법Arrays.asList지정된 배열에서 지원되는 고정 크기 목록을 반환합니다.메서드는 의 인스턴스를 반환합니다.ArrayList 클래스는 프라이빗네스트 스태틱클래스로 확장됩니다.AbstractList가 아니라java.util.ArrayList이 정적 클래스는 예를 들어 몇 가지 메서드를 구현합니다.set, indexOf, forEach, replaceAll등입니다만, 기동할 때는add그 자체의 실장은 없고 오히려 그 방법으로부터AbstractList를 호출하여 를 슬로우합니다.java.lang.UnsupportedOperationException.

Collections.singletonList는 지정된 오브젝트만 포함하는 불변의 목록을 반환하며 시리얼화도 가능합니다.

한편, 불변의 리스트에 대해서는, 통상,Collections.unmodifiableList지정된 목록의 변경할 수 없는 보기를 반환합니다.

List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);     
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot

수정할 수 없는 뷰 컬렉션은 수정할 수 없는 컬렉션이며 백업 컬렉션에 대한 보기이기도 합니다.백업 컬렉션에 대한 변경은 계속 가능하며 변경이 발생할 경우 수정할 수 없는 보기를 통해 볼 수 있습니다.

Java 10 이상에서는 진정한 불변의 리스트를 작성할 수 있습니다.수정할 수 없는 목록을 가져오려면 다음 두 가지 방법이 있습니다.

  1. var unmodifiableList = List.copyOf(srcList);
  2. var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());이 두 변수 중 하나를 사용하더라도 값은 여전히 "Apricot"이 아닌 "Apple"이 됩니다.

Java 10 문서따르면:

List.of ★★★★★★★★★★★★★★★★★」List.copyOf할 수없는 을 쉽게 할 수 .static factory는 변경할 수 없습니다.이러한 방법으로 작성된 List 인스턴스에는 다음과 같은 특징이 있습니다.

  1. 수정할 수 없습니다.요소를 추가, 제거 또는 교체할 수 없습니다.리스트상의 임의의 돌연변이 메서드를 호출하면 항상 다음과 같은 원인이 됩니다.UnsupportedOperationException으로 나타날 수 .그러나 포함된 요소 자체가 변경 가능한 경우 목록 내용이 변경되는 것처럼 보일 수 있습니다.
  2. elementsnull은 허용되지 .하려고 하면 null이 .NullPointerException.
  3. 모든 요소를 직렬화할 수 있는 경우 직렬화할 수 있습니다.
  4. 목록의 요소 순서는 지정된 인수 또는 제공된 배열 요소의 순서와 동일합니다.
  5. 그들은 그렇다.value-based발신자는 반환된 인스턴스의 ID에 대해 추측하지 마십시오.공장에서는 새로운 인스턴스를 생성하거나 기존 인스턴스를 재사용할 수 있습니다.따라서 이러한 인스턴스(참조 등호화(==), ID 해시 코드 및 동기화)에 대한 ID에 민감한 작업은 신뢰할 수 없으므로 피해야 합니다.
  6. [ Serialized Form ]페이지에 지정된 대로 시리얼화 됩니다.

언급URL : https://stackoverflow.com/questions/26027396/arrays-aslist-vs-collections-singletonlist

반응형