>  기사  >  Java  >  Java 면접 질문(구직 시 꼭 읽어야 함)

Java 면접 질문(구직 시 꼭 읽어야 함)

怪我咯
怪我咯원래의
2017-06-26 11:45:351805검색

개인 참고자료 요약입니다. 유사점은 순전히 우연입니다!

1. 해시맵의 구현 원리와 해시테이블의 스레드 안전성은 어떻게 구현되나요?
HashMap은 실제로 선형 배열로 구현되므로 데이터를 저장하는 컨테이너가 선형 배열이라고 이해할 수 있습니다.
먼저 HashMap에 정적 내부 클래스 Entry를 구현합니다. 중요한 속성은 key와 value이며, Entry가 HashMap 키-값 쌍 구현을 위한 기본 Bean임을 분명히 알 수 있습니다. 위에서 말한 HashMap의 기본은 선형 배열이고, 이 배열은 Entry[]이고, Map의 내용은 Entry[]에 저장됩니다.
HashTable 컨테이너는 스레드 안전성을 보장하기 위해 동기화를 사용하지만 스레드 경쟁이 치열한 경우 HashTable의 효율성이 매우 낮습니다. 왜냐하면 한 스레드가 HashTable의 동기화 방식에 접근할 때 다른 스레드가 HashTable의 동기화 방식에 접근할 때 Blocking 또는 Polling 상태에 들어갈 수 있기 때문입니다.
ConcurrentHashMap에서 사용하는 잠금 분할 기술은 먼저 데이터를 세그먼트로 나누어 저장한 다음 스레드가 데이터의 한 세그먼트에 액세스하기 위해 잠금을 점유하면 다른 세그먼트의 데이터에도 액세스할 수 있습니다. 다른 스레드 액세스로.

2. hashmap의 put()과 get() 구현 원리는 무엇인가요?
첫 번째 키-값 쌍 A가 들어오고 해당 키의 해시를 계산하여 얻은 index=0은 Entry[0] = A로 기록됩니다. 잠시 후 또 다른 키-값 쌍 B가 들어오고 계산에 따르면 해당 인덱스는 0이 됩니다. HashMap은 다음을 수행합니다: B.next = A, Entry[0] = B. C가 다시 들어오면 index도 0과 같고 C.next = B, Entry[0] = C; index = 0인 곳 실제로 3개의 키-값 쌍인 A, B, C에 접근하고, 다음 속성을 통해 함께 연결됩니다. 궁금한 점이 있으면 걱정하지 마세요. 즉, 마지막으로 삽입된 요소가 배열에 저장됩니다.
get()은 먼저 찾은 다음 통과합니다.


3. 봄콩의 생애주기?
스프링에서는 기본적으로 싱글톤 속성이 true입니다. false로 설정된 경우에만 별칭으로 얻은 Bean을 지정할 때마다 새 인스턴스가 생성됩니다.
3.1: Bean 생성: 컨테이너는 Bean의 정의 정보를 찾아 인스턴스화합니다.
3.2: 속성 주입.
3.3: BeanNameAware
3.4: BeanFactoryAware의 setBeanFactory()
3.5: BeanPostProcessors의 ProcessBeforeInitialization()
3.6: 초기화Bean의 afterPropertiesSet():
3.7: Bean 정의 파일에 init-method 정의:
3.8: BeanPostProcessors의 프로세스 초기화 후()
DisposableBean의 destroy(), destroy-method는 Bean 정의 파일


4에 정의되어 있습니다. Spring은 트랜잭션을 어떻게 관리합니까?
Spring 트랜잭션은 Spring AOP의 구현이라고 할 수 있습니다. 반사 및 동적 프록시.

AOP 관점 지향 프로그래밍은 소스 코드를 수정하지 않고 원래 기능을 확장하고 프록시 클래스를 통해 특정 클래스를 운영하는 것을 의미합니다.

Spring은 Spring 컨테이너를 통해 객체를 관리하며, Spring은 구성 파일에 따라 객체를 관리합니다.

봄에는 프로그래밍 방식과 선언적 방식으로 트랜잭션을 선언하는 두 가지 방법이 있습니다. Spring은 주로 "선언적 트랜잭션"을 통해 트랜잭션을 관리합니다. 즉, 구성 파일에 선언되고 트랜잭션 측면은 AOP를 통해 프로그램에 잘립니다. 가장 큰 이점은 코드 양이 크게 줄어든다는 것입니다.


5. 서비스 계층은 단일 인스턴스입니까, 아니면 다중 인스턴스입니까? 스레드로부터 안전합니까? 여러 인스턴스를 수행하려면 어떻게 해야 합니까?
Spring에 의해 생성된 객체는 기본적으로 싱글톤입니다. 범위 속성을 통해 여러 인스턴스로 변경할 수 있습니다.



5.1. 엄밀히 말하면 ServletMapping은 싱글톤 인스턴스에 해당합니다. 5.2 서블릿 스레드의 안전성을 유지하는 방법에는 여러 가지가 있습니다. 일반적으로 동기화 블록(또는 메소드)은 공유 데이터를 보호하는 데 사용됩니다. 두 번째로 ThreadLocal을 사용하여 안전한 채널을 열 수 있습니다. 동시에 스레드 안전을 위해 상대방 스레드를 차단하면 성능이 매우 저하됩니다. 다중 스레드 동시성을 방지하려면 C 계층에서 변수를 정의하지 마십시오.

6. 사물의 확산? 데이터베이스 격리 수준? PROPAGATION_REQUIRED 거래가 존재하는 경우 현재 거래가 지원됩니다. 거래가 없으면 활성화
PROPAGATION_SUPPORTS 거래가 있으면 현재 거래를 지원합니다. 트랜잭션이 없는 경우 비트랜잭션 실행
PROPAGATION_MANDATORY 트랜잭션이 이미 존재하는 경우 현재 트랜잭션을 지원합니다. 활성 트랜잭션이 없으면 예외가 발생합니다.
PROPAGATION_REQUIRES_NEW는 항상 새 트랜잭션을 시작합니다. 거래가 이미 존재하는 경우 기존 거래가 일시 중지됩니다.
PROPAGATION_NOT_SUPPORTED 항상 비트랜잭션으로 실행하고 기존 트랜잭션을 일시 중지합니다.
PROPAGATION_NEVER는 항상 비트랜잭션으로 실행되며 활성 트랜잭션이 있으면 예외가 발생합니다.
PROPAGATION_NESTED 활성 트랜잭션이 있으면 중첩 트랜잭션에서 실행됩니다. 활성 트랜잭션이 없으면
가 TransactionDefinition에 따라 실행됩니다. .PROPAGATION_REQUIRED 속성
기본적으로
PROPAGATION_REQUIRED
를 사용합니다.

 ① 직렬화 가능: 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기의 발생을 방지할 수 있습니다.

 ② 반복 읽기: 더티 읽기 및 반복 불가능 읽기의 발생을 방지할 수 있습니다.

  ③ 읽기 커밋: 더티 읽기 발생을 방지할 수 있습니다.

 ④ 커밋되지 않은 읽기: 가장 낮은 수준이며 어떤 상황에서도 보장되지 않습니다.
일반 데이터베이스의 기본 수준은 읽기 커밋입니다.

MySQL의 기본 격리 수준은 반복 읽기입니다.

MySQL 데이터베이스에서 현재 트랜잭션의 격리 수준 보기:

select @@tx_isolation;
MySQL 데이터베이스에서 트랜잭션의 격리 수준 설정:

set [glogal | ;

set tx_isolation='격리 수준 이름;'
기억하세요: 데이터베이스의 격리 수준 설정은 트랜잭션을 시작하기 전에 이루어져야 합니다!

7. Arraylist는 어떻게 스레드 안전성을 달성합니까?
따라서 이 스레드 안전 문제를 해결하려면 다음과 같이 Collections.synchronizedList()를 사용할 수 있습니다.

List> data=Collections.synchronizedList(new ArrayList> ; ());
8. Tomcat의 메모리 크기를 구성하는 방법은 무엇입니까?
Tomcat이 사용할 수 있는 기본 메모리는 128MB입니다. 대규모 애플리케이션 프로젝트에서는 이 메모리가 충분하지 않으므로 늘려야 합니다. 선택할 수 있는 방법은 여러 가지가 있습니다.

첫 번째 방법:

 Windows에서는 /bin/catalina.bat 파일, Unix에서는 /bin/catalina.sh 파일 앞에 다음 설정을 추가합니다.

 JAVA_OPTS ='-Xms [초기화 메모리 크기] -Xmx [사용 가능한 최대 메모리]'

 이 두 매개변수의 값을 늘려야 합니다. 예:

 JAVA_OPTS='-Xms256m -Xmx512m'

 초기 메모리는 256MB, 사용 가능한 최대 메모리는 512MB라는 뜻입니다.

두 번째 방법 : 환경 변수에 설정 변수명 : JAVA_OPTS 변수 값 : -Xms512m -Xmx512m
세 번째 방법 : 처음 두 가지 방법은 bin 디렉토리에 catalina.bat가 있는 경우(예를 들어 직접 압축을 푼 경우) Tomcat 등), 설치된 Tomcat 버전 중 일부에는 catalina.bat가 없습니다. 물론 이 방법이 가장 일반적인 방법이기도 합니다. tomcatHome//bin//tomcat5w를 엽니다. exe에서 Java 탭을 클릭하면 그 중 초기 메모리 풀과 최대 메모리 풀의 두 가지 항목이 있는 것으로 나타났습니다. 초기 메모리 풀은 초기에 설정된 메모리 크기입니다. 최대 메모리 풀은 최대 메모리 크기입니다. 설정한 후 OK를 누른 다음 TOMCAT을 다시 시작하면 tomcat에서 jvm에 사용 가능한 메모리가 변경된 것을 발견할 수 있습니다. catalina.bat의 @echo off에 추가하세요(두 번째 줄).

set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=256m

9. lServlet 인터페이스 SUN Company는 GenericServlet과 HttpServlet이라는 두 가지 기본 구현 클래스를 정의합니다.
GET 요청인 경우 HttpServlet의 doGet 메서드를 호출하고 Post 요청인 경우 doPost 메서드를 호출합니다. 따라서 개발자가 서블릿을 작성할 때 일반적으로 서비스 메서드를 덮어쓰는 대신 doGet 또는 doPost 메서드만 재정의하면 됩니다

위 내용은 Java 면접 질문(구직 시 꼭 읽어야 함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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