배열 복사 방식

현재 자바 에서 데이터 복사 방식 은 다음 과 같 습 니 다.
  • clone
  • System.arraycopy
  • Arrays.copyOf
  • Arrays.copyOfRange

  • 다음은 각각 그들의 용법 을 소개 한다.
    1. clone 방법clone 방법 은 Object 류 에서 물 려 받 은 것 으로 기본 데이터 형식 (int, boolean, char, byte, short, float, double, long) 은 clone 방법 으로 직접 복제 할 수 있 으 며, String 유형 은 값 이 변 하지 않 기 때문에 사용 할 수 있 음 을 주의 하 십시오.
  • int 유형 예시
  • int[] a1 = {1, 3};
    int[] a2 = a1.clone();
    
    a1[0] = 666;
    System.out.println(Arrays.toString(a1));   //[666, 3]
    System.out.println(Arrays.toString(a2));   //[1, 3]
    
  • String 타 입 예시
  • String[] a1 = {"a1", "a2"};
    String[] a2 = a1.clone();
    
    a1[0] = "b1"; //  a1       
    System.out.println(Arrays.toString(a1));   //[b1, a2]
    System.out.println(Arrays.toString(a2));   //[a1, a2]
    

    2、System.arraycopy System.arraycopy 방법 은 로 컬 방법 으로 소스 코드 에서 다음 과 같이 정의 합 니 다.
    public static native void arraycopy(Object src, int srcPos, Object dest, int desPos, int length)
    

    그 매개 변 수 는 다음 과 같다.
  • (원수 조, 원수 조 의 시작 위치, 목표 수조, 목표 수조 의 시작 위치, 복사 개수)
  • 용법 예시
    int[] a1 = {1, 2, 3, 4, 5};
    int[] a2 = new int[10];
    
    System.arraycopy(a1, 1, a2, 3, 3);
    System.out.println(Arrays.toString(a1)); // [1, 2, 3, 4, 5]
    System.out.println(Arrays.toString(a2)); // [0, 0, 0, 2, 3, 4, 0, 0, 0, 0]
    

    이 방법 을 사용 할 때 는 이미 분 배 된 메모리 셀 의 배열 로 복사 해 야 합 니 다.
    3、 Arrays.copyOf Arrays.copyOf 밑바닥 도 사실 System. array copy 소스 코드 는 다음 과 같다.
    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
    

    매개 변수 의미:
  • (원수 조, 카피 개수)
  • 사용법 예시:
    int[] a1 = {1, 2, 3, 4, 5};
    int[] a2 = Arrays.copyOf(a1, 3);
    
    System.out.println(Arrays.toString(a1)) // [1, 2, 3, 4, 5]
    System.out.println(Arrays.toString(a2)) // [1, 2, 3]
    

    이 방법 을 사용 하면 우리 가 사전에 new 키 워드 를 사용 하여 대상 에 게 메모리 유닛 을 분배 할 필요 가 없다.
    4、 Arrays.copyOfRange Arrays.copyOfRange 밑바닥 도 사실 System. array copy 를 사용 하 는데 한 가지 방법 에 불과 하 다.
    public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }
    

    매개 변수 의미
  • (원수 조, 시작 위치, 복사 개수)
  • 사용법 예시:
    int[] a1 = {1, 2, 3, 4, 5};
    int[] a2 = Arrays.copyOfRange(a1, 0, 1);
    
    System.out.println(Arrays.toString(a1)) // [1, 2, 3, 4, 5]
    System.out.println(Arrays.toString(a2)) // [1]
    

    마지막 으로 주의해 야 할 것 은 기본 유형의 복사 가 원래 배열 의 값 에 영향 을 주지 않 는 다 는 것 이다. 인용 유형 이 라면 여기 서 사용 할 수 없다. 배열 의 복사 가 얕 은 복사 이기 때문에 기본 유형 에 대해 서 는 가능 하고 인용 유형 에 적합 하지 않다.
    5. 그러면 대상 의 깊이 있 는 복사 본 을 어떻게 실현 합 니까?
    5.1 Cloneable 인터페이스 실현
    Cloneable 인 터 페 이 스 를 실현 하고 clone 방법 을 다시 작성 합 니 다. 이 인 터 페 이 스 를 실현 하지 않 으 면 clone 방법 을 직접 사용 하 는 것 은 컴 파일 이 통 하지 않 습 니 다.
    /**
     * Created by Joe on 2018/2/13.
     */
    public class Dog implements Cloneable {
        private String id;
        private String name;
    
    	public Dog(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
        //    getter 、 setter    toString   
    
        @Override
        public Dog clone() throws CloneNotSupportedException {
            Dog dog = (Dog) super.clone();
    
            return dog;
        }
    }
    

    예시:
    Dog dog1 = new Dog("1", "Dog1");
    Dog dog2 = dog1.clone();
    
    dog2.setName("Dog1 changed");
    
    System.out.println(dog1); // Dog{id='1', name='Dog1'}
    System.out.println(dog2); // Dog{id='1', name='Dog1 changed'}
    

    5.2 조합 류 딥 카피
    만약 에 한 종류 안에 다른 종 류 를 인용 하고 다른 종 류 는 다른 종 류 를 인용 하면 깊이 있 게 복사 하려 면 모든 종류 와 인용 종 류 는 Cloneable 인 터 페 이 스 를 실현 하고 clone 방법 을 다시 써 야 한다. 그러면 매우 번 거 롭 고 간단 한 방법 은 모든 이미지 에 직렬 화 인터페이스 (Serializable) 를 실현 하 는 것 이다.그 다음 에 직렬 화 된 반 직렬 화 방법 으로 대상 을 깊이 복사 합 니 다.
    public Dog myClone() {
    	Dog dog = null;
    
    	try {
    		//         ,              
    		//         JVM ,               
    		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    		ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    		objectOutputStream.writeObject(this);
    
    		//        
    		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    		ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
    		dog = (Dog) objectInputStream.readObject();
    	} catch (IOException | ClassNotFoundException e) {
    		e.printStackTrace();
    	}
    
    	return dog;
    }
    

    요약: 본 고 는 자바 안의 배열 복사 에 관 한 몇 가지 방식 과 용법 을 소개 하 였 으 며, 자바 에서 대상 의 깊이 있 는 복사 방법 을 제시 하 였 으 며, 필요 하지 않 으 면 일반적인 상황 에서 대상 의 깊이 있 는 복사 를 사용 하지 않도록 주의 하 였 으 며, 성능 이 비교적 떨 어 지기 때문에, 자신 이 깊이 있 는 복사 기능 을 실현 하 는 것 을 제외 하고, 인터넷 에서 도 이러한 기능 을 통합 하 였 다. 예 를 들 어apache 의 common-lang3 원 리 는 모두 대동소이 하 므 로 관심 이 있 는 학생 들 은 스스로 공부 할 수 있 습 니 다.
    원문:https://blog.csdn.net/u011669700/article/details/79323251

    좋은 웹페이지 즐겨찾기