이 기사는 주로 참조에 대한 일반적인 Java 인터뷰 질문을 구성합니다. 특정 내용은 다음과 같습니다
1. 자바에서 수면과 대기의 차이
①이 두 가지 방법은 다른 클래스에서 나오고, 수면은 스레드 클래스에서 나오고, 대기는 객체 클래스에서 나옵니다.
수면은 스레드의 정적 클래스 방법입니다. 전화를 든 사람은 잠들게됩니다. B의 수면 방법이 스레드 A에서 호출 되더라도 실제로는 여전히 잠을 자고 있습니다. 스레드 B를 수면하려면 b의 코드에서 수면을 불러야합니다.
② 잠금 : 가장 중요한 것은 수면 방법이 잠금을 해제하지 않고 대기 방법이 잠금을 방출하여 다른 스레드가 동기 제어 블록이나 메소드를 사용할 수 있다는 것입니다.
수면은 시스템 자원을 전달하지 않습니다. 대기는 스레드 대기 풀에 입력하여 대기하고 시스템 리소스를 전송하고 다른 스레드가 CPU를 차지할 수 있습니다. 대기 스레드가 불충분 한 자원으로 실행되면 다시 나오는 것이 쓸모가 없기 때문에 일반적으로 대기는 시간 제한을 추가하지 않습니다. 다른 스레드가 Notify/Notifyall을 호출하여 대기 풀에있는 모든 스레드를 깨우려면 준비 대기열에 입력하고 OS가 시스템 리소스를 할당하기 위해 기다릴 때까지 기다려야합니다. 수면 (밀리 초)는 자동으로 깨어나도록 지정할 수 있습니다. 시간이 시간보다 작은 경우 인터럽트 () 만 호출하여 인터럽트를 강제로 할 수 있습니다.
strook.sleep (0)의 함수는 "운영 체제를 다시 한 번 다시 경쟁하기 위해 트리거"하는 것입니다.
사용 범위 : 사용 범위 : 대기, 알림 및 Notifyall은 동기화 제어 방법 또는 동기화 제어 블록에서만 사용할 수 있지만 수면은 어디서나 사용할 수 있습니다.
Synchronized (x) {x.notify () // wait ()}2. 자바의 해시 맵과 해시 가능의 차이
① 역사적 이유 : 해시 가능은 오래된 독창적 인 계급에 주어집니다. Hashmap은 Java 1.2에서 도입 한 MAP 인터페이스의 구현입니다.
Hashmap은 빈 키 값 쌍을 허용하지만 Hashtable은 그렇지 않습니다.
HASHMAP 비동기식은 해시 테이블보다 효율적이지만 해시 테이블 동기화
3. 예외에서 던지기와 던지기의 차이점을 간단히 설명하십시오.
① 던지기는 행동을 나타내며, 이는 예외가 발생 함을 의미합니다. 던지기는 상태를 나타내는데, 이는 방법이 예외가 발생할 수 있음을 의미합니다.
4. 메모리 오버플로와 메모리 누출의 차이
메모리가 오버 플로우를 사용하면 프로그램이 메모리에 적용될 때 사용하기에 충분한 메모리 공간이없고 메모리가 나타나지 않는다는 사실을 나타냅니다. 예를 들어, 정수가 적용되지만 오래 절약 할 수있는 경우 메모리 오버플로입니다.
메모리 누출 메모리 누출은 프로그램이 메모리를 신청 한 후에 적용된 메모리 공간을 확보 할 수 없음을 나타냅니다. 메모리 누출의 피해는 무시 될 수 있지만 메모리 누출 축적의 결과는 매우 심각합니다. 메모리가 아무리 많더라도 조만간 점유 될 것입니다.
메모리 누출은 결국 메모리를 벗어나게됩니다!
메모리 오버 플로우는 할당하는 데 필요한 메모리가 시스템이 제공 할 수있는 내용을 초과하고 시스템이 요구를 충족시킬 수 없으므로 오버플로가 발생 함을 의미합니다.
메모리 누출은 시스템에 적용하여 사용을 위해 메모리를 할당하기 위해 시스템에 적용 할 때이지만, 사용 후에는 반환되지 않습니다 (삭제). 결과적으로, 당신은 더 이상 신청 한 메모리에 액세스 할 수 없으며 (주소를 잃어 버렸을 수도 있음) 시스템은 필요한 프로그램에 다시 할당 할 수 없습니다. 모든 방법을 사용하여 플레이트를 채우는 경우 4 개의 과일 만 담을 수 있습니다. 당신이 5를 채우면, 당신은 땅에 떨어지고 그것을 먹을 수 없습니다. 이것은 오버플로입니다! 예를 들어, 스택이 가득 차면 스택이 가득 차면 오버플로라고 불리는 스택이 가득 차면 필연적으로 공간 오버 플로우가 발생합니다. 스택이 비어 있으면 스택이 비어있을 때 공간 오버플로가 발생하며 언더 플로라고합니다. 이는 할당 된 메모리가 메모리 오버플로라고하는 데이터 항목의 순서를 내리기에 충분하지 않음을 의미합니다.
발생하는 방식으로 분류 메모리 누출은 4 가지 범주로 나눌 수 있습니다.
memory 자주 메모리 누출. 메모리 누출로 발생하는 코드는 여러 번 실행되며 실행 될 때마다 메모리가 누출됩니다.
② 가끔 메모리 누출. 메모리 누출로 발생하는 코드는 특정 특정 환경이나 작업에서만 발생합니다. 규칙적이고 가끔은 상대적입니다. 특정 환경의 경우, 가끔 빈번해질 수 있습니다. 따라서 테스트 환경 및 테스트 방법은 메모리 누출을 감지하는 데 중요합니다.
③ 일회성 메모리 누출. 메모리 누출로 발생하는 코드는 한 번만 실행되거나 알고리즘 결함으로 인해 항상 메모리 누출이 항상 있습니다. 예를 들어, 클래스의 생성자에 메모리가 할당되지만 메모리는 파괴자에서 해제되지 않으므로 메모리 누출은 한 번만 발생합니다.
complic inmplicit Memory Leak. 이 프로그램은 작동 중에 메모리를 지속적으로 할당하지만 메모리가 끝날 때까지 메모리를 해제하지 않습니다. 엄격히 말하면, 프로그램은 궁극적으로 모든 요청 된 메모리를 해방시키기 때문에 여기에 메모리 누출이 없습니다. 그러나 서버 프로그램의 경우 실행하는 데 며칠, 몇 주 또는 몇 달이 걸리며 메모리를 제 시간에 해제하지 않으면 시스템의 모든 메모리가 소진 될 수 있습니다. 따라서 이러한 유형의 메모리 누출을 암시 적 메모리 누출이라고합니다.
프로그램을 사용하는 사용자의 관점에서 메모리 누출 자체는 해를 끼치 지 않습니다. 평범한 사용자는 메모리 누출이 전혀 느껴질 수 없습니다. 실제로 유해한 것은 메모리 누출의 축적이며 결국 시스템의 모든 메모리를 소비합니다. 이러한 관점에서 볼 때, 일회성 메모리 누출은 축적되지 않기 때문에 해롭지 않지만 암시 적 메모리 누출은 자주 및 가끔 메모리 누출보다 감지하기가 더 어렵 기 때문에 매우 유해합니다.
5. String, StringBuffer 및 StringBuilder의 차이
변덕스럽고 불변
문자열 클래스는 문자 배열을 사용하여 다음과 같이 문자열을 저장합니다. "최종"수정자가 있으므로 문자열 객체가 불변이라는 것을 알 수 있습니다.
개인 최종 문자 가치 [];
StringBuilder와 StringBuffer는 모두 AbstractStringBuilder 클래스에서 상속됩니다. AbstractStringBuilder에서 문자 배열은 문자열을 저장하는 데 사용됩니다. 다음과 같이, 두 객체가 모두 변한다는 것을 알 수 있습니다.
char [] 값;
② 다중 스레드와 안전입니다
문자열의 객체는 불변이기 때문에 상수로 이해 될 수 있으며, 이는 분명히 실 세상입니다.
AbstractStringBuilder는 StringBuilder 및 StringBuffer의 공개 상위 클래스로, 확장 캡시 틱, 추가, 인서트, 인덱스 및 기타 공개 방법과 같은 문자열의 일부 기본 작업을 정의합니다.
StringBuffer는 메소드에 동기화 잠금이 있거나 호출 된 메소드의 동기화 잠금 장치가 있으므로 스레드 안전입니다. 다음 소스 코드를 참조하십시오.
public synchronized stringbuffer reverse () {super.reverse (); 이것을 반환하십시오; } public int indexof (string str) {return indexof (str, 0); // 공개 동기화 된 int indexof (string str, int fromIndex) 메소드가 있습니다. StringBuilder는이 방법에 동기화 잠금을 추가하지 않으므로 스레드가 아닌 것입니다.
stringBuilder 및 StringBuffer 공통
StringBuilder와 StringBuffer에는 공개 부모 수업이 있습니다.
추상 클래스와 인터페이스의 차이점 중 하나는 일부 공개 서브 클래스 방법이 추상 클래스에서 정의 될 수 있다는 것입니다. 서브 클래스는 새로운 기능 만 추가하면되며 기존 방법을 반복 할 필요가 없습니다. 인터페이스는 방법과 상수 만 정의합니다.
StringBuilder 및 StringBuffer의 방법은 Super.Append (...)와 같은 AbstractStringBuilder에서 공개 방법을 호출합니다. StringBuffer가 메소드에 동기화 된 키워드를 추가하고 동기화를 수행하는 것은 단지 아닙니다.
마지막으로, 프로그램이 멀티 스레드가 아닌 경우 StringBuilder를 사용하는 것이 StringBuffer보다 효율적입니다.
6. 배열과 링크 된 목록의 차이
둘 다 데이터 구조에 속합니다
논리 구조에서 :
배열은 고정 길이 (요소 수)를 미리 정의해야하며 데이터의 동적 증가 및 감소에 적응할 수 없습니다. 데이터가 증가하면 요소 수가 원래 정의 된 요소를 초과 할 수 있습니다. 데이터가 감소하면 메모리 폐기물이 발생합니다. 배열은 첨자에 따라 직접 액세스 할 수 있습니다.
in 링크 된 목록은 동적으로 저장되고 할당되어 데이터의 동적 증가 및 감소에 적응할 수 있으며 데이터 항목을 쉽게 삽입하고 삭제할 수 있습니다. (배열에 데이터 항목을 삽입하고 삭제할 때는 다른 데이터 항목을 이동해야합니다. 이는 매우 번거 롭습니다) 링크 된 목록은 다음 포인터에 따라 다음 요소를 찾아야합니다.
메모리 스토리지에서 :
① (정적) 배열은 스택에서 공간을 할당하여 프로그래머에게는 편리하고 빠르지 만 자유는 거의 없습니다.
링크 된 목록은 힙에서 공간을 할당하며, 이는 많은 자유가 있지만 관리를 신청하기에 더 번거 롭습니다.
위의 비교에서 데이터에 빠르게 액세스하고 요소를 삽입하고 삭제하지 않으면 배열을 사용해야한다는 것을 알 수 있습니다. 반대로 요소를 자주 삽입하고 삭제 해야하는 경우 링크 된 목록 데이터 구조를 사용해야합니다.
7. ArrayList와 LinkedList의 차이
Arraylist는 동적 배열을 기반으로 한 데이터 구조를 구현하며 LinkedList는 링크 된 목록을 기반으로 한 데이터 구조를 기반으로합니다.
rand random ac
Adding 및 삭제 작업이 추가 및 제거되면 LinedList는 ArrayList가 데이터를 이동해야하기 때문에 비교적 이점이 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.