소스 코드 인터뷰 질문 요약 나열

소스 코드 인터뷰 질문 요약 나열

List는 직장에서 가장 일반적인 수집 유형입니다. 인터뷰 중에 다양한 인터뷰 질문이 자주 제기됩니다. 일반적으로 소스 코드를 읽으면 List의 전체 구조와 세부 사항을 이해할 수 있습니다. 그렇다면 기본적인 문제는 크지 않습니다.

1. 인터뷰 질문

1.1. ArrayList에 대한 이해에 대해 말씀해주십시오.

많은 면접관들이 이런 종류의 질문 방법을 좋아하는데, 주로 면접 학생들이 ArrayList의 경험을 요약했는지 확인합니다. ArrayList에는 많은 내용이 포함되어 있으므로 먼저 전체 구조에 답한 다음 다음과 같은 돌파구로 특정 세부 사항부터 진행하는 것이 좋습니다
.ArrayList 기본 데이터 구조는 다음과 같습니다. Array와 그 API는 배열의 맨 아래에 접근 할 수 있도록 캡슐화 계층을 만들었습니다. 예를 들어 add 메서드의 프로세스는 ... (여기서는 ArrayList 소스 코드 분석 및 디자인 에서 add 프로세스를 참조 할 수 있습니다 ).

일반적으로 면접관이 당신의 대답을 잘보고 허점이 없다면 깊이 들어 가지 않을 것이므로 면접의 주도권은 자신의 손에 달려 있습니다. 주저하는 대답이 있으면 면접관이 시작할 수 있습니다. 나만의 인터뷰 루틴.

1.2. 확장 문제

1.2.1 ArrayList에는 매개 변수 생성자가 없습니다. 이제 값을 추가합니다. 이때 배열의 요소 수는 얼마이며 다음 확장 전에 사용할 수있는 최대 크기는 얼마입니까?

매개 변수가없는 생성자이므로 값이 추가되면 확장 작업이 트리거됩니다. ArrayList는 처음 확장 될 때 기본값이 있습니다. 기본값은 10이므로 값이 처음 추가 될 때 배열의 요소 수 숫자 (크기)는 1이고 배열 크기 (용량)는 10이됩니다.

1.2.2 계속해서 새로운 값을 목록에 추가하면 11 번째에 도달했을 때 배열의 크기는 얼마입니까?

이때 배열의 크기는 11 개가되기를 바라지 만 실제로 배열의 최대 용량은 10 개에 불과합니다. 충분하지 않으면 확장해야합니다. 확장 공식은 다음과 같습니다. oldCapacity + (oldCapacity >> 1), oldCapacity는 배열의 현재 크기를 나타냅니다. 공식은 다음과 같습니다. 10 + 10 / 2 = 15, 15이면 충분하므로 배열의 크기가 15로 확장됩니다.

1.2.3 배열이 초기화되고 값이 추가 된 후 addAll 메서드를 사용하여 한 번에 15 개의 값을 추가하면 최종 배열의 크기는 얼마입니까?

우리는 이미 값을 추가 한 후 어레이의 사용 가능한 크기가 10이라는 것을 알고 있습니다. 이제 한 번에 15 개의 값을 추가해야하는데, 이는 분명히 확장 작업을 트리거합니다. 확장 후에는 어레이의 용량이 15가되어 충분하지 않습니다. 이때 소스 코드에는 전략이 있습니다. 확장 된 값 <예상 값, 예상 값은이 확장의 크기와 같습니다.

// newCapacity 本次扩容的大小,minCapacity 我们期望的数组最小大小
// 如果扩容后的值 < 我们的期望值,我们的期望值就等于本次扩容的大小
if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;

따라서 확장 후 배열의 최종 크기는 16입니다.

1.3, 문제 삭제

다음 코드 실행이 완료된 후 List의 나머지 요소는 무엇입니까?

List<String> list = new ArrayList<String>() {
    
    {
    
    
  add("2");
  add("3");
  add("3");
  add("3");
  add("4");
}};
for (int i = 0; i < list.size(); i++) {
    
    
  if (list.get(i).equals("3")) {
    
    
    list.remove(i);
  }
}

정답은 {2, 3, 4}입니다. 마지막 요소 3은 삭제되지 않습니다. remove () 메서드를 사용하면 요소 3을 삭제할 때마다 배열의 요소가 1 씩 줄어들 기 때문에 마지막 3 개를 삭제하고 싶을 때, 프로그램은 for 루프를 종료합니다.

1.4. 비교 문제

1.4.1 ArrayList와 LinkedList 애플리케이션 시나리오의 차이점은 무엇입니까?

ArrayList는 빠른 검색 및 매칭에 더 적합하며 빈번한 추가 및 삭제에는 적합하지 않습니다. 작업 중에 요소가 자주 매칭되고 조회되는 시나리오에 더 적합합니다. LinkedList는 빈번한 추가 및 삭제가 자주 수행되지만 쿼리가 적은 시나리오에 더 적합합니다.

1.4.2 ArrayList 및 LinkedList의 최대 용량이 있습니까?

ArrayList는 Integer의 최대 값 인 가장 큰 용량을 가지고 있습니다. JVM은이 값보다 크면 배열에 메모리 공간을 할당하지 않습니다. LinkedList의 맨 아래 계층은 이중 연결 목록으로 이론적으로는 무한 할 수 있습니다. 그러나 소스 코드에서 LinkedList의 실제 크기는 int 유형을 사용합니다. 이는 LinkedList가 Integer의 최대 값을 초과 할 수 없음을 보여줍니다. 그렇지 않으면 오버플로됩니다.

1.4.3 ArrayList와 LinedList는 스레드로부터 안전하며 그 이유는 무엇입니까?

우선, 어느 쪽도 스레드로부터 안전하지 않습니다. 예를 들어 메서드에서 로컬 변수 일 때와 같이 두 가지가 비공유 변수로 사용되면 스레드 안전성 문제가없고, 둘이 공유 변수 인 경우에만 스레드 안전성 문제가 발생합니다. 주요 문제는 다중 스레드 환경에서 모든 스레드가 언제든지 배열 및 연결 목록에서 작동 할 수 있다는 것입니다. 이로 인해 값이 덮어 쓰여지고 혼란스러워 질 수 있습니다.

2. 요약

List는 직장에서 자주 접하게됩니다. 소스 코드를 읽는 것은 인터뷰뿐만 아니라 직장에서 사용하기 쉽습니다. List를 더 깊이 이해하고 싶다면 ArrayList 소스 코드를 읽고 List를 다시 구현할 수 있습니다. 이 경우 List의 기본 데이터 구조 및 작업 세부 정보를 더 깊이 이해하게됩니다.

추천

출처blog.csdn.net/weixin_38478780/article/details/107729921