네 가지 기본 Java 질문 중 몇 개는 몇 명입니까?
1. == 기호 사용
먼저, 더 흥미로운 코드를보십시오
정수 A = 1000, B = 1000; 정수 C = 100, d = 100; public void mrun (최종 문자열 이름) {new Runnable () {public void Run () {System.out.println (이름); }}; } system.out.println (a == b); System.out.println (C == D); 이 질문에 대한 정답을 받고 원칙을 이해할 수 있다면. 그것은 당신의 기본이 괜찮다는 것을 의미합니다. 당신의 대답이 진실하고 진실이라면, 당신의 기초는 부족할 것입니다.
먼저 답변을 게시하고 코드를 실행하면 잘못된 사실이됩니다. 우리는 ==가 두 객체의 참조를 비교한다는 것을 알고 있습니다. 여기에 ABCD는 새로 생성 된 개체입니다. 이론적으로 거짓을 입력해야합니다. 이것은이 질문에 대한 흥미로운 것입니다. 인터뷰 질문이든 포럼 토론 영역이든,이 질문의 외관 비율은 매우 높습니다. 원칙은 실제로 매우 간단합니다. Integer.java 클래스를 살펴 보겠습니다. 이해하겠습니다.
공개 정수 정수 가치 (int I) {return i> = 128 || 나는 <-128? 새 정수 (i) : small_values [i + 128]; } / ** * {@link integer#valueof (int)} 및 자동 박스 * / 개인 정적 최종 정수 [] small_values = new Integer [256]; static {for (int i = -128; i <128; i ++) {small_values [i+128] = new Integer (i); }} 정수 c = 100; 현재 자동 권투 작업이 수행됩니다. 간단히 말해서, 기본 데이터 유형을 정수 객체로 변환하고이를 정수 객체로 변환하는 것은 호출되는 메소드의 값입니다. -128-127이 정수에 캐시되어 있음을 알 수 있습니다. 공식적인 설명은 적은 숫자가 더 자주 사용되므로 성능을 최적화하기 위해 그 사이의 숫자가 캐시됩니다. 이것이이 질문에 대한 답이 거짓이고 ture 인 이유입니다. 선언 된 정수 객체의 값이 -128-127 사이 인 경우 동일한 객체가 참조되므로 결과는 참입니다.
2. 문자열
그런 다음 코드를보십시오
문자열 s1 = "abc"; 문자열 s2 = "abc"; 문자열 s3 = 새 문자열 ( "abc"); System.out.println (S1 == S2); System.out.println (S1 == S3);
이 질문에 대한 답이 무엇인지 추측합시다.
==의 구문에 따르면, 우선, S1, S2 및 S3은 세 가지 다른 객체입니다. 상식, 출력은 모두 거짓입니다. 그러나 프로그램의 실행 결과는 실제로 참이고 거짓입니다. 두 번째 출력 허위는 이해할 수 있으며 첫 번째 출력은 다시 수수께끼입니다. 우리는 객체의 일부 기본 유형 변수와 객체의 기준 변수가 함수의 스택 메모리에 할당되는 반면, 새로운 객체와 어레이는 힙 메모리에 저장됩니다. 그러나이 외에도 상수 수영장이라는 또 다른 영역이 있습니다. 일반적으로 문자열 s1 = "abc";, 선언 된 문자열 객체의 값은 상수 풀에 저장됩니다. String S1 = "ABC"와 같은 객체를 만들 때 "ABC"는 상수 풀 (문자열 풀이라고도 함)에 저장됩니다. 참조 문자열 S2 = "ABC"를 만들 때 Java 기본 레이어는 "ABC"가 일정한 풀에 존재하는지 여부를 찾는 데 우선 순위를 정합니다. 그것이 존재하면, S2 가이 값을 가리키고 그것을 재현하지 않을 것입니다. 일정한 수영장이 없으면 수영장에 생성되어 추가됩니다. 그렇기 때문에 대답이 참이고 거짓입니다.
3. 최종 키워드 <br /> 코드를 살펴 보겠습니다.
public void mrun (최종 문자열 이름) {new Runnable () {public void run () {try {thread.sleep (1000); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println (이름); } }.시작(); } 나는 모든 사람들이 이런 종류의 코드를 많이 썼다고 생각합니다. 내부 클래스가 로컬 변수에 액세스하면 로컬 변수 전에 최종 수정자를 추가해야합니다. 그렇지 않으면 컴파일러가 오류를보고합니다. 보통 우리는 똑같이합니다. 두 번째 질문은 왜 최종 수정자를 추가 하는가? 나는 대부분의 친구들 이이 문제에 대해 결코 생각한 적이 없다고 생각합니다. 그들이 그것을 사용할 때마다, 직접 추가하고 원칙에 대해 결코 탐구하지 않았습니다. 이것은 훌륭한 프로그래머에게는 바람직하지 않습니다. 우리는 진실뿐만 아니라 이유를 알아야합니다.
이제 최종 키워드를 추가 해야하는 이유를 분석하겠습니다. 우선, 내부 클래스의 수명주기는 멤버 수준에 있으며 로컬 변수의 수명주기는 메소드 본문에 있습니다. 다시 말해,이 상황은 발생합니다. MRUN 메소드가 실행되면 새 스레드가 실행되고 새 스레드가 잠깐 잠을 자게됩니다. 기본 스레드가 계속 실행되고 Mrun이 실행되고 이름 속성 수명주기가 끝납니다. 1 초 후 Syetem.out.printth (이름)가 실행됩니다. 그러나 현재로서는 이름이 죽었고 더 이상 기억이 없습니다. Java는이 오류를 제거하고 내부 클래스의 로컬 변수를 최종 키워드로 수정해야합니다. 로컬 변수가 최종에 의해 수정 된 후, 로컬 복제본은 메모리에 유지됩니다. 내부 클래스가 액세스하면 실제로 액세스됩니다. 이것은 로컬 변수의 수명주기를 더 길게 만드는 것과 같습니다. 결국, 우리를 위해이 구덩이를 미리 채우는 것은 Java 엔지니어였습니다. 그렇지 않으면 내부 지역 변수에 대해 얼마나 많은 친구가 걱정하는지 궁금합니다.
4. 정수와 int
다음 코드를보십시오
정수 A = 새로운 정수 (1000); int b = 1000; 정수 C = 새로운 정수 (10); 정수 d = 새로운 정수 (10); System.out.println (a == B); System.out.println (C == D);
이 질문은 첫 번째 질문에 대한 후속 조치입니다. 이 질문에 대한 답을 빨리 얻을 수 있다면 == 비교 함수를 더 철저하게 마스터하더라도 축하합니다.
정답을 공개하십시오 : 참, 거짓
많은 친구들 이이 대답을 본 후 당황합니다. 두 번째에 대해 먼저 이야기합시다. 첫 번째 질문에 따르면 정수가 -128-127로 캐시되지 않았습니까? 이것은 사실이어야하지만, 자세히 보면 여기의 정수는 캐시를 사용하지 않고 우리에 의해 생성되므로 결과는 false입니다. 이제 첫 번째가 다시 사실인지 봅시다. 우선, 여기의 가치는 1000이며, 우리가 알고있는 정수 캐시와는 확실히 아무 관련이 없습니다. 캐시와 관련이 없기 때문에 A는 새로운 새로운 새로운 객체이므로 입력은 False 여야합니다. 그러나 B는 여기서 int 유형입니다. int and integer를 비교할 때 Java는 자동으로 Unbox Integer, 즉 Integer를 int 유형으로 변환하므로 int 유형의 값이 여기에서 비교되므로 결과는 참입니다.
몇 가지 질문을 올바르게 수행 한 후 서두르고 누락을 확인하고 자신의 테스트 수준에 따라 격차를 메 웁니다!