1. Java의 기본 데이터 유형, 크기 및 해당 캡슐화 클래스는 무엇입니까?
(1) boolean
부울 데이터 유형은 true 또는 false입니다. 이 데이터 유형은 1비트의 정보를 나타내지만 크기가 정확하게 정의되지는 않습니다.
"Java Virtual Machine 사양"에는 "부울 데이터 유형이 정의되어 있지만 매우 제한적인 지원만 제공합니다. Java 가상 머신에는 부울 값이 없습니다. 전용 바이트코드 명령어 및 부울 값 Java 언어 표현식으로 작동되는 요소는 컴파일 후 Java 가상 머신에서 int 데이터 유형으로 대체되며 부울 배열은 각각 Java 가상 머신의 바이트 배열로 인코딩됩니다. 요소 부울 요소는 8비트를 차지합니다. 이런 식으로 부울 유형은 단독으로 사용하면 4바이트, 배열에서는 1바이트라는 결론을 내릴 수 있습니다. 그렇다면 가상 머신이 부울 대신 int를 사용하는 이유는 무엇입니까? 바이트나 쇼트를 사용하면 메모리 공간이 더 절약되지 않을까요? 실제로 int를 사용하는 이유는 현재 32비트 CPU에서는 32비트 데이터를 한 번에 교환하는 것이 더 효율적이기 때문입니다.
요약하면 공식 문서에는 부울 유형에 대한 정확한 정의가 제공되지 않습니다. "Java Virtual Machine 사양"에서는 "단독으로 사용할 경우 4바이트, 부울 배열의 경우 1바이트"를 제공합니다. ." ""의 정의는 가상 머신 구현이 사양을 따르는지 여부에 따라 달라지므로 1바이트 또는 4바이트가 가능합니다. 이것은 실제로 시간과 공간의 균형입니다.
부울 유형의 캡슐화 클래스는 Boolean입니다.
(2) 바이트——1바이트——바이트
(3) short——2바이트——Short
(4) int——4바이트—— 정수
(5) long——8바이트——Long
(6) float——4바이트——Float
(7) double——8바이트— — —Double
(8) 문자——2바이트——문자
2. “==”와 “equals()”의 차이점에 대해 이야기해 보겠습니다. .
"Think in Java"에서는 "관계 연산자는 부울 결과를 생성하고 피연산자 값 간의 관계를 계산합니다."라고 말합니다.
"==" 두 개체의 메모리 주소가 동일한지 확인하고 기본 데이터 유형 및 열거 유형에 적합한지 확인합니다(해당 변수는 값 자체를 저장하고 참조 유형 변수는 참조를 저장함). Object 클래스의 메소드는 메모리 주소를 비교하는 것입니다. 이 메소드를 재정의하여 "동일" 개념을 사용자 정의할 수 있습니다. 예를 들어 클래스 라이브러리의 String, Date 및 기타 클래스는 이 메서드를 다시 작성했습니다.
요약하면, 열거형과 원시 데이터형 간의 동등 비교는 "=="를 사용해야 하며, 참조형 간의 동등 비교는 equals 메소드를 사용해야 합니다.
3. Java의 4가지 참조 유형과 해당 응용 시나리오는 무엇입니까?
강한 참조: 일반적으로 객체를 생성하기 위해 new 연산자를 사용할 때 반환되는 참조는 강한 참조입니다.
소프트 참조: 소프트 참조를 통해서만 객체에 도달할 수 있는 경우 객체는 메모리가 부족할 때 재활용되며, 이미지 캐시에서 사용할 수 있습니다. 메모리가 부족할 때 시스템은 더 이상 사용되지 않는 비트맵을 자동으로 재활용합니다
약한 참조: 객체가 약한 참조를 통해서만 접근할 수 있으면 재활용되며(메모리가 충분하더라도) 이때 비트맵이 더 이상 사용되지 않는 한 이미지 캐시에서도 사용할 수 있습니다. 재활용
가상 참조: 가상 참조는 Java에서 가장 "약한" 참조이며 이를 통해 얻을 수도 없습니다. 참조된 개체의 유일한 목적은 가리키는 개체가 재활용될 때 가리키는 객체가 언제 소멸되는지 알 수 있도록 참조 큐에 추가됩니다.
4. 객체에는 어떤 메소드가 정의되어 있나요?
clone(), equals(), hashCode(), toString(), inform(), informAll(), wait(), finalize(), getClass()
5. 해시코드의 기능은 무엇인가요?
해시 테이블의 기본 원리와 구현을 살펴보세요
6. ArrayList, LinkedList, Vector의 차이점은 무엇인가요?
ArrayList: 내부적으로 배열을 사용하여 요소를 저장하고 효율적인 무작위 액세스를 지원하며 동적 크기 조정을 지원합니다.
LinkedList: 내부적으로 연결 목록을 사용하여 요소를 저장하고 빠른 요소 삽입/삭제를 지원하지만 효율적인 무작위 액세스를 지원하지 않습니다.
벡터: ArrayList의 스레드 안전 버전으로 간주할 수 있습니다
7. String, StringBuilder 및 StringBuffer의 차이점은 무엇인가요?
String: 불변 문자 시퀀스, 새 문자를 추가하려면 새 String 객체를 생성하는 데 필요함
StringBuilder: 가변 문자 시퀀스, 새 문자 추가 지원(새 객체를 생성할 필요 없음)
StringBuffer: StringBuilder의 스레드 안전 버전으로 간주할 수 있습니다
8. Map, Set, List, Queue 및 Stack의 특성 및 사용법.
Map
Set
List
큐
Stack
자세한 설명은 공식 문서를 참고하세요. 관련 데이터 구조에 익숙하지 않은 학생들은 "알고리즘 입문"이나 기타 관련 서적을 참고하세요.
9. HashMap과 HashTable의 차이점
HashTable은 스레드로부터 안전하지만 HashMap은
HashMap은 null 키와 null 값을 허용하지 않습니다. 단, HashTable에서는
을 사용할 수 없습니다. 자세한 분석은 HashMap 및 HashTable 심층 분석
을 참조하세요.
10.
간단히 말해서, HashMap의 기본 구현은 "지퍼 기반 해시 테이블"입니다. 자세한 분석은 HashMap 및 HashTable 심층 분석
을 참조하세요. 11 ConcurrentHashMap
의 구현 원리 ConcurrentHashMap은 동시 읽기 및 읽기를 지원하는 HashMap입니다. 쓰기의 특징은 데이터를 읽을 때 잠금이 필요하지 않으며 데이터를 쓸 때 잠금 세분성을 최대한 작게 유지할 수 있다는 것입니다. 내부적으로 "세그먼트화된 저장소"를 사용하기 때문에 쓸 데이터가 있는 "세그먼트"만 잠그면 됩니다. ConcurrentHashMap의 기본 구현에 대한 자세한 분석은 Java 동시 프로그래밍: Concurrent Container ConcurrentHashMap
12을 참조하세요. TreeMap, LinkedHashMap 및 HashMap의 차이점은 무엇인가요?
HashMap의 기본 구현은 해시 테이블이므로 그 안에 저장된 요소는 순서가 없습니다.
TreeMap의 기본 구현은 레드-블랙 트리이므로 그 안에 있는 요소는 순서가 있습니다. . 정렬은 TreeMap을 생성할 때 제공되는 자연 순서 또는 Comparator 개체를 기반으로 합니다.
LinkedHashMap은 요소가 삽입되는 순서를 기억할 수 있습니다.
자세한 설명은 HashMap, LinkedMap, TreeMap의 차이점을 참고하세요
13. Collection과 차이점은 무엇인가요?
컬렉션
Java 수집 프레임워크에 익숙하지 않은 분들은 Java 핵심 기술 포인트 수집 프레임워크를 참조하세요
14. if try 문 블록에 "return" 문이 포함되어 있습니다. finally 문 블록이 실행됩니까?
대답은 '그렇다'입니다. finally 블록의 문이 실행되지 않는 상황은 두 가지뿐입니다.
System.exit() 메서드가 호출됩니다.
JVM이 "충돌합니다".
15. Java의 예외 계층
Java의 예외 계층은 다음과 같습니다.
Throwable 클래스가 예외 계층 구조의 기본 클래스임을 알 수 있습니다. Error 클래스는 우리가 통제할 수 없는 내부 오류를 나타내고, Exception은 예외를 나타내며, RuntimeException과 그 하위 클래스는 확인되지 않은 예외입니다. 이러한 예외에는 ArrayIndexOutOfBoundsException, NullPointerException 등이 포함됩니다. 조건부 판단 및 기타 문 발생을 통해 확인되지 않은 예외를 피해야 합니다. IOException 및 해당 하위 클래스는 확인된 예외입니다. 컴파일러는 발생할 수 있는 모든 확인된 예외에 대해 예외 처리기를 제공했는지 여부를 확인합니다. 확인되지 않은 예외의 경우 이를 포착할 필요가 없습니다(물론 Java에서도 이를 포착할 수 있지만 우리가 해야 할 일은 확인되지 않은 예외의 발생을 피하는 것입니다).
16. Java 객체지향의 세 가지 특징과 의미
세 가지 주요 특징: 캡슐화, 상속, 다형성. 자세한 소개는 Java 객체지향
의 세 가지 주요 특징을 클릭하세요. 17. Override와 Overload
의 의미와 차이점 Override는 "덮어쓰기"를 의미하며, 이는 하위 클래스가 상위 클래스를 다시 작성하는 것입니다.
에서 동일한 메서드를 재정의하는 것은 "오버로딩"을 의미합니다. 즉, 정의된 메서드와 이름은 같지만 서명이 다른 새 메서드를 정의하는 것입니다.
18. 인터페이스와 추상 클래스의 차이점
인터페이스는 관례이며, 인터페이스를 구현하는 클래스는 이 관례를 따라야 합니다. 추상 클래스는 본질적으로 클래스입니다. 추상 클래스를 사용하는 비용은 인터페이스의 비용보다 큽니다. 인터페이스와 추상 클래스의 비교는 다음과 같습니다.
추상 클래스에는 속성, 메서드(추상 메서드 및 특정 구현이 포함된 메서드 포함)가 포함될 수 있으며, 상수는 상수와 메서드 선언만 포함될 수 있습니다.
추상 클래스의 메서드와 멤버 변수는 공개, 비공개 등의 가시성을 정의할 수 있지만 인터페이스의 메서드는 공개만 가능합니다(기본값은 공개).
하위 클래스는 하나의 상위 클래스(구체 클래스 또는 추상 클래스)만 가질 수 있습니다. 인터페이스는 여러 인터페이스를 상속할 수 있으며 클래스는 여러 인터페이스를 구현할 수도 있습니다.
하위 클래스가 상위 클래스에서 추상 메소드를 구현할 때 가시성은 상위 클래스의 가시성보다 크거나 같을 수 있지만 인터페이스 구현 클래스에서 인터페이스 메소드의 가시성은 동일할 수만 있습니다. 인터페이스(공개)에서와 같습니다.
19. 정적 내부 클래스와 비정적 내부 클래스의 차이점
정적 내부 클래스는 외부 클래스에 대한 참조를 보유하지 않지만 비정적 내부 클래스는 참조를 보유합니다. 암시적으로 바깥쪽 클래스에 대한 참조를 보유합니다.
내부 클래스에 대한 자세한 내용은 Java 핵심 기술 포인트의 내부 클래스를 클릭하세요
20 Java의 다형성 구현 원리
소위 다형성 상태는 하위 클래스 객체를 가리키는 상위 클래스 참조를 참조합니다. 메서드를 호출하면 상위 클래스의 구현 대신 하위 클래스의 구현이 호출됩니다. 다형성 구현의 핵심은 "동적 바인딩"에 있습니다. 자세한 소개를 보려면 Java 동적 바인딩의 내부 구현 메커니즘
을 클릭하세요. 21. Java에서 새 스레드를 생성하는 두 가지 방법을 간략하게 설명합니다.
스레드 상속 클래스(MyThread의 하위 클래스를 가정), run() 메서드를 다시 작성한 다음 새 MyThread 개체를 만들고 해당 개체에 대해 start()를 호출하여 새 스레드를 시작합니다.
Runnable 인터페이스를 구현하고(구현 클래스가 MyRunnable이라고 가정) MyRunnable 개체를 Thread 생성자에 매개 변수로 전달하고 얻은 Thread 개체에서 start() 메서드를 호출합니다.
22. Java
휘발성: Java 메모리 모델은 읽기 전에 동일한 휘발성 변수에 대한 쓰기를 보장합니다.
동기화됨: 코드 블록이나 메소드를 잠글 수 있습니다. "잠긴" 위치를 임계 섹션에 진입하는 스레드가 객체의 모니터를 획득하므로 다른 사용자가 임계 섹션에 진입하려는 시도가 발생합니다. 해당 영역의 스레드는 모니터를 얻을 수 없기 때문에 차단됩니다. 다른 스레드가 모니터를 해제하기를 기다리면서 차단된 스레드는 중단될 수 없습니다.
ReentrantLock: 잠금을 획득하려는 스레드가 중단될 수 있으며 시간 초과 매개변수가 설정될 수 있습니다.
더 자세한 소개를 보려면 Java의 핵심 기술 포인트 - 멀티스레딩
23 Java의 세분화된 잠금 유형을 간략하게 설명하세요
Java에서는 클래스, 객체, 메소드 또는 코드 블록을 잠글 수 있습니다. 더 자세한 소개를 보려면 Java Core Technology Points Multithreading
을 클릭하세요. 24. "생산자-소비자" 문제에 대한 해결책 제시
차단 대기열 사용:
public class BlockingQueueTest { private int size = 20; private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size); public static void main(String[] args) { BlockingQueueTest test = new BlockingQueueTest(); Producer producer = test.new Producer(); Consumer consumer = test.new Consumer(); producer.start(); consumer.start(); } class Consumer extends Thread{ @Override public void run() { while(true){ try { //从阻塞队列中取出一个元素 queue.take(); System.out.println("队列剩余" + queue.size() + "个元素"); } catch (InterruptedException e) { } } } } class Producer extends Thread{ @Override public void run() { while (true) { try { //向阻塞队列中插入一个元素 queue.put(1); System.out.println("队列剩余空间:" + (size - queue.size())); } catch (InterruptedException e) { } } } } }
25. ThreadLocal의 설계 개념 및 기능
ThreadLocal의 기능은 스레드 내에서 로컬 변수를 제공하는 것입니다. 이를 통해 각 스레드의 ThreadLocal 변수는 다중 스레드에서 액세스할 때 독립적임을 보장할 수 있습니다. 스레드 환경. 즉, 각 스레드의 ThreadLocal 변수는 자체 전용이며 다른 스레드에서 액세스할 수 없습니다. ThreadLocal은 다음 시나리오에서 가장 일반적으로 사용됩니다. 다중 스레드 환경에서 스레드로부터 안전하지 않은 개체에 대한 동시 액세스가 있고 스레드 간에 개체를 공유할 필요는 없지만 잠그고 싶지는 않습니다. 이 경우 ThreadLocal을 사용하여 각 스레드를 유지 관리할 수 있습니다. 이 개체의 복사본이 있습니다.
ThreadLocal의 구현 원리에 대한 분석은 ThreadLocal의 심층 분석을 클릭하세요
26 동시 패키지의 전체 아키텍처
27. ArrayBlockingQueue, CountDownLatch 클래스의 역할
CountDownLatch: 카운터가 0에 도달할 때까지 일련의 스레드를 대기하도록 허용합니다. 적용 가능한 시나리오: 하나 이상의 스레드가 실행을 계속하기 전에 지정된 수의 이벤트가 발생할 때까지 기다려야 하는 경우.
ArrayBlockingQueue: 어레이 구현을 기반으로 하는 차단 큐로, 구성 시 용량을 지정해야 합니다. 전체 대기열에 요소를 추가하거나 빈 대기열에서 요소를 제거하려고 하면 현재 스레드가 차단됩니다. 차단 대기열을 통해 다음 모드로 작업할 수 있습니다. 작업자 스레드는 주기적으로 중간 결과를 차단 대기열에 넣을 수 있고 다른 스레드는 중간 결과를 꺼내 추가 작업을 수행할 수 있습니다. 작업자 스레드가 느리게 실행되면(큐에 요소를 삽입하기 전에) 큐에서 요소를 가져오는 다른 스레드는 작업자 스레드가 빠르게 실행되면 (빈 큐에서 요소를 가져오려고 시도하고 차단하려고 시도함) 대기하게 됩니다. (전체 대기열에 요소를 삽입하려고 하면) 계속하기 전에 다른 스레드가 요소를 제거할 때까지 기다립니다.
28. wait()와 sleep()의 차이점
wait(): Object 클래스에 정의된 인스턴스 메소드. 지정된 개체에 대해 wait 메서드를 호출하면 현재 스레드가 대기 상태가 됩니다(현재 스레드가 개체의 모니터를 보유하고 있는 경우). 이때 현재 스레드는 해당 개체의 모니터를 해제하므로 다른 개체가 해당 개체의 모니터를 해제합니다. 스레드는 모니터를 얻을 수 있는 기회를 갖게 됩니다. 다른 스레드가 이 개체의 모니터를 얻고 필요한 작업을 수행할 때 알림 메서드를 호출하여 이전에 대기 상태에 들어간 스레드를 깨울 수 있습니다.
sleep(): 다른 스레드가 실행될 수 있도록 현재 스레드를 절전 상태로 전환하는 데 사용되는 Thread 클래스의 정적 메서드입니다. 휴면 상태가 된 스레드는 보유하고 있는 잠금을 해제하지 않습니다.
29. 스레드 풀의 사용법과 장점
장점: 스레드 재사용을 실현하고 스레드 풀을 사용하여 반복적으로 생성하고 삭제하는 오버헤드를 방지합니다. 스레드를 통합 관리하면 동시 스레드 수를 줄일 수 있지만 스레드가 너무 많으면 스레드 컨텍스트 전환 및 스레드 동기화에 너무 많은 시간을 낭비하는 경향이 있습니다.
사용법: ThreadPoolExecutor의 생성자 메서드를 호출하여 스레드 풀을 직접 생성할 수 있습니다. 그러나 일반적으로 스레드 풀 개체를 보다 편리하게 생성하기 위해 Executors 클래스에서 제공하는 정적 팩토리 메서드를 사용할 수 있습니다. 스레드 풀 객체를 생성한 후 submit 메서드를 호출하여 실행을 위해 스레드 풀에 작업을 제출할 수 있습니다. 스레드 풀이 사용된 후에는 종료 메서드를 호출하여 이를 닫아야 한다는 것을 기억해야 합니다.
스레드 풀에 대한 자세한 소개와 구현 원리 분석을 보려면 Java 스레드 풀 심층 이해
를 클릭하세요. 30. -각각 및 기존 for 루프
이 질문에 대해 "Effective Java"에서 제공한 답변을 직접 살펴보겠습니다.
for-each能够让代码更加清晰,并且减少了出错的机会。下面的惯用代码适用于集合与数组类型: for (Element e : elements) { doSomething(e); }使用for-each循环与常规的for循环相比,并不存在性能损失,即使对数组进行迭代也是如此。实际上,在有些场合下它还能带来微小的性能提升,因为它只计算一次数组索引的上限。
31 Java IO와 NIO의 차이점을 간략하게 설명합니다. 🎜>
Java IO는 스트림 지향입니다. 이는 모든 바이트를 읽을 때까지 한 번에 하나 이상의 바이트를 읽어야 함을 의미합니다. 즉, NIO는 버퍼 지향입니다. 버퍼에 넣은 다음 버퍼에 해당 영역의 데이터가 그에 따라 처리됩니다. Java IO는 IO를 차단하는 반면 NIO는 비차단 IO입니다.Java NIO에는 선택기라는 것이 있는데, 선택기에 여러 채널을 등록한 다음 스레드를 사용하여 이러한 채널을 모니터링할 수 있습니다. 이 채널에 무언가가 있는 경우 채널이 읽기를 시작할 준비가 되었거나 쓰기 작업, 해당 채널 읽기 및 쓰기를 시작합니다. 채널이 읽기/쓰기 가능해질 때까지 기다리는 동안 채널에서 읽기 및 쓰기 작업을 요청하는 스레드는 다른 작업을 수행할 수 있습니다.
자세한 설명은 Java NIO 및 IO를 클릭하세요
32. 성찰의 역할과 원리
성찰의 역할은 일반적으로, 런타임 어떤 속성과 메소드가 정의되어 있는지 등 클래스의 다양한 정의 정보를 얻습니다. 원칙은 클래스 객체를 통해 클래스에 대한 다양한 정보를 얻는 것입니다.
자세한 소개는 Java의 핵심기술인 Reflection
33. Java의 Generic 메커니즘
을 참조하세요. 일반적인 메커니즘에 대해서는 Java의 핵심 기술 사항을 직접 찌르십시오: Generics
34 Java 7 및 Java 8의 새로운 기능
다음은 매우 좋은 두 가지입니다. 요약: Java 7 새로운 기능 Java 8의 새로운 기능
35. 일반적인 디자인 패턴
소위 "디자인 패턴"은 일반적으로 사용되는 소프트웨어 디자인 기술 중 일부입니다. 실제 테스트를 거친 후 이러한 디자인 기술은 해당 시나리오의 일부 요구 사항을 해결할 수 있으므로 오늘날 널리 유포되는 "디자인 패턴"이 되었습니다. 즉, 공식적으로는 특정 시나리오에서 까다로운 문제가 발생했기 때문에 해당 디자인 패턴이 탄생한 것입니다. 이를 분명히 하자면, 특정 디자인 패턴을 배울 때 우리는 그 생성 배경과 그것이 해결하는 주요 모순을 완전히 이해해야 합니다.
일반적으로 사용되는 디자인 패턴은 다음 세 가지 범주로 나눌 수 있습니다.
창의적 패턴: 팩토리 패턴 포함(심플 팩토리 패턴, 팩토리 메소드 패턴, 추상 팩토리 패턴으로 더 나눌 수 있음) ), 빌더 패턴, 싱글톤 패턴.
구조 모드: 어댑터 모드, 브리지 모드, 장식 모드, 모양 모드, 플라이웨이트 모드 및 프록시 모드를 포함합니다.
행동 패턴: 명령 모드, 중재자 모드, 관찰자 모드, 상태 모드 및 전략 모드를 포함합니다.
각 모드에 대한 자세한 소개는 일러스트 디자인 패턴을 참고하세요
36. JNI 기본 사용법
JNI에 대해서는 이렇습니다. 좋은 글: JNI in Android
37. 동적 프록시의 정의, 적용 시나리오 및 원리
동적 프록시에 대해서는 Java의 동적 프록시를 직접 참조하세요. 핵심 기술 포인트
38. Annotation의 기본 개념과 활용
Annotation은 컴파일러에게 몇 가지를 설명할 수 있는 "코멘트의 향상된 버전"이라고 볼 수 있습니다. 그리고 가상머신.
주석은 Java 코드를 설명하는 코드로 컴파일러에서 구문 분석할 수 있으며 주석 처리 도구도 런타임에 주석을 구문 분석할 수 있습니다. 주석 자체는 "수동적" 정보이며 적극적으로 구문 분석되는 경우에만 의미가 있습니다.
컴파일러/가상 머신에 정보를 전달하는 것 외에도 주석을 사용하여 일부 "템플릿" 코드를 생성할 수도 있습니다.
이 정도면 됐지? 물론 충분하지 않습니다. 위에는 인터뷰에서 자주 묻는 Java에 대한 질문이 나열되어 있으며, 그 중 대부분은 Java 기술 시스템의 핵심 기술 사항이기도 합니다. 가장 좋은 것은 이 길을 계속 가는 것입니다 :)
더 많은 Java 면접 지식 포인트 요약 및 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!