자바의 정수 물체에 대한 참조
Java에는 포인터가 없지만 참조 개념도 있습니다. 우리가 여기서 이야기하고 싶은 것은 정수가 같은 대상인지 여부입니다.
1. 먼저 코드를 살펴 보겠습니다.
public static void main (String [] args) {Integer a1 = 100; 정수 b1 = a1; // 다른 하나는 b1 = 100 필드 필드 = null; {field = a1.getClass (). getDeclaredfield ( "value"); } catch (nosuchfieldException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (SecurityException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } field.setAccessible (true); try {field.set (a1, 5000); } catch (delegalargumentexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (불법 행위 exception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println ( "b1 ="+b1); 정수 C1 = 100; System.out.println ( "C1 ="+C1); } 결과:
B1 = 5000
C1 = 5000
위에서, 우선, 여기에 몇 가지 사항을 설명하고 싶습니다.
1) 정수의 경우 -128-127 사이의 정수가 초기화되어 정수에 배치되었습니다. 포장되면 물체가 가져갑니다.
2) B1 = A1은 수치 할당입니까 아니면 동일한 개체입니까? 이것은 B1과 A1이 동일한 숫자 값이 아닌 동일한 객체를 가리킨다는 결과에서 볼 수 있습니다.
3) C1 = 100은 -128-127 사이의 값에 대해 IntegerCache에서 얻은 모든 물체를 의미합니다. 100에 해당하는 정수 물체가 변경되면 100의 후속 포장이 변경됩니다. 캐시에서 객체를 얻을 때 배열 인덱스가 사용되므로 수치 비교가 사용되지 않습니다.
그러나이 캐시를 수정하는 것은 더 위험 할 것이므로 신경 쓰지 마십시오. 누가 100 위안을 포장 할 JAR 패키지 나 플랫폼을 알고 있지만 결과는 100 위안이 아니며 당시에 충돌합니다.
2. 위의 설명을 통해 이것으로 변경되면 대답은 무엇입니까?
public static void main (String [] args) {Integer a1 = 200; 정수 B1 = A1; 필드 필드 = null; {field = a1.getClass (). getDeclaredfield ( "value"); } catch (nosuchfieldException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (SecurityException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } field.setAccessible (true); try {field.set (a1, 5000); } catch (delegalargumentexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (불법 행위 exception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println ( "b1 ="+b1); 정수 C1 = 200; System.out.println ( "C1 ="+C1); } 3. 그런 다음 변경하십시오
public static void main (String [] args) {Integer a1 = new Integer (100); 정수 B1 = A1; 필드 필드 = null; {field = a1.getClass (). getDeclaredfield ( "value"); } catch (nosuchfieldException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (SecurityException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } field.setAccessible (true); try {field.set (a1, 5000); } catch (delegalargumentexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (불법 행위 exception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println ( "b1 ="+b1); 정수 C1 = 100; System.out.println ( "C1 ="+C1); } 답은 무엇입니까? 새로운 작업의 경우 객체는 박스가 아니지만 힙에 생성됩니다.
복싱, 캐싱 및 인용을 이해하면 이해하기가 어렵지 않습니다. 직접 시도해 볼 수 있습니다.
기본 지식을 먼저 받자
기본 유형 및 래퍼 클래스의 서신 바이트 바이트 짧은 짧은 int 정수 긴 플로트 플로트 플로트 플로트 더블 숯 문자 부울 부울
상기 8의 기본 데이터 유형 사이의 대응은 int-> 정수 char-> 문자 일뿐입니다. 두 가지 변경 사항은 중요하며 나머지는 첫 번째 문자를 소문자로 변환합니다.
JDK5의 새로운 기능에 대해 알아 봅시다 : 자동 패킹 및 Unboxing
자동 권투 : 기본 유형을 포장 클래스 유형으로 변환합니다
자동 개폐 : 래퍼 클래스 유형을 기본 유형으로 변환
공개 클래스 demo_integer {public static void main (String [] args) {// jdk1.5 int a = 100; 정수 A1 = 새로운 정수 (A); // 기본 데이터 유형을 객체, Box int b = a1.intValue ()로 랩합니다. // 객체를 기본 데이터 유형으로 변환하고 jdk1.5 int x = 100 이후 // unbox를 변환합니다. 정수 x1 = x; // 자동으로 상자, 기본 데이터 유형을 개체 int y = x1 + x로 변환합니다. // 자동 UNBOX, 객체를 기본 데이터 유형으로 변환}}주목해야 할 것
공개 클래스 demo_integer {public static void main (String [] args) {Integer a = null; int b = a + 100; // 자동 Unboxing의 하단 계층은 a.intvalue (), a는 null이며, a는 자연스럽게 nullpointerexception system.out.println (b); }}인터뷰 질문
공개 클래스 demo_integer {public static void main (String [] args) {Integer i1 = new Integer (97); 정수 i2 = 새로운 정수 (97); System.out.println (i1 == i2); System.out.println (i1.equals (i2)); system.out.println ( "-------------"); 정수 i3 = 새로운 정수 (197); 정수 i4 = 새로운 정수 (197); System.out.println (i3 == i4); System.out.println (i3.equals (i4)); System.out.println ( "--------------"); }}출력 : False True -----------------------------------
이유:
새로운 것은 힙 메모리에서 공간을 열는 것이며, 자연스러운 비교 주소 값 (==)은 거짓입니다.
정수는 Equals 메소드를 다시 작성하므로 Equals 출력이 참입니다.
위의 요점이 아니기 때문에 너무 단순하고 기술적 인 내용이 없다고 생각할 수 있습니다. 아래 코드를보십시오.
공개 클래스 demo_integer {public static void main (String [] args) {Integer i1 = 127; 정수 i2 = 127; System.out.println (i1 == i2); System.out.println (i1.equals (i2)); System.out.println ( "--------------"); 정수 i3 = 128; 정수 i4 = 128; System.out.println (i3 == i4); System.out.println (i3.equals (i4)); System.out.println ( "--------------"); }}출력 : True True ------------------------------------------
이유:
int가 127보다 큰 경우 두 개체가있는 이유는 무엇입니까? 숫자 127은 매우 친숙하다고 느끼나요?
-128 ~ 127은 바이트의 값 범위입니다. 이 값 범위 내에있는 경우 자동 권투는 새 개체를 생성하지 않고 상수 풀에서 가져옵니다.
바이트의 값 범위가 초과되면 새 개체가 생성됩니다.
기본 계층을 자동으로 포장하고 () 메소드, 간단한 소스 코드 분석 (JDK1.8)을 호출합니다.
Public Final Class Integer는 숫자를 확장 할 수있는 <integer> {public static integer valuef (int i) {// i> = -128 및 i <= 127의 경우, 버퍼의 객체는 (i> = integercache.low && i <= integercache.high) returgercache.cache.cache.cache.cache.cache.cache (-ingercache); 새로운 정수 (i); // 바이트 값 범위가 범위를 초과하면 힙 메모리에서 생성됩니다} // 내부 클래스는 버퍼 개인 정적 클래스 integercache {정적 최종 int 낮음 = -128; 정적 최종 INT High; 정적 최종 정수 캐시 []; static {// 높은 값은 int h = 127 특성으로 구성 될 수 있습니다. 문자열 integercachehighpropvalue = sun.misc.vm.getSavedProperty ( "java.lang.integer.integercache.high"); if (integercachehighpropvalue! = null) {try {int i = parseint (integercachehhighpropvalue); i = math.max (i, 127); // 최대 배열 크기는 정수입니다 .max_value h = math.min (i, integer.max_value- (-low) -1); } catch (numberformatexception nfe) {// 속성을 int로 구문 분석 할 수없는 경우 무시하십시오. }} High = H; 캐시 = 새 정수 [(High -Low) + 1]; int j = 낮음; for (int k = 0; k <cache.length; k ++) 캐시 [k] = 새 정수 (j ++); // 범위 [-128, 127]는 내재화되어야합니다 (JLS7 5.1.7) assert integercache.high> = 127; } private integercache () {}}} 8 개의 기본 유형의 랩핑 클래스 및 객체 풀
Java의 기본 유형의 래퍼 클래스의 대부분은 지속적인 풀링 기술을 구현합니다. 이 클래스는 바이트, 짧고 정수, 길고, 캐릭터, 부울이며, 부동 소수점 번호가있는 다른 두 유형의 래퍼 클래스는 구현되지 않습니다. 또한, 5 개의 정수 래퍼 클래스의 바이트, 짧은, 정수, 긴, 캐릭터의 캐릭터는 해당 값이 127보다 작거나 같을 때만 객체 풀을 사용할 수 있습니다.
확장 된 지식
JVM 사양에서 각 유형에는 자체 일정한 풀이 있습니다. 상수 풀은 직접 상수 (원시 유형, 문자열) 및 다른 유형, 필드 및 방법에 대한 상징적 참조를 포함하여 특정 유형에 의해 사용되는 상수의 순서가 정렬 된 모음입니다. 컴파일 시간에 다른 유형을 직접 지정하는 것이 아니라 상징적 인 참조 인 이유는 Java가 동적으로 바인딩되기 때문에 런타임에만 특정 규칙에 따라 유형의 특정 종속성 인스턴스가 결정되기 때문입니다. 이것은 Java가 다형성을 구현하는 기초입니다.
JVM에서 클래스의 전체 수명주기는 가상 머신 메모리에로드되고 메모리에서 언로드 될 때까지 시작됩니다. 전체 수명주기에는 로딩, 검증, 준비, 구문 분석, 초기화, 사용 및 언로드가 포함됩니다. 구문 분석 단계는 상수 풀의 기호 참조를 직접 참조로 대체하는 가상 머신의 프로세스입니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.