Java Array List 복사
는 i i나 an an an i i i i i i i 。ArrayList
l1
가 10입니다.l1
유형 " " " " "l2
. 이것다 . . . .l1
★★★★★★★★★★★★★★★★★」l2
점을 ArrayList
오브젝트?또는 의 복사입니다.ArrayList
" "에 l2
「 」를 하는 l2
object를 내용이 됩니다.l1
참조 유형도 참조하십시오.
예를 들어 다음과 같습니다.
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
목록 오브젝트의 복사본을 새 참조 변수에 할당하는 방법은 2개의 목록 오브젝트를 만들고 이전 컬렉션에서 새 컬렉션으로 복사하는 방법 외에 없습니까?
네, 할당은 단지 의 값을 복사하는 것입니다.l1
으로) 에l2
을 하다
단, 얕은 복사본을 작성하는 것은 매우 간단합니다.
List<Integer> newList = new ArrayList<>(oldList);
(일례로)
사용해보십시오.
네, □□입니다.l1
★★★★★★★★★★★★★★★★★」l2
동일한 참조, 동일한 개체를 가리킵니다.
다른 ArrayList를 기반으로 새 ArrayList를 만들려면 다음 절차를 수행합니다.
List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");
결과는 다음과 같습니다.l1
와 2개의 요소로 되어 있습니다.l2
3월 1일, 3번으로 하다
src ArrayList에서 대상 ArrayList로 값을 복사하는 또 다른 편리한 방법은 다음과 같습니다.
ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);
이는 참조만 복사하는 것이 아니라 실제 값 복사입니다.
하나의 ArrayList를 다른 ArrayList로 복사하는 데 도움이 되는 addAll() 메서드가 있습니다.
예를 들어 sourceList와 targetList의 2가지 어레이 목록이 있습니다.다음 코드를 사용합니다.
targetList.addAll(sourceList);
Java는 객체를 전달하지 않고 객체에 참조(포인터)를 전달합니다.따라서 l2와 l1은 같은 오브젝트에 대한2개의 포인터입니다.
동일한 내용을 가진 두 개의 다른 목록이 필요한 경우 명시적 복사본을 만들어야 합니다.
List.copyOf
list(수정 불가능한 목록
질문:
리스트의 복사본을 할당하는 다른 방법은 없습니까?
Java 9는 리터럴을 사용하여 알 수 없는 콘크리트 클래스를 만드는 방법을 도입했습니다.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
그와 함께 우리는 또한 얻었다.이 메서드도 수정할 수 없는 값을 반환합니다.List
구체적인 등급은 알 수 없다.
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
"수정할 수 없음"이란 목록 내의 요소 수와 각 슬롯에 요소로서 유지되는 객체 참조가 고정됨을 의미합니다.요소를 추가, 삭제 또는 교체할 수 없습니다.그러나 각 요소에 유지되는 객체 참조는 가변적일 수도 있고 그렇지 않을 수도 있습니다.
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
이 코드는 IdeOne.com에서 라이브로 실행됩니다.
dates.toString() : [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString() : [앨리스 블루, 파파야]휘핑, DarkSlateGray]
masterColors.toString() : [앨리스 블루, 파파야]Wip, Chartreuse, DarkSlateGray]
오브젝트 참조에 대해 질문했습니다.다른 사람이 말한 것처럼 하나의 목록을 만들어 두 개의 참조 변수(포인터)에 할당해도 하나의 목록만 남아 있습니다.둘 다 같은 목록을 가리키고 있습니다.어느 하나의 포인터를 사용하여 목록을 수정하면 메모리에는 목록이1개밖에 없기 때문에 나중에 양쪽 포인터에 변경이 표시됩니다.
그래서 당신은 그 목록을 복사해야 합니다.이 복사본을 수정할 수 없는 경우List.copyOf
이 답변에서 설명한 방법.이 방법에서는 각각 동일한 콘텐츠개체에 대한 참조를 유지하는 요소가 포함된 두 개의 개별 목록이 생성됩니다.예를 들어 위의 예에서는String
색을 나타내는 물체는 기억 속 어딘가에 떠다니고 있다.두 목록에는 동일한 색상 객체에 대한 포인터가 있습니다.여기 도표가 있습니다.
첫 번째 리스트colors
변경할 수 있습니다.즉, 위의 코드와 같이 원래 세 번째 요소를 제거할 수 있습니다.Chartreuse
(2의 지수 = 서수 3)요소를 추가할 수 있습니다.그리고 다른 요소를 가리키도록 요소를 변경할 수 있습니다.String
예를 들어OliveDrab
또는CornflowerBlue
.
이와는 대조적으로, 의 4가지 요소는masterColors
고정되어 있습니다.제거, 추가, 다른 색상 대체는 없습니다.그거List
구현은 변경할 수 없습니다.
완료를 위해:위의 답변은 모두 원본 객체의 참조를 유지한 얕은 복사입니다.상세 복사를 원하는 경우 목록의 (reference-) 클래스는 단일 개체의 상세 복사를 제공하는 복제/복사 메서드를 구현해야 합니다.다음으로 다음을 사용할 수 있습니다.
newList.addAll(oldList.stream().map(s->s.clone()).collect(Collectors.toList()));
언급URL : https://stackoverflow.com/questions/6536094/java-arraylist-copy
'sourcecode' 카테고리의 다른 글
Vuex가 정의되지 않은 속성 '상태'를 읽을 수 없음 (0) | 2022.08.16 |
---|---|
Vue 및 Vuex를 사용하여 Firebase 인증이 작동하지 않음 (0) | 2022.08.16 |
Windows 의 C 에 디렉토리가 존재하는지 어떤지를 확인하려면 어떻게 해야 합니까? (0) | 2022.08.16 |
Vuex에서 알 수 없는 돌연변이 유형 us (0) | 2022.08.16 |
vue-test-utils 설정 typeError: 문자열에 속성 '_Ctor'를 생성할 수 없습니다. (0) | 2022.08.16 |