면접 질문은 다음과 같습니다.
1.a.hashCode()의 용도는 무엇인가요? a.equals(b)와 무슨 관련이 있나요?
(더 관련 있는 면접 질문 추천: java 면접 질문 및 답변)
hashCode() 메소드는 객체 정수형의 해시 값에 해당합니다. Hashtable, HashMap, LinkedHashMap 등과 같은 해시 기반 컬렉션 클래스에서 일반적으로 사용됩니다. 특히 equals() 메소드와 밀접한 관련이 있습니다. Java 사양에 따르면 equal() 메서드를 사용하여 동일한 두 객체는 동일한 해시 코드를 가져야 합니다.
2. 바이트 스트림과 문자 스트림의 차이점
바이너리 데이터를 특정 장치에 하나씩 출력하거나, 입력에 상관없이 특정 장치에서 바이너리 데이터를 하나씩 읽는 것 출력 장치는 이러한 작업을 통합된 방식으로 완료하고 추상적인 방식으로 설명해야 합니다. 이 추상 설명 메서드는 IO 스트림으로 명명되고 해당 추상 클래스는 OutputStream 및 InputStream입니다. 서로 다른 구현 클래스는 서로 다른 입력과 출력을 나타냅니다. 장치는 모두 바이트로 작동합니다.
컴퓨터의 모든 것은 궁극적으로 이진 바이트 형식으로 존재합니다. 자주 사용되는 중국어 문자의 경우 먼저 해당 바이트를 가져온 다음 해당 바이트를 출력 스트림에 씁니다. 읽을 때 가장 먼저 읽는 것은 바이트인데, 문자로 표시하려면 바이트를 문자로 변환해야 합니다. 이러한 요구가 널리 퍼져 있기 때문에 Java는 특별히 문자 스트림 래퍼 클래스를 제공합니다.
기본 장치는 항상 바이트 데이터만 허용합니다. 때로는 기본 장치에 문자열을 쓰려면 쓰기 전에 문자열을 바이트로 변환해야 합니다. 문자 스트림은 바이트 스트림을 위한 래퍼입니다. 문자 스트림은 문자열을 내부적으로 바이트로 변환한 다음 이를 기본 장치에 씁니다. 이는 문자열을 쓰거나 읽을 수 있는 약간의 정보를 제공합니다. IO 장치가 편리합니다.
문자를 바이트로 변환할 때 인코딩 문제에 주의하세요. 문자열을 바이트 배열로 변환하는 것은 실제로 문자의 특정 인코딩된 바이트 형식으로 변환하는 것이고, 읽을 때는 그 반대이기 때문입니다.
3. Java 직렬화란 무엇이며 Java 직렬화를 구현하는 방법은 무엇입니까? 아니면 직렬화 가능 인터페이스의 역할에 대해 설명해주세요.
우리는 때때로 Java 개체를 바이트 스트림으로 전송하거나 바이트 스트림에서 Java 개체로 복원합니다. 예를 들어 Java 개체를 하드 디스크에 저장하거나 네트워크의 다른 컴퓨터로 전송하려는 경우에는 다음과 같습니다. 그 과정에서 우리는 자바 객체를 특정 형식의 바이트 스트림으로 변환하고 전송하는 코드를 직접 작성할 수 있습니다.
그러나 jre 자체는 이를 지원하기 위해 OutputStream의 writeObject 메소드를 호출할 수 있습니다. Java가 이를 수행하도록 하려면 전송할 객체가 이러한 방식으로 직렬화 가능한 인터페이스를 구현해야 합니다. 컴파일 시 특수 작업 처리 후에만 컴파일된 클래스를 직렬화라고 하는 writeObject 메서드로 작업할 수 있습니다. 직렬화해야 하는 클래스는 직렬화 가능 인터페이스를 구현해야 합니다. 이 인터페이스는 메소드를 구현할 필요가 없는 미니 인터페이스입니다. 직렬화 가능을 구현하는 것은 단지 객체를 직렬화할 수 있다는 것을 표시하기 위한 것입니다.
예를 들어 웹 개발에서 개체가 Session에 저장되어 있는 경우 Tomcat은 다시 시작할 때 Session 개체를 하드 디스크에 직렬화해야 하며 이 개체는 직렬화 가능 인터페이스를 구현해야 합니다. 객체가 분산 시스템을 통해 네트워크를 통해 전송되는 경우 전송되는 객체는 직렬화 가능 인터페이스를 구현해야 합니다.
4. JVM 로딩 클래스 파일의 원리 메커니즘을 설명하세요.
JVM의 클래스 로딩은 ClassLoader와 그 하위 클래스에 의해 구현됩니다. Java ClassLoader는 중요한 Java 런타임 시스템 구성 요소입니다. 런타임 시 클래스 파일에서 클래스를 찾고 로드하는 일을 담당합니다.
(관련 튜토리얼 추천: Java 입문 튜토리얼)
5. 힙과 스택의 차이점은 무엇인가요?
Java의 메모리는 두 가지 범주로 나누어집니다. 하나는 스택 메모리이고 다른 하나는 힙 메모리입니다. 스택 메모리는 프로그램이 메소드에 들어갈 때 이 메소드 내부에 지역 변수를 저장하기 위해 이 메소드에 대한 전용 저장 공간이 할당된다는 의미입니다. 이 메소드에 할당된 스택도 해제됩니다. 따라서.
힙은 스택과 다른 기능을 갖는 메모리입니다. 일반적으로 현재 메소드 스택에 없는 데이터를 저장하는 데 사용됩니다. 예를 들어 new를 사용하여 생성된 객체는 힙에 배치되므로 다음과 같은 경우에도 사라지지 않습니다. 방법이 종료됩니다. 메서드의 지역 변수가 final로 수정된 후에는 스택 대신 힙에 배치됩니다.
6. GC란 무엇인가요?
GC는 메모리 처리를 잊어버리거나 잘못된 메모리를 재활용하면 프로그램이나 시스템이 부정확해지기 쉽습니다. Java에서 제공하는 GC 기능은 자동으로 메모리를 회수하는 목적을 달성하기 위해 객체가 범위를 초과하는지 여부를 자동으로 감지할 수 있습니다. Java 언어는 할당된 메모리를 해제하는 명시적인 작업 방법을 제공하지 않습니다.
7. 쓰레기 재활용의 장점과 원리. 그리고 2가지 재활용 메커니즘을 고려해보세요.
Java 언어의 주목할만한 특징은 C++ 프로그래머에게 가장 까다로운 메모리 관리 문제를 해결하는 가비지 수집 메커니즘의 도입입니다. 이를 통해 Java 프로그래머는 프로그램을 작성할 때 더 이상 메모리 관리를 고려할 필요가 없습니다. 가비지 수집 메커니즘으로 인해 Java의 개체에는 더 이상 "범위"라는 개념이 없습니다. 개체에 대한 참조에만 "범위"가 있습니다.
가비지 수집은 메모리 누수를 효과적으로 방지하고 사용 가능한 메모리를 효과적으로 사용할 수 있습니다. 가비지 수집기는 일반적으로 별도의 하위 수준 스레드로 실행되어 예측할 수 없는 상황에서 오랫동안 사용되지 않았거나 사망한 메모리 힙의 개체를 지우고 재활용합니다. 개체 또는 모든 개체가 가비지 수집됩니다.
재활용 메커니즘에는 세대별 복사 가비지 수집, 표시된 가비지 수집 및 증분 가비지 수집이 포함됩니다.
8. 가비지 컬렉터의 기본 원리는 무엇인가요? 가비지 수집기가 즉시 메모리를 회수할 수 있나요? 가비지 수집을 수행하도록 가상 머신에 적극적으로 알릴 수 있는 방법이 있습니까?
GC의 경우 프로그래머가 객체를 생성하면 GC는 객체의 주소, 크기 및 사용법을 모니터링하기 시작합니다. 일반적으로 GC는 방향성 그래프를 사용하여 힙의 모든 개체를 기록하고 관리합니다. 이런 방식으로 어떤 개체가 "접근 가능"하고 어떤 개체가 "접근 불가능"한지 결정됩니다. GC가 일부 개체에 "접근할 수 없음"을 확인하면 GC는 이러한 메모리 공간을 회수해야 합니다.
프로그래머는 System.gc()를 수동으로 실행하여 GC 실행을 알릴 수 있지만 Java 언어 사양에서는 GC 실행을 보장하지 않습니다.
9. Java에서 throw와 throw의 차이점은 무엇인가요?
throw는 java.lang.Throwable 클래스의 인스턴스화된 객체를 던지는 데 사용됩니다. 즉, 다음과 같이 throw 키워드를 통해 예외를 던질 수 있습니다.
throw new IllegalArgumentException(“XXXXXXXXX″)
throw의 역할은 메서드 선언 및 서명의 일부입니다. 메서드는 호출자가 이를 처리할 수 있도록 해당 예외를 발생시킵니다. Java에서는 처리되지 않은 모든 확인된 예외가 throws 절에서 선언되도록 강제됩니다.
(추천 동영상 튜토리얼: java 강좌)
10. Java에서 메모리 누수가 발생하나요? 간단히 설명해주세요.
먼저 메모리 누수가 무엇인지 설명하세요. 소위 메모리 누수란 프로그램에서 더 이상 사용하지 않는 객체나 변수가 메모리에 자리잡고 있다는 것을 의미합니다. Java에는 개체가 더 이상 참조되지 않을 때 개체가 가비지 수집기에 의해 메모리에서 자동으로 지워지는 것을 보장할 수 있는 가비지 수집 메커니즘이 있습니다.
Java는 가비지 수집 관리를 위해 방향성 그래프를 사용하므로 참조 순환 문제를 제거할 수 있습니다. 예를 들어 서로 참조하는 두 개체가 있는 경우 루트 프로세스에 액세스할 수 없는 한 GC도 가능합니다. 재활용하세요.
Java의 메모리 누수: 수명이 긴 객체가 수명이 짧은 객체에 대한 참조를 보유할 때 메모리 누수가 발생할 가능성이 있습니다. 비록 수명이 긴 객체가 이를 보유하고 있기 때문에 수명이 짧은 객체는 더 이상 필요하지 않습니다. 재활용은 Java에서 메모리 누수가 발생하는 시나리오입니다. 프로그래머가 객체를 생성하고 다시 사용하지 않을 수도 있습니다. 그러나 객체는 항상 참조되지만 재활용될 수는 없습니다. 이는 Java에서 메모리 누수가 발생할 수 있는 상황입니다. 예를 들어 캐시 시스템에서는 객체를 로드하여 캐시(예: 전역 맵 객체)에 저장합니다. 더 이상 사용할 수 없습니다. 이를 사용하면 객체는 항상 캐시에서 참조되지만 더 이상 사용되지 않습니다.
위 내용은 자바 고주파 기본 면접 질문——(3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!