얕은 복사 및 자바의 깊은 복사 할당 && 문자열 유형을 객체

자바 데이터 유형은 기본 데이터 유형 및 참조 데이터 유형으로 구분된다. 할당, 송신 파라미터 또는 방법의 반환 값을 수행하는 데이터의 양 유형, 값은 참조에 의해 전달되며, 차이 (어드레스)가 송신된다.

얕은 복사 (얕은 복사) :

상기 데이터 타입은 기본 데이터 타입의 멤버 변수이기 ①, 단순 복사본은 새로운 사본 객체의 속성 값, 즉, 값을 직접 전송. 두 개의 다른 데이터가되는 객체의 멤버 변수 값을 수정할 수 있기 때문에, 대상물의 다른 복사본을 획득 데이터에 영향을 미치지 않을 것이다.

② 데이터 타입 인스턴스 변수의 멤버 변수의 데이터 타입에 대한 참조는 같은 객체의 클래스로 부재의 배열 때문에 단순 복사본을 전달한다 참고 문헌, 즉, 단지 기준값 (메모리 어드레스)의 멤버 변수입니다 새 개체에 복사합니다. 실제로 두 객체의 멤버 변수가 동일한 인스턴스를 가리 때문이다. 이 경우, 대상 부재 변수의 변형에 다른 객체의 멤버 변수의 값에 영향을 미친다.

주 : 상수 값에 의해 해당 기본 유형 문자열 데이터 형식, 즉, 기준 데이터 유형 새로운 키워드를 통해 객체를 생성

다음과 같은 조건에서 개체의 단순 복사본입니다 :

(1) 복사 생성자

(2) 일반 재 작성 클론 () 메소드 (Cloneable 인터페이스를 구현해야합니다 클래스의 복제 방법을 사용하여, 그렇지 않으면 예외 CloneNotSupportedException가 발생합니다)

깊은 복사 :

우선 개체 그래프의 개념을 도입 하였다. 클래스 오브젝트를 가지고 상상 그 멤버가 판정 될 때까지 다른 객체 인스턴스를 가리키는 다른 목적, 다른 목적, 변수를 가리키는 오브젝트를 갖는다. 이것은 객체 그래프를 형성한다.

깊은 사본뿐 아니라 모든 멤버 변수 값의 기본 데이터 타입의 오브젝트를 복사뿐만 아니라 모든 멤버 변수 참조 데이터 유형에 대한 저장 공간을 적용하고, 객체가 될 수있을 때까지 사본 각 멤버 변수 참조 대상 데이터 타입 언급 모든 객체. 즉, 전체 개체 그래프의 복사본을 만들 수 있습니다!

간단히 말해, 모든 객체의 객체 그래프 참조 데이터 유형의 멤버 변수의 깊은 복사 메모리 공간이 개방되어, 그냥 배달 주소를 가리 얕은 복사, 새 개체 참조 데이터 유형의 메모리 공간을 만들지 않습니다.

메모리를 생성하고, 전체 객체 그래프를 복사하므로이를 단순 복사본 느린 전체 복사본 큰 비용과 비교된다.

다음의 경우는 객체의 딥 카피 있습니다 :

도 1의 객체의 각 층의 각각의 목적이 복제 인터페이스를 구현하고, 최상위 클래스의 마지막 재기록 클론 방식을 재정의한다 : (1) 모든 개체는 개체 전체 복사본을 달성하기 위해도 클론 () 메소드를 재정의되고 모든 복제 방법은 복제 방법은 딥 카피에 실현 될 수있다 호출합니다. 간단하게 말해서 : 각 레이어의 모든 객체는 얕은 복사 = 전체 복사본입니다.

(2) 전체 복사본 객체 직렬화함으로써 달성

 

새로운 건설 및 String 객체의 사용 사이의 차이에 의해 할당 된 자바 문자열 상수

문자열 str1이 = "ABC"; 
문자열과 str2 = 새 문자열 ( "ABC");

문자열 STR1 = "ABC"가, 또는 "ABC"문자열 자바 문자열 풀에없는 경우, 상기 풀 String 객체 ( "ABC")를 생성하기 위해 자바 문자열에서 생성 될 객체를 생성 만들 수 있고, 그 다음 STR1 이 관계없이 결국 이런 식으로 미래에서 만든 "ABC"문자열 객체, 항상 하나의 메모리 주소가 할당되고, 문자열의 복사본입니다 얼마나 많은 메모리 주소를 가리키는, 자바는 "문자열 거주자"라고 모든 문자열 상수가 자동으로 컴파일 후 상주하고 있습니다.

스트링 (STR2) = 새로운 문자열 ( "ABC")는 적어도 하나 개의 객체를 만들 가능성이 두. 새로운 키워드가 사용되기 때문에, 확실히 힙에서 STR2의 String 객체를 생성합니다, 그 값은 "ABC"입니다. 이 캐릭터 라인이 다시 존재하지 않는 문자열 풀 자바한다면, 자바 수영장에서 String 객체 "ABC"를 생성

코드를 복사
문자열 str1이 = 새로운 문자열 ( "ABC"); 
문자열과 str2 = 새 문자열 ( "ABC"); 
에서 System.out.println (STR1 == STR2); // 잘못된 

문자열 STR3 = "ABC"; 
문자열 STR4 = "ABC"; 
문자열 STR5 = "AB"+ "C"; 
에서 System.out.println (STR3 == STR4); // 사실 
에서 System.out.println (STR3 == STR5); // 실제 


문자열 A = "ABC"; 
문자열 B = "AB"; 
문자열 C = B + "C"; 
에서 System.out.println (a == 온도); // 거짓
코드를 복사

A, B, 컴파일 시간에 결정되어, C는 컴파일 시간에 결정되는 것은 아니다 기준 변수 값 : C에 최종 판정과 동일한가 있습니다. B 런타임 및 "C"바느질은 모두 StringBuilder (JDK1.5되기 전에 StringBuffer를) 통해 이루어집니다,의 toString 기능의 StringBuilder의 마지막 호출은 새로운 String 객체를 반환

사건의 응용 프로그램 : 일반적인 권장 사용, 사용 문자열 = "ABCD"를 만들어, 대신 문자열 문자열 = 새 문자열 ( "ABCD")를 만들려면이 방법으로,이 형태로, 새로운 생성자의 사용이 문자를 작성하기 문자열 객체는 새로운 힙 공간을 열 것, 큰 따옴표는 생성자 이상의 효율을 최적화 된 문자열 인턴의 사용은 (문자열이있는)입니다.

추천

출처www.cnblogs.com/nangonghui/p/11593569.html