흔한 자바 면접 문제
1. 자바에서 sleep와wait의 차이
① 이 두 가지 방법은 서로 다른 종류에서 나온다. 각각sleep은Thread종류에서,wait는Object종류에서 나온다.
sleep는Thread의 정적 클래스 방법입니다. 누가 호출하고 누가 자요. a라인에서 b의sleep방법을 호출해도 실제로는 a가 자요. b라인을 자게 하려면 b의 코드에서sleep를 호출해야 합니다.
② 자물쇠: 가장 주요한 것은sleep 방법은 자물쇠를 풀지 않고wait 방법은 자물쇠를 풀어서 다른 라인에서 동기화 제어 블록이나 방법을 사용할 수 있도록 한다.
sleep는 시스템 자원을 양보하지 않습니다.wait는 라인 대기 탱크에 들어가서 시스템 자원을 양보하고 다른 라인은 CPU를 차지할 수 있습니다.일반적인wait는 시간 제한을 두지 않습니다. 만약wait 라인의 운행 자원이 부족하면 다시 나와도 소용없습니다. 다른 라인이 notify/notifyAll을 호출하여 대기 탱크의 모든 라인을 깨워야 준비 대기열에 들어가 OS 분배 시스템 자원을 기다릴 수 있습니다.sleep (milliseconds) 는 시간 지정으로 자동으로 깨울 수 있습니다. 시간이 안 되면interrupt () 를 호출해서 강제로 끊을 수 있습니다.
Thread.sleep(0)의 역할은 "운영 체제를 촉발하여 즉시 CPU 경쟁을 다시 진행하는 것"이다.
③ 사용 범위:wait,notify와notifyAll은 동기화 제어 방법이나 동기화 제어 블록에서만 사용할 수 있으며,sleep는 어디에서나 사용할 수 있다.
synchronized(x){
x.notify()
// wait()
}
2. Java에서 HashMap과 HashTable의 차이① 역사적 원인: Hashtable은 낡은 Dictonary 클래스를 부여하고, HashMap은 Java1.2가 도입한 맵 인터페이스의 실현
② HashMap은 빈 키 값을 허용하지만 HashTable은 허용하지 않음
③ HashTable이 동기화되지 않고 HashMap이 비동기화되어 HashTable보다 효율성이 높음
3. 이상 중에서throw와throws가 어떤 차이가 있는지 약술하세요
①throw는 동작을 대표하여 이상한 동작을 던지는 것을 나타낸다.throws는 하나의 상태를 대표합니다. 대표 방법은 이상이 있을 수 있습니다.
②throw는 방법 실현에 사용되고 throws는 방법 성명에 사용된다
③throw는 한 가지 이상만 던질 수 있고, throws는 여러 개의 이상을 던질 수 있다
4. 메모리 넘침과 메모리 유출의 차이
메모리 넘침out of memory는 프로그램이 메모리를 신청할 때 사용할 충분한 메모리 공간이 없기 때문에 out of memory가 나타나는 것을 말한다.예를 들어integer를 신청했지만 롱을 저장해야 저장할 수 있는 수를 저장했습니다. 그것은 메모리가 넘치는 것입니다.
메모리 유출memoryleak는 프로그램이 메모리를 신청한 후 이미 신청한 메모리 공간을 방출할 수 없기 때문에 한 번의 메모리 유출의 위해는 무시할 수 있지만 메모리 유출의 퇴적 결과는 매우 심각하다. 아무리 많은 메모리가 있어도 조만간 빛을 차지할 것이다.
memory leak는 결국 out of memory를 초래합니다!
메모리 넘침은 당신이 분배를 요구하는 메모리가 시스템이 당신에게 줄 수 있는 것보다 초과되어 시스템이 수요를 만족시키지 못하기 때문에 넘침이 발생하는 것이다.
메모리 유출은 시스템에 메모리 분배를 신청하여 사용하는 것을 가리키지만, 사용한 후에 반환하지 않는 것을 가리킨다. 결과적으로 당신이 신청한 메모리는 자신도 더 이상 접근할 수 없고, 시스템도 다시 필요한 프로그램에 분배할 수 없다.한 접시에 온갖 방법을 다 써서 과일 네 개만 담을 수 있는데, 너는 다섯 개를 담았는데, 결국 땅에 떨어져 먹을 수 없게 되었다.이게 넘침이야!예를 들어 창고는 창고가 가득 찼을 때 다시 창고에 들어가면 반드시 공간 넘침이 발생한다. 넘침이라고 하고 창고가 비어 있을 때 다시 창고를 돌려도 공간 넘침이 발생한다. 이를 하류라고 한다.데이터 항목의 시퀀스를 내려놓기 위해 분배된 메모리가 부족하다는 것을 메모리 넘침이라고 한다.
발생하는 방식으로 분류하면 메모리 유출은 4가지로 나눌 수 있다.
① 상발성 메모리 유출.메모리 유출이 발생하는 코드는 여러 차례 실행되며, 실행될 때마다 메모리 유출이 발생한다.
② 우발적인 메모리 유출.메모리 유출이 발생하는 코드는 특정한 환경이나 조작 과정 하에서만 발생할 수 있다.상발성과 우발성은 상대적이다.특정한 환경에 대해 우발적인 것은 아마도 상발적인 것이 될 것이다.그래서 테스트 환경과 테스트 방법은 메모리 유출을 측정하는 데 매우 중요하다.
③ 일회용 메모리 누출.메모리 유출이 발생하는 코드는 한 번만 실행되거나 알고리즘상의 결함으로 인해 한 개의 메모리가 유출될 수 있습니다.예를 들어 클래스의 구조 함수에서 메모리를 분배하고 분석 함수에서 이 메모리를 방출하지 않기 때문에 메모리 유출은 한 번만 발생한다.
④ 암시적 메모리 누출.프로그램은 실행 과정에서 끊임없이 메모리를 분배하지만, 끝날 때까지 메모리를 방출합니다.엄밀히 말하면 여기에는 메모리 유출이 발생하지 않았다. 최종 절차가 신청한 모든 메모리를 방출했기 때문이다.그러나 서버 프로그램에 대해 며칠, 몇 주, 심지어 몇 개월을 실행해야 하기 때문에 메모리를 제때에 방출하지 않으면 최종적으로 시스템의 모든 메모리를 소모할 수 있다.그래서 우리는 이런 메모리 유출을 스텔스 메모리 유출이라고 부른다.
사용자 사용 프로그램의 측면에서 볼 때 메모리 유출 자체는 아무런 해를 끼치지 않고 일반적인 사용자로서 메모리 유출의 존재를 전혀 느끼지 못한다.진정으로 해를 끼치는 것은 메모리 유출의 퇴적이다. 이것은 결국 시스템의 모든 메모리를 소모하게 될 것이다.이런 측면에서 볼 때 일회용 메모리 유출은 아무런 해가 없다. 왜냐하면 축적되지 않기 때문이다. 스텔스 메모리 유출의 위해성은 매우 크다. 왜냐하면 상발성과 우발적인 메모리 유출보다 검출되기 어렵기 때문이다.
5. String, StringBuffer와 StringBuilder의 차이
① 가변과 가변
String 클래스에서 문자열 그룹을 사용하여 문자열을 저장합니다. 다음과 같습니다. "final"수식자가 있기 때문에string 대상이 변할 수 없다는 것을 알 수 있습니다.
private final char value[];
StringBuilder와 StringBuffer는 모두 AbstractStringBuilder 클래스에서 계승되고 AbstractStringBuilder에서도 문자열 그룹을 사용하여 문자열을 저장합니다. 다음과 같이 두 대상이 모두 가변적임을 알 수 있습니다.
char[] value;
② 다중 스레드 안전 여부
String의 대상은 변할 수 없고 상량으로 이해할 수 있으며 분명히 라인이 안전합니다.
AbstractStringBuilder는 StringBuilder와 StringBuffer의 공공 부류로 expandCapacity, append, insert, indexOf 등 일부 문자열의 기본 동작을 정의했다.
StringBuffer는 방법에 동기화 자물쇠를 추가하거나 호출하는 방법에 동기화 자물쇠를 추가하기 때문에 라인이 안전합니다.다음 소스 코드를 참조하십시오.
public synchronized StringBuffer reverse() {
super.reverse();
return this;
}
public int indexOf(String str) {
return indexOf(str, 0); // public synchronized int indexOf(String str, int fromIndex)
}
StringBuilder는 메서드에 동기식 잠금을 추가하지 않으므로 비스레드가 안전합니다.③ StringBuilder와 StringBuffer의 공통점
StringBuilder와 StringBuffer는 공통 상위 AbstractStringBuilder(추상 클래스)가 있습니다.
추상류와 인터페이스의 차이점은 추상류에서 일부 자류의 공공 방법을 정의할 수 있고 자류는 새로운 기능만 추가하고 이미 존재하는 방법을 중복적으로 쓸 필요가 없다는 것이다.인터페이스는 방법에 대한 설명과 상량의 정의일 뿐이다.
StringBuilder, StringBuffer의 방법은 모두 AbstractStringBuilder의 공공 방법, 예를 들어 슈퍼를 호출합니다.append(...).다만 StringBuffer는 방법에 synchronized 키워드를 추가하여 동기화합니다.
마지막으로 프로그램이 다중 루틴이 아니라면 StringBuilder를 사용하면 StringBuffer보다 효율이 높습니다.
6. 수조와 체인 테이블의 차이
양자는 모두 하나의 데이터 구조에 속한다
논리적 구조:
① 수조는 반드시 고정된 길이(원소 개수)를 미리 정의해야 하며 데이터의 동적 증감에 적응하지 못한다.데이터가 증가할 때 원래 정의된 원소 개수를 초과할 수 있습니다.데이터가 줄어들면 메모리 낭비가 발생한다.수조는 아래 표에 따라 직접 접근할 수 있다.
② 체인 테이블은 동적으로 저장 분배를 하고 데이터의 동적 증감에 적응할 수 있으며 데이터 항목을 쉽게 삽입하고 삭제할 수 있다.(수조에 데이터 항목을 삽입하고 삭제할 때 다른 데이터 항목을 이동해야 하기 때문에 매우 번거롭다) 체인 테이블은next 바늘에 따라 다음 요소를 찾아야 한다.
메모리 스토리지의 경우:
①(정적)수조는 창고에서 공간을 분배하여 프로그래머에게 편리하고 빠르지만 자유도가 적다.
② 체인표는 더미에서 공간을 분배하고 자유도가 크지만 관리를 신청하는 것이 번거롭다.
위에서 비교한 바와 같이 데이터에 신속하게 접근해야 하거나 요소를 삽입하고 삭제하지 않으면 수조를 사용해야 한다.반대로 요소를 자주 삽입하고 삭제해야 한다면 체인 테이블 데이터 구조를 사용해야 한다.
7. ArrayList와 LinkedList의 차이
① ArrayList는 동적 수조를 바탕으로 하는 데이터 구조를 실현했고 LinkedList는 체인표를 바탕으로 하는 데이터 구조를 실현했다.
② get과 set에 무작위로 접근하는 데 있어서 ArrayList는 LinkedList보다 낫다고 생각한다. 왜냐하면 LinkedList는 바늘을 움직여야 하기 때문이다.
③ 추가와 삭제 작업add와remove에 대해 LinedList가 비교적 우세하다. 왜냐하면 ArrayList가 데이터를 이동해야 하기 때문이다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.