>  기사  >  Java  >  일반적인 Java 면접 질문(답변 포함)

일반적인 Java 면접 질문(답변 포함)

(*-*)浩
(*-*)浩원래의
2019-11-26 15:02:512350검색

일반적인 Java 면접 질문(답변 포함)

배열을 사용하여 대기열을 구현하는 방법은 무엇입니까?

배열을 사용하여 큐를 구현할 때 오버플로 현상에 주의해야 합니다. 이 경우 배열을 반복하는 방법, 즉 배열의 끝을 연결하는 방법을 사용할 수 있습니다. 앞쪽 포인터를 사용하여 대기열의 첫 번째 위치를 가리키고 꼬리 포인터를 사용하여 대기열의 마지막 위치를 가리킵니다. (추천 학습: Java 공통 면접 질문)

내부 클래스가 지역 변수에 접근할 때 변수를 final로 수정해야 하는 이유는 무엇인가요?

생애주기가 다르기 때문이죠. 지역 변수는 메서드가 종료된 후에 삭제되지만 내부 클래스 개체가 반드시 삭제되는 것은 아닙니다. 이로 인해 내부 클래스가 존재하지 않는 변수를 참조하게 됩니다.

그래서 컴파일러는 내부 클래스에 지역 변수의 복사본을 생성합니다. 이 복사본의 수명 주기는 내부 클래스 개체와 동일하므로 위의 문제는 발생하지 않습니다.

그러나 이로 인해 변수 중 하나가 수정되면 두 변수의 값이 다를 수 있다는 문제가 발생합니다. 이 문제를 해결하기 위해 컴파일러에서는 두 변수가 동일한 값을 갖도록 로컬 변수를 최종 수정해야 합니다.

JDK8 이후 컴파일러는 내부 클래스에서 액세스하는 지역 변수를 최종 수정해야 한다고 요구하지 않지만 지역 변수 값은 (메서드 또는 내부 클래스에서) 수정할 수 없습니다. 그렇지 않으면 컴파일 오류가 보고됩니다. javap를 사용하여 컴파일된 바이트코드를 보면 컴파일러가 final을 추가한 것을 확인할 수 있습니다.

long s = 499999999 * 499999999 위 코드에서 s의 값은 무엇인가요?

코드의 계산 결과에 따르면 s의 값은 -1371654655여야 합니다. 이는 Java에서 오른쪽 값의 계산이 기본적으로 int 유형이기 때문입니다.

비정적 내부 클래스가 정적 메서드를 정의할 수 있나요?

public class OuterClass{
    private static float f = 1.0f;

    class InnerClass{
        public static float func(){return f;}
    }
}

위 코드는 정적 내부 클래스만 정적 메서드를 정의할 수 있으므로 컴파일 오류를 발생시킵니다.

잠금과 동기화의 차이점은 무엇인가요?

1. 使用方法的区别
- **Synchronized**:在需要同步的对象中加入此控制,`synchronized`可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
- **Lock**:需要显示指定起始位置和终止位置。一般使用`ReentrantLock`类做为锁,多个线程中必须要使用一个`ReentrantLock`类做为对象才能保证锁的生效。且在加锁和解锁处需要通过`lock()`和`unlock()`显示指出。所以一般会在`finally`块中写`unlock()`以防死锁。
2. 性能的区别
`synchronized`是托管给JVM执行的,而`lock`是java写的控制锁的代码。在Java1.5中,`synchronize`是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但是到了Java1.6,发生了变化。`synchronize`在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上`synchronize`的性能并不比Lock差。
  - **Synchronized**:采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着 **其他线程只能依靠阻塞来等待线程释放锁**。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。
  - **Lock**:用的是乐观锁方式。所谓乐观锁就是,**每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止**。乐观锁实现的机制就是`CAS`操作。我们可以进一步研究`ReentrantLock`的源代码,会发现其中比较重要的获得锁的一个方法是`compareAndSetState`。这里其实就是调用的CPU提供的特殊指令。
3. `ReentrantLock`:具有更好的可伸缩性:比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。

float 변수는 0과 어떻게 비교되나요?

0에 접근할 때 이러한 10진수 유형이 0과 직접적으로 같을 가능성은 매우 적으므로 ==를 사용하여 판단할 수 없습니다. |x-0|

//用程序表示就是

fabs(x) < 0.00001f

새로운 비정적 내부 클래스를 만드는 방법은 무엇입니까?

inner 클래스는 int a와 마찬가지로 선언 시 Outer.Inner a여야 합니다. 정적 내부 클래스와 비정적 내부 클래스 new의 경우 약간의 차이가 있습니다.

Outer.Inner a = new Outer( ).new Inner () (비정적, Outer 객체는 내부 클래스가 생성되기 전에 새로 생성될 수 있음)

Outer.Inner a = new Outer.Inner() (정적 내부 클래스)

Java 식별자 명명 규칙

포함할 수 있는 문자, 숫자, $, _(밑줄), 숫자로 시작할 수 없으며 Java 키워드 또는 예약어가 될 수 없습니다.

JDK에서 사용되는 디자인 패턴은 무엇입니까?

데코레이션 모드: java.io

단일 케이스 모드: 런타임 클래스

간단한 팩토리 모드: Integer.valueOf 메소드

Flyweight 모드: 문자열 상수 풀, Integer.valueOf(int i), Character.valueOf(char c) )

Iterator 모드: Iterator

책임 체인 모드: ClassLoader의 상위 위임 모델

Interpreter 모드: 정규식 java.util.regex.Pattern

ConcurrentHashMap이 스레드 안전성을 보장하는 방법

JDK 1.7 및 이전:

ConcurrentHashMap을 사용하면 여러 수정 작업을 동시에 수행할 수 있습니다. 핵심은 잠금 분리 기술을 사용하는 것입니다. 여러 잠금을 사용하여 해시 테이블의 여러 부분에 대한 수정을 제어합니다. ConcurrentHashMap은 내부적으로 세그먼트를 사용하여 이러한 다양한 부분을 나타냅니다. 각 세그먼트는 실제로 작은 해시 테이블이며 자체 잠금을 갖습니다. 여러 수정 작업이 서로 다른 세그먼트에서 발생하는 한 동시에 발생할 수 있습니다.

JDK 1.8:

Segment는 유지되지만 해당 속성은 이전 버전과 호환되도록 단순화되었습니다.

삽입 시 CAS 알고리즘을 사용하세요: unsafe.compareAndSwapInt(this, valueOffset, Expect, update). CAS(Compare And Swap)는 valueOffset 위치에 포함된 값이 예상 값과 동일한 경우 valueOffset 위치의 값을 업데이트하여 업데이트하고 true를 반환하고, 그렇지 않으면 업데이트하지 않고 false를 반환하는 것을 의미합니다. 삽입 시 키 또는 값은 null이 될 수 없습니다.

Java8의 HashMap과 유사합니다. 맨 아래 레이어는 여전히 "배열" 연결 목록 레드-블랙 트리로 구성됩니다.

기본 구조는 TreeNode 대신 TreeBin 개체를 저장합니다.

CAS는 잘 알려진 잠금 없는 알고리즘으로 ConcurrentHashMap에는 잠금이 없나요? 물론 그렇지 않습니다. 해시 값이 연결 목록의 헤드 노드와 동일하면 여전히 동기화되고 잠기며 연결 목록이 잠깁니다.

Thread.sleep()과 Thread.yield()&Thread.wait()

sleep()과 Yield()의 차이점은 둘 다 CPU를 해제합니다.

sleep()은 우선순위가 낮은 스레드에 실행할 기회를 줄 수 있습니다. 물론 우선순위가 같고 우선순위가 높은 스레드에 실행할 기회를 줄 수도 있습니다. 실행하다. .

Thread.sleep 및 Thread.yield()는 잠금 동작을 변경하지 않습니다. 현재 스레드가 잠금을 소유한 경우 Thread.sleep은 스레드가 잠금을 해제하도록 허용하지 않습니다. 기억하는 데 도움이 된다면 잠금 관련 메서드는 Object 클래스에 정의되어 있으므로 Thread.sleep을 호출해도 잠금 관련 동작에 영향을 미치지 않는다고 간단히 생각할 수 있습니다.

Thread.sleep 및 Object.wait는 현재 스레드를 일시 중단합니다. CPU 리소스의 경우 어떤 스레드가 일시 중단되더라도 더 이상 CPU 실행 시간이 필요하지 않습니다. OS는 실행 시간을 다른 스레드에 할당합니다. 차이점은 wait를 호출한 후 다른 스레드가 CPU 실행 시간을 다시 얻기 위해 inform/notifyAll을 실행해야 한다는 것입니다.

arraylist와 linkedlist의 차이점은 무엇인가요?

ArrayList와 LinkedList는 모두 List 인터페이스를 구현하지만 둘 사이에는 몇 가지 차이점이 있습니다.

(1) ArrayList는 Array에서 지원하는 인덱스 기반의 데이터 구조이므로 요소에 대한 임의 접근을 제공합니다

(2) ArrayList와 비교하여 삽입, 추가 및 LinkedList의 요소를 삭제하는 것이 더 빠릅니다

(3) LinkedList의 각 노드는 이전 및 다음 노드의 참조를 저장하기 때문에 LinkedList는 ArrayList보다 더 많은 메모리를 소비합니다

위 내용은 일반적인 Java 면접 질문(답변 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.