sourcecode

Java Array List 복사

copyscript 2022. 8. 16. 23:34
반응형

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

「 」를 하는 l2object를 내용이 됩니다.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개의 요소로 되어 있습니다.l23월 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() 메서드가 있습니다.

예를 들어 sourceListtargetList의 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

반응형