일반 자바 기본 지식 및 운영 관련 면접 질문

? 사용하는 일반 (다음과 같은 문제가) 왜.
1) : 컬렉션의 모든 유형의 데이터를 저장하지만, Object 형식 꺼내고,이 시간에 강한 회전을 가지고있다.
2) : 저장된 요소의 제약 세트 그것은 동일한 데이터 유형이어야합니다 (동일한 데이터 유형이 같은 TreeSet의 클래스로, 비교 될 수있다).
3) : 디자인 포인트 (점) 클래스는이 좌표 위치를 캡슐화하기 위해, 좌표 위치는 문자열 유형 .Integer / 더블 타입을 지원하는 데 필요한.

? 제네릭 무엇 둘째
: Java5에서 제네릭 (GenericType)는 새로운 구문을 지원하기 시작했다
1). 다양한 제네릭 형식
이다 유형을 지정, 불확실성의 코드 템플릿 유형, 코드의 섹션 전화 : 2) 무엇.

세 제네릭 :
그림 삽입 설명 여기
일반 클래스 : 직접 정의 된 일반적인 클래스 / 인터페이스.
일반적인 사용 :
전 보장 후 같은 유형입니다.
목록 목록 새로운 새 = ArrayList를 (); // 세트에만 문자열 목록 유형을 저장 요소
때문에 동일한 앞의 유형 및 후면 그래서 처음 Java7 출구 일반적인 다이아몬드의 구문 <>.
리스트 목록 = 새 새로운 ArrayList를 <> ()
. 일반적인 상속 관계 (아래 오류)이 존재하지 않는
일람 = 새로운 새로운 ArrayList를 () ; // 오류가
. 그 이후로, 컬렉션의 사용은 컬렉션에있는 요소의 형태 제한하는 제네릭을 사용했다
디 컴파일을 발견 : 일반 실제로 문법 설탕을 , 하단은 여전히 일반적인,하지만 여전히 강한 회전으로하지 않습니다.
그림 삽입 설명 여기
사 : 정의 및 일반적인 방법을 사용하는
일반 메소드 선언에서 :. 일반적인 방법을
방법의 정의 일반적인 반환 형식 말이로서, 일반적으로하지만,이 경우 일반적인해야 매개 변수를 수신 설정 인치
특정 유형의 매개 변수의 총칭 세트가,이 때 방법은 일반적으로 개체로 반환하도록 설계되지 않은 경우.
예를 들어 asList () 클래스 배열 도구의 방법
그림 삽입 설명 여기
V. 일반적인 와일드 카드 만 상단 이해하고 라인에 하한 :( )
제네릭 와일드 카드 : 저는 모르겠어요 유형 수신하면, 이번에는 알려지지 와일드 카드 ?? 나타내는데 이용 될 수있다.
이 경우, 단지 데이터가 데이터 세트에 저장 될 수없는 수신한다.
그림 삽입 설명 여기
제네릭 상하한을 : 입력 요소 X의 클래스를 정의하기 위해 사용되어야 또는 같은 서브 클래스, X 또는 같은 부모입니다.

VI 및 삭제 일반적인 변환 :
일반 지우기 :
1) : 일반적인 사라 (일반 자동 삭제) 컴파일 후,
2) : 일반적인와 함께 세트는 일반적인없이 할당 할 때 . 집합 일반적인 경우 소거 (소거 수동)
힙 손상 :
변수 패러미터의 사용 모두하고 쉽게 오염 문제가 발생할 때 단일 스택 일반적인 방법이 사용된다.
같음 : asList의 어레이 클래스 방법 : 공공 정적 목록 asList (T ... A).
그림 삽입 설명 여기
면접 질문 :
1.Java 제네릭 ??입니다 제네릭 사용의 이점은 무엇
제네릭 파라미터 화 된 형태의 메커니즘입니다. 그것은 그 더 쓰기 공통 코드 때문에, 예를 들어, 프레임 세트, 코드의 여러 유형에 적용 할 수있다.
제네릭 확인 메커니즘의 컴파일 타임 유형입니다. 그것은 컴파일 타임 타입 안전성을 제공하며, 런타임에 방지 할 수있는 ClassCastException이 해당 제네릭 형식 (보통 일반적인 컬렉션) 오브젝트의 사용 만이 올바른 유형을 보장하기 위해.

유형의 삭제 란 자바의 제네릭 일이? 방법 2,
일반 작업은 컴파일러에 의존 소스 코드 첫 번째 유형 검사를 컴파일 한 다음 삭제를 입력 매개 변수가 나타나는 유형의 장소에 삽입하기 달성하기 위해 관련 지침을 캐스팅.
관련 정보의 모든 종류의 런타임에 존재하지 않는, 그래서 컴파일러는 컴파일 타임에 관련된 모든 유형의 정보를 삭제합니다. 예를 들어, 런타임 타입에서만 목록 목록 나타냅니다. 왜 삭제해야합니까? 이 확장의 유형을 방지하는 것입니다.

제한 및 비 제한 와일드 카드 와일드 카드의 일반적인 무엇 3.?
제한 와일드 카드 형식은 제한되었다. 두 와일드 카드를 정의, T는 하나의 서브 세트 ** 형 바인딩되어야 타입을 확인하여 <** T 연장?>이고, 다른 하나는? ** 슈퍼 <이다 * * T> 타입 T의 부모 클래스를 보장하는 설정해야합니다으로 낮은 바운드 형 ** **. 일반 유형은 그렇지 않으면 컴파일러 오류가 발생합니다, 한도 내에서 유형으로 초기화해야합니다. <?> 모든 유형 대신에 사용할 수 있기 때문에 반면에 <?>, 비 제한 와일드 카드를 나타냅니다.

4.List는 차이 사이에? 무엇과 목록 <? 슈퍼 T> <? T 확장>
이 두 목록 선언의 예는 제한 와일드 카드입니다을 목록 <? T는 확장> 당신은 목록에서 모든 종류의 T 상속을 받아 들일 수 목록 <? 슈퍼 T>는 목록 T는 구성되어있는 상위 클래스를 받아 들일 수 있습니다. 예를 들어, 목록은 <? 번호가 확장> 목록 또는 목록을 받아 들일 수 있습니다. 당신이 나타납니다이 연결 단락에서 자세한 정보를 찾을 수 있습니다.

가? 일반적인 매개 변수 및 반환 제네릭 형식을 받아 들일 수 있도록 일반적인 방법을 작성하는 방법 5.
일반적인 방법을 쓰려면이 어려운 일이 아니다, 당신은 T, E 또는 K, V 사용하는 등 일반적인 유형 대신 원시 유형을 사용할 필요가 및 기타 널리 자리의 유형을 인정했다. 자바 컬렉션 프레임 워크의 일반적인 방법의 예를 참조하십시오. 가장 간단한 경우, 일반적인 방법은 다음과 같습니다
공공 V의 PUT (키 K, V 값) {
반환 cache.put (키, 값);
}

7. 쓰기 LRU 캐시? 구현하는 일반적인 프로그램
자바이 프로그래밍과 같은 사람들을 위해이 운동에 해당합니다. 당신에게 힌트를주고,의 LinkedHashMap LRU 캐시는 LRU 캐시가 가득 찼을 때, 고정 된 크기를 구현하는 데 사용할 수 있습니다, 그것은 가장 오래된 캐시 키 - 값 쌍을 제거 할 때. 의 LinkedHashMap을 위해서, removeEldestEntry (라는 메소드), 메소드가 넣어 () 및 putAll에 () 호출 가장 오래된 쌍을 삭제하는 것입니다을 제공합니다.

8. 목록 목록 매개 변수를 어떻게 받아들이는 메서드에 전달 할 수 있습니까?
제네릭에 익숙하지 누군가를 위해, 목록 필요한 경우 목록을 사용해야 있도록 먼저 눈에 문자열, 객체이기 때문에이 자바 제네릭 주제는 혼란 보인다, 그러나 그것은 아니다. 정말 그렇게 컴파일 오류가 발생합니다 않습니다. 그런 다음 깊은 단계를 고려하면 목록 등 문자열, 정수를 포함한 객체의 모든 유형을 저장할 수 있기 때문에 목록은 문자열을 저장하는 데 사용할 수 있지만 자바, 의미가 있음을 발견 할 것이다.
통해 Objectlist 목록,
목록 stringList;
통해 Objectlist = stringList; // 컴파일 오류가 호환되지 않는 유형

9.Array 제네릭을 사용할 수 있습니다 그것은?
배열 사실은 제네릭을 지원하지 않습니다, 목록 안전 보장의 유형 컴파일 제공 할 수와 배열은 할 수 없기 때문에, 대신 배열의 목록을 사용하는 것이 좋습니다.

11, 자바 목록 및 목록의 기본 유형의 차이는?
원래의 형태와 유형 매개 변수 사이의 주요 차이점은 원래의 컴파일 시간 형에서 형 보안 검사를 수행하지 않습니다 컴파일러,하지만 형식 매개 변수가 될 것입니다 개체 유형으로 사용하여, 확인 과정을 알릴 수있다 컴파일러는 문자열이나 정수 등 모든 유형의 개체를 받아 들일 수 있습니다 . 이 질문은 포인트를 원래의 제네릭 형식의 올바른 이해를 검토하는 것입니다. 그들 사이의 차이의 두 번째 포인트는 것입니다 당신이 원시 형 목록 방식을 받아 들일 모든 제네릭 형식 인수를 전달할 수 있습니다, 그러나 컴파일 오류가 발생합니다 있기 때문에, 허용 방법의 목록에 목록을 전달할 수 없습니다.

무엇 (12) 사이의 차이는, 자바 목록에서 <?> 그리고 목록은?있는
목록은 <?> 목록 목록 모든 유형의 목록의 유형을 알 수는 있지만, 사실은. 당신은 목록, <?>가 목록 목록에 할당 할 수 없습니다 목록에 할당 목록을 넣을 수 있습니다.
목록 listOfAnyType <?>;
목록 listOfObject = 새로운 새로운 ArrayList를 ()
에서 새로운 listOfString = 새로운 ArrayList를 ()
에서 listOfInteger)는 (신규의 ArrayList를 새로운 =;

listOfAnyType = listOfString; // 법적
listOfAnyType = listOfInteger; // 법적
listOfObjectType = (목록) listOfString; // 컴파일러 오류 -에 - 전환 유형

(13) 및 기본 유형의 차이 목록 목록.
같은 질문 "원래 유형과 형식 매개 변수의 차이점은 무엇입니까." 매개 변수 유형으로 형 안전 하지만, 컴파일러에 의한 안전 보장의 종류이지만, 원시 형 목록 입력 - 안전하지 않습니다. 당신은 목록에 외부 개체 유형 문자열 문자열의 다른 유형을 넣을 수 없습니다, 당신은 원래 목록에 저장된 모든 유형의 개체를 넣을 수 있습니다. 당신이 캐스트를 할 필요는 없지만 기본 유형, 당신은 명시 적 형식 변환이 필요합니다 매개 변수로 제네릭 형식의 사용.
ListOfRawTypes ArrayList에 = 새 새 목록 ();
listOfRawTypes.add ( "ABC");
listOfRawTypes.add는 (123); //이 컴파일러 수 있습니다 - Shique 이상 동작
문자열 항목 = (문자열) listOfRawTypes.get ( 0); // 명시 적 형식 변환에 필요한
항목 = (문자열) listOfRawTypes.get (1 ); // ClassCastException를 슬로우, 정수 문자열 때문에 변환 할 수 없습니다

ListOfString ArrayList를 = 새로운 새 목록 ();
listOfString.add ( "ABCD");
listOfString.add (1234); // 컴파일 에러, 더 나은 런타임에 예외를 던지는 것보다
항목 = listOfString.get (0); // 명시적인 형식 변환 - 컴파일러는 자동으로 변환

게시 99 개 원래 기사 · 원 찬양 2 · 조회수 2,606

추천

출처blog.csdn.net/weixin_41588751/article/details/105299622