자바 면접관이 자주 묻는 몇 가지 면접 질문 (2021)

하나 : 자바 재단

  1. 객체 지향의 세 가지 특징

    캡슐화, 상속, 다형성

  2. 오버로딩과 다시 쓰기의 차이점

① 동일한 클래스에서 오버로딩이 발생하고, 메소드 이름이 동일해야하고, 매개 변수 유형이 다르고, 번호가 다르고, 순서가 다르며, 메소드 반환 값과 액세스 수정자가 다를 수 있습니다.

② 방법의 재 작성은 "동일한 2 개, 작은 2 개, 큰 1 개"를 따라야합니다.

  • "Two same"은 메소드 이름이 동일하고 매개 변수 목록이 동일 함을 의미합니다.

  • "Two small"은 하위 클래스 메서드의 반환 값 유형이 부모 메서드의 반환 값 유형보다 작거나 같아야하며 하위 클래스 메서드 선언에 의해 throw 된 예외 클래스가 throw 된 예외 클래스보다 작거나 같아야 함을 의미합니다. 부모 메서드 선언. ;

  • "One big"은 하위 클래스 메서드의 액세스 권한이 부모 클래스 메서드의 액세스 권한보다 크거나 같아야 함을 의미합니다.

  1. Java가 값으로 만 전달하는 이유

기본 유형의 경우 값의 사본이고, 참조 유형의 경우 메소드 매개 변수의 상태를 변경할 수있는 참조 주소 값의 사본입니다.

  1. == 、 equals 和 hashcode

기본 데이터 유형비교는 값, 참조 데이터 유형입니다.비교는 메모리 주소이며 비교 값을 다시 쓰는 것과 같으며 ==와 비슷하게 다시 쓰지 않습니다.

hashCode ()의 목적은 해시 코드라고도하는 해시 코드를 얻는 것입니다. 실제로
정수를 반환합니다 . 이 해시 코드의 기능은 해시 테이블에서 개체의 인덱스 위치를 결정하는 것입니다. hashCode ()는 JDK의
Object.java에 정의되어 있습니다 . 이는 Java의 모든 클래스에 hashCode ()
함수 가 포함되어 있음을 의미 합니다. (반복 불가능한 hashSet는 왜 hashCode가 있는지 설명합니다)

  1. String, StringBuffer 및 StringBuilder의 차이점은 무엇입니까?

① Mutability : String의 맨 아래 레이어는 최종 수정이 가능한 char 배열로, 변경 불가능한 반면 stringBuffer와 stringBuilder는 최종 수정이 아닙니다.

② 스레드 안전성 : 문자열은 불변이며 상수, 스레드로부터 안전한 stringBuffer는 메서드에 동기화 잠금을 추가합니다. 이는 스레드로부터 안전하고 stringBulider는 그렇지 않습니다. 안전하지 않습니다.

③ 성능 : 문자열 타입이 변경 될 때마다 새로운 객체가 생성되고, stringBuffer와 stringBuilder가 원래 객체에서 동작합니다.

  1. 반사 메커니즘 및 응용 시나리오

JAVA 리플렉션 메커니즘은 실행 상태에 있으며 모든 클래스에 대해이 클래스의 모든 속성과 메서드를 알 수 있습니다. 모든 개체에 대해 해당 메서드와 속성을 호출 할 수 있습니다. 이러한 종류의 동적으로 획득 된 정보 및 동적 호출 함수 객체의 메소드를
자바 언어의 반영 메커니즘 이라고 합니다.

① JDBC를
사용하여 데이터베이스 연결할 Class.forName ()을 사용하여 리플렉션을 통해 데이터베이스의 드라이버를로드합니다.

② Spring 프레임 워크의 IOC (Dynamic Loading Management Bean) 객체 생성 및
AOP (Dynamic Proxy) 기능은 리플렉션과 관련이 있습니다.

  1. 스레드를 만드는 방법은 무엇입니까?

① 스레드 클래스를 생성하기 위해 Thread 클래스 상속

  • Thread 클래스의 하위 클래스를 정의하고이 클래스의 run 메서드를 재정의합니다.

  • Thread 하위 클래스의 인스턴스를 만듭니다. 즉, 스레드 개체를 만듭니다.

  • 스레드를 시작하려면 스레드 개체의 start () 메서드를 호출하십시오.

② Runnable 인터페이스를 통해 스레드 클래스 생성

  • 실행 가능한 인터페이스의 구현 클래스를 정의하고 인터페이스의 run () 메서드를 재정의합니다.

  • Thread 개체를 만들고 Runnable 구현 클래스의 인스턴스를 Thread의 대상으로 사용합니다.

  • 스레드를 시작하려면 스레드 개체의 start () 메서드를 호출하십시오.

8. 동기화와 재진입 잠금의 차이점은 무엇입니까?

Synchronized는 키워드이고 ReentrantLock은 상속이 가능한 클래스이며 메소드를 가질 수 있으며 다양한 클래스 변수를 가질 수 있습니다.

  • ReentrantLock은 잠금 획득 대기 시간을 설정하여 교착 상태를 방지 할 수 있습니다.

  • ReentrantLock은 다양한 잠금에 대한 정보를 얻을 수 있습니다.

  • ReentrantLock은 여러 알림을 유연하게 구현할 수 있습니다.

  • ReentrantLock의 맨 아래 계층은 Unsafe park 메서드를 호출하여 잠그고 동기화 된 작업은 개체 헤더의 마크
    단어 여야합니다 .

  1. 스레드 수명주기

여기에 사진 설명 삽입

  1. 스레드 교착 상태를 방지하는 방법

상호 배타적 조건의 파괴 : 우리는 잠금을 사용하여 상호 배타적 인 상태로 만들기 때문에이 조건을 파괴 할 방법이 없습니다.

파기 요청 및 보유 조건 : 모든 자원을 한번에 적용합니다.

파기 및 비 박탈 조건 : 자원의 일부를 점유하고있는 쓰레드가 다른 자원을 더 신청할 경우, 응용이 실패 할 경우 자신이 점유 한 자원을 적극적으로 해제 할 수있다.

주기 대기 조건 중단 : 자원을 순서대로 신청하여 방지한다. 특정 순서로 자원을 신청하고 역순으로 자원을 해제합니다. 루프 대기 조건을 파괴하십시오.

  1. BIO, NIO 및 AIO의 차이점

BIO : 일반적으로 사용되는 기존
IO 인 동기식 차단 IO 는 단순 모드, 사용하기 쉬우 며 동시 처리 능력이 낮다는 특징이 있습니다.

NIO : 동기식 비 차단 IO는
버퍼, 채널 및 선택기의 세 가지 핵심 구성 요소 있는 기존 IO 의 업그레이드 입니다 . 클라이언트와 서버는
채널 (채널)을 통해 통신하여 멀티플렉싱을 수행합니다.

AIO : 비동기식 비 차단 IO는 NIO의 업그레이드입니다. 비동기식 IO의 작동은 이벤트 및 콜백 메커니즘을 기반으로합니다.

  1. List, Set, Map 및 하위 클래스의 차이점

여기에 사진 설명 삽입

  1. HashMap과 HashTable의 차이점은 무엇입니까?
  • HashMap은 HashTable의
    contains 메소드 를 제거 하지만 containsValue () 및 containsKey () 메소드를 추가합니다.

  • HashTable은 동기화되고 스레드로부터 안전하지만 HashMap은 동기화되지 않으므로 hashTable보다 효율적입니다.

  • HashMap은 빈 키 값을 허용하지만 hashTable은 허용하지 않습니다.

  1. HashMap의 기본 구현

JDK1.8 HashMap 앞
의 하단은 배열이고 함께 사용되는 연결 목록체인 해시 입니다. HashMap은 키의 hashCode가 perturbation 함수에 의해 처리 된 후 해시 값을 얻은 다음 (n-1) & hash를 사용하여 현재 요소가 저장된 위치를 결정합니다 (n은 배열의 길이를 나타냄). 현재 위치에 요소가있는 경우 해당 요소의 해시 값과 키와 저장할 요소가 동일한 지, 동일하면 직접 덮어 쓰기, 동일하지 않은지 판단 , 링크 된 목록에 포함됩니다.

jdk1.8은 해시 충돌 해결에 큰 변화를 가져 왔는데, 링크드리스트의 길이가 임계 값 (기본값 8)보다 크면 링크드리스트가 레드-블랙 트리로 변환되어 검색 시간이 단축됩니다.

  1. ConcurrentHashMap 스레드가 안전한 이유는 무엇입니까?

Java8의 ConcruuentHashMap에서 사용하는 동기화 잠금 및 CAS 메커니즘입니다. 의 Java7 구조 세그먼트 목록이 배열 + + HashEntry 배열 로 진화 노드 목록 배열 + / 레드 - 블랙 트리 , 노드 HashEntry의 유사하다 구조. 충돌이 일정 크기에 도달하면 빨강-검정 트리로 변환되고, 충돌이 일정 수 미만이면 연결 목록으로 돌아갑니다.


  1. 수면과 대기 방법의 차이점

sleep () 메서드는 호출 스레드가 절전 상태로 들어갈 수 있도록 허용하는 스레드 클래스의 정적 메서드이지만 객체의 기계 잠금이 해제되지 않으며 다른 스레드는 여전히 객체에 액세스 할 수 없습니다. 휴면 시간이 끝나면 스레드는 준비 상태가되고 CPU 실행 시간 동안 다른 스레드와 경쟁합니다.

wait ()는 Object 클래스의 메소드입니다. 스레드가 wait 메소드로 실행되면 해당 객체와 관련된 대기 풀에 들어가는 동시에 다른 스레드가 액세스 할 수 있도록 객체의 머신 잠금을 해제합니다. notify 및 notifyAll 메소드를 사용하십시오. 대기중인 스레드를 깨우십시오.

  1. 동기화의 기본 구현

동기화 된 동기화 블록의 구현은 monitorenter 및 monitorexit 명령을 사용합니다. 여기서 monitorenter 명령은 동기화 된 코드 블록의 시작을 가리키고 monitorexit 명령은 동기화 된 코드 블록의 끝을 나타냅니다.

동기화 된 수정 된 메서드는 monitorenter 명령과 monitorexit 명령이없는 대신 실제로 ACC_SYNCHRONIZED 플래그로 메서드가 동기화 된 메서드임을 나타냅니다.

동기화는 메서드 또는 코드 블록이 실행 중일 때 하나의 메서드 만 중요 섹션에 동시에 들어갈 수 있도록 보장하고 공유 변수의 메모리 가시성을 보장 할 수도 있습니다.

Java의 모든 객체는 동기화를 달성하기위한 동기화의 기반이되는 잠금으로 사용할 수 있습니다.

  • 일반 동기화 방법, 잠금은 현재 인스턴스 개체입니다.

  • 정적 동기화 방법, 잠금은 현재 클래스의 클래스 객체입니다.

  • 동기 메서드 블록, 잠금은 대괄호 내부의 개체입니다.

  1. 동기화와 휘발성의 차이점
  • Volatile은 기본적으로 jvm에게 레지스터 (작업 메모리)의 현재 변수 값이 불확실하고 주 메모리에서 읽어야 함을 알려줍니다.
    동기화는 현재 변수를 잠그는 것이며 현재 스레드 만 변수, 다른 스레드에 액세스 할 수 있습니다. 차단됩니다.

  • Volatile은 변수 수준에서만 사용할 수 있으며 동기화는 변수, 메서드 및 클래스 수준에서 사용할 수 있습니다.

  • Volatile은 변수 수정의 가시성 만 달성 할 수 있으며 원 자성을 보장 할 수 없습니다. 동기화는 변수 수정의 가시성과 원 자성을 보장 할 수 있습니다.

  • 휘발성은 스레드 블로킹을 일으키지 않으며 동기화는 스레드 블로킹을 유발할 수 있습니다.

  • volatile로 표시된 변수는 컴파일러에서 최적화되지 않습니다 .sync로 표시된 변수는 컴파일러에서 최적화 될 수 있습니다.

2 : Redis

1. Redis와 Memcached의 차이점

  • memcached의 모든 값은 단순한 문자열이며 redis는 문자열, 목록, 해시, 집합 및 zset과 같은 더 풍부한 데이터 유형을 지원합니다.

  • Redis는 Memcache보다 훨씬 빠릅니다.

  • redis는 데이터를 유지할 수 있습니다.

  • Memcached는 다중 스레드, 비 차단 IO 재사용 모델이며 Redis는 단일 스레드 다중 IO 재사용 모델을 사용합니다.

2. Redis 공통 데이터 유형 사용 시나리오

문자열 : 사용자 방문 횟수, 기사 좋아요 수

목록 : 메시지 대기열

해시 : 개체 데이터 저장소

설정 : 반복 할 수없는 데이터 저장 필요

3 : 스프링 프레임 워크

1. Spring의 IOC와 AOP

IoC (Inversion of Control)는 원래 프로그램에서 수동으로 생성 된 객체의 제어를 Spring 프레임 워크로 전달하여 관리 하는 디자인 아이디어 입니다 . IOC의의
컨테이너는 IOC의를 구현하기 위해 스프링이 사용하는 캐리어이다. IOC의 컨테이너가 실제로 인 지도 ,
어떤 상점 다양한 개체를. IoC
컨테이너는 공장과 같습니다 **, ** 객체를 생성해야 할 때 객체 생성 방법을 고려하지 않고 구성 파일 / 주석 만 구성하면됩니다.

AOP (Aspect 지향적 인 프로그래밍) 논리 또는 비즈니스 관련되지 않고있는 비즈니스 모듈 **에 의해 호출된다 (등 트랜잭션 처리, 로그 관리, 액세스 제어, 등) 책임을 캡슐화 할 수 을 줄일 편리 시스템 코드의 중복사이 결합의 정도 모듈을 줄이고 , 향후 확장 성 및 유지 보수를 용이하게 . **

Spring AOP는 동적 프록시를 기반으로합니다.

JDK
동적 프록시 클래스를 사용하는 단계

(1) 인터페이스와 그 구현 클래스를 정의합니다.

(2) InvocationHandler를 사용자 정의하고 invoke 메소드를 재정의합니다 .invoke 메소드에서 native 메소드 (프록시 클래스의 메소드)를 호출하고 일부 처리 로직을 사용자 정의합니다.

(3) Proxy.newProxyInstance (ClassLoader loader, Class <?> []
인터페이스, InvocationHandler h) 메서드를 통해 프록시 개체 만듭니다.

CGLIB
동적 프록시 클래스 사용 단계

(1) 클래스 정의;

(2) MethodInterceptor를 커스터마이즈하고 인터셉트 메서드를 재정의합니다. 인터셉트 메서드는
JDK 동적 프록시의 invoke 메서드와 유사한 프록시 클래스 메서드를 가로 채고 향상시키는 데 사용됩니다 .

(3) Enhancer 클래스의 create ()를 통해 프록시 클래스를 만듭니다.

2. 봄콩 실은 안전한가요?

일반적으로 안전하지 않습니다! 빈의 범위 속성은 빈이 싱글 톤인지, 각 컨테이너에 빈이 하나만 있는지, 프로토 타입이 각 요청에 대해 새로운 빈인지 여부를 구성 할 수 있습니다. 각 요청에 대해 새로운 빈이 반환되면 안전합니다. 그러나 정상적인 상황에서 대부분의 Bean은 싱글 톤 Bean입니다.

3. 봄 콩의 수명주기

[외부 링크 이미지 전송에 실패했습니다. 소스 사이트에 안티 리치 링크 메커니즘이있을 수 있습니다. 이미지를 저장하고 직접 업로드하는 것이 좋습니다. (img-QzBnlZYh-1614159017739) (media / 539a40a6c77eba95a23146dcd39fd28a.jpg)]

4. SpringMVC의 작동 원리

① 사용자가 서버에 요청을 보내고 요청은 Spring 프론트 엔드 제어 DispatcherServlet에 의해 캡처됩니다.

② DispatcherServlet은 요청 URL을 구문 분석하여 요청 된 리소스 식별자 (URI)를 얻습니다. 그런 다음 URI에 따라 HandlerMapping을 호출하여 Handler가 구성한 모든 관련 개체를 가져오고 마지막으로 HandlerExecutionChain 개체의 형태로 반환합니다.

③ DispatcherServlet은 획득 한 Handler에 따라 적절한 HandlerAdapter를 선택합니다.

④ Request에서 모델 데이터를 추출하고 Handler 입력 매개 변수를 입력 한 후 Handler (Controller) 실행을 시작합니다.

⑤ Handler가 실행 된 후 DispatcherServlet에 ModelAndView 객체를 반환합니다.

⑥ 반환 된 ModelAndView에 따라 적합한 ViewResolver를 선택하여 DispatcherServlet에 반환

⑦ ViewResolver는 Model과 View를 결합하여 뷰를 렌더링합니다.

⑧ 렌더링 결과를 클라이언트에 반환합니다.

5. springBoot의 핵심 주석 원리 (시작 원리)

SpringBoot는 프레임 워크를 제공하는 프레임 워크이며 서비스 범위는 구성 파일을 단순화하는 것입니다.

@SpringBootApplication은 @SpringBootConfiguration, @EnableAutoConfiguration 및 @ComponentScan의 세 가지 주석으로 구성됩니다.

(2) @SpringBootConfiguration : 내부 소스 코드는 IOC 컨테이너의 구성 클래스 인 @Configuration을 제공합니다.

(3) @EnableAutoConfiguration : 내부적으로 SpringFactoriesLoader를 사용하여 클래스 경로에서 모든 META-INF / spring.fatories 파일을 검색하고 Key [org.springframework.boot.autoconfigure.EnableAutoConfiguration]에 해당하는 Value 구성 항목을 해당 IoC 컨테이너에 인스턴스화합니다. @Configuration으로 표시된 JavaConfig 형식의 구성 클래스는 현재 사용되는 IoC 컨테이너에 요약됩니다.

(4) @CompenentScan : 필요하지 않습니다. 그 기능은 컴포넌트 나 빈 정의를 자동으로 스캔하고로드 한 다음 컨테이너에로드하는 것입니다.

6 、 SpringCloud

①. 서비스 검색 -Netflix Eureka, 원격 통화 서비스 : Feigin

Eureka 서버와 Eureka 클라이언트의 두 가지 구성 요소로 구성됩니다. Eureka 서버는 서비스 등록 서버로 사용됩니다. Eureka 클라이언트는 폴링로드 밸런서로서 서버와의 상호 작용을 단순화하고 서비스에 대한 장애 조치 지원을 제공하는 데 사용되는 Java 클라이언트입니다. .

② 고객 서비스 측 Netflix 리본에서 부하 분산

리본은 주로 클라이언트 측 소프트웨어 부하 분산 알고리즘을 제공합니다. 리본 클라이언트 구성 요소는 연결 시간 초과, 재시도, 재시도 알고리즘 등과 같은 일련의 완전한 구성 옵션을 제공합니다. 리본에는 플러그인 및 사용자 지정이 가능한 기본 제공로드 밸런싱 구성 요소가 있습니다.

③ 회로 차단기 -Netflix Hystrix

회로 차단기는 응용 프로그램이 작업을 여러 번 수행하려고 시도하는 것을 방지 할 수 있습니다. 즉, 오류가 발생할 가능성이 높기 때문에 오류가 복구 될 때까지 기다리거나
CPU
주기를 낭비하지 않고 계속할 수 있으며 오류가 영구적이라고 판단합니다. 회로 차단기 모드를 사용하면 애플리케이션에서 오류가 해결되었는지 여부도 감지 할 수 있습니다. 문제가 해결 된 것 같으면 응용 프로그램에서 작업 호출을 시도 할 수 있습니다.

④. 서비스 게이트웨이 ——Netflix Zuul

nginx, 역방향 프록시 기능과 유사하지만 netflix는 다른 구성 요소와 협력하기 위해 몇 가지 기능을 추가했습니다.

⑤. 분산 구성 -Spring Cloud Config

이것은 여전히 ​​정적이며 동적 구성 업데이트를 구현하기 위해 Spring Cloud Bus와 함께 사용해야합니다.

4 : mysql

  1. mysql 트랜잭션 및 격리 수준
  • READ-UNCOMMITTED (커밋되지 않은 읽기) : 더티 읽기, 팬텀 읽기 또는 반복 불가능한 읽기를 유발할 수있는 아직 커밋되지 않은 데이터 변경을 읽을 수 있는 가장 낮은 격리 수준 입니다.

  • READ-COMMITTED (커밋 된 읽기 읽기) : 더티 읽기를 방지 할 수 있는 동시 트랜잭션에 의해 커밋 된 데이터를 읽을 수 있지만 팬텀 읽기 또는 반복 불가능한 읽기는 계속 발생할 수 있습니다 .

  • REPEATABLE-READ (반복 읽기) : 데이터가 트랜잭션 자체에 의해 수정되지 않는 한 동일한 필드에 대한 다중 읽기의 결과는 일관 적입니다. 이는 더티 읽기 및 반복 불가능 읽기를 방지 할 수 있지만 팬텀 읽기는 계속 발생할 수 있습니다 .

  • SERIALIZABLE (직렬화 가능) : ACID 격리 수준을 완전히 준수 하는 최고 격리 수준입니다. 모든 트랜잭션이 하나씩 실행되므로 트랜잭션 간의 간섭 가능성이 없습니다. 즉, 이 수준은 더티 읽기, 반복 불가능 읽기 및 팬텀 읽기를 방지 할 수 있습니다.

  • 더티
    읽기 :
    트랜잭션이 데이터에 액세스하고 데이터를 수정하고이 수정이 데이터베이스에 아직 커밋되지 않은 경우 다른 트랜잭션도 데이터에 액세스 한 다음 데이터를 사용합니다. 이 데이터는 아직 커밋되지 않은 데이터이므로 다른 트랜잭션에서 읽은 데이터는 "더티 데이터"이며 "더티 데이터"를 기반으로하는 작업이 올바르지 않을 수 있습니다.

  • Unrepeatableread : 트랜잭션에서 동일한 데이터를 여러 번 읽는 것을 나타냅니다. 이 트랜잭션이 끝나기 전에 다른 트랜잭션도 데이터에 액세스합니다. 그러면 첫 번째 트랜잭션에서 읽은 두 데이터 사이에서 두 번째 트랜잭션의 수정으로 인해 첫 번째 트랜잭션에서 두 번 읽힌 데이터가 다를 수 있습니다. 이것은 트랜잭션에서 두 번 읽은 데이터가 다를 때 발생하므로 반복 불가능 읽기라고합니다.

  • 팬텀
    읽기 :
    팬텀 읽기는 반복 불가능한 읽기와 유사합니다. 트랜잭션 (T1)이 몇 행의 데이터를 읽은 다음 다른 동시 트랜잭션 (T2)이 일부 데이터를 삽입 할 때 발생합니다. 후속 쿼리에서 첫 번째 트랜잭션 (T1)은 마치 환상이 발생한 것처럼 원래 존재하지 않는 레코드가 더 많이 있음을 발견하므로이를 가상 읽기라고합니다.

  1. mysql 인덱스 구조

(1) .MyISAM 인덱스 구현

MyISAM 엔진은 B + Tree를 인덱스 구조로 사용합니다. 리프 노드의 데이터 필드는 데이터 레코드의 주소를 저장합니다. 지정된 Key가 있으면 데이터 필드의 주소 값을 꺼내 해당 데이터 레코드를 읽습니다. . MyISAM 엔진의 인덱스 파일과 데이터 파일이 분리되어 있습니다. 기본 인덱스와 보조 인덱스 (보조 키)의 구조에는 차이가 없지만 기본 인덱스는 키가 고유해야하며 보조 인덱스의 키를 반복 할 수 있습니다. MyISAM 인덱스 방법은 "비 클러스터형"인덱스라고도합니다.

(2) InnoDB 인덱스 구현

InnoDB는 또한 B + Tree를 인덱스 구조로 사용합니다.

차이 1 :

InnoDB의 데이터 파일 자체는 인덱스 파일이며 트리의 리프 노드 데이터 필드에는 완전한 데이터 레코드가 저장됩니다. 인덱스의 키는 데이터 테이블의 기본 키이고 기본 인덱스 테이블은 데이터 파일 자체입니다.

차이점 2 :

InnoDB의 보조 인덱스는 데이터 필드로 기본 키를 참조합니다. InnoDB 인덱스를 클러스터형 인덱스라고합니다.

3. MyISAM과 InnoDB의 차이점

(1) 행 수준 잠금 지원 여부 : MyISAM은 테이블 수준 잠금 만
지원 하는 반면 InnoDB 는 행 수준 잠금과 테이블 수준 잠금을 지원하며 기본값은 행 수준 잠금입니다.

(2). 트랜잭션 및 크래시 후 안전한 복구 지원 여부 :
MyISAM
은 성능을 강조하고 각 쿼리는 원자 적이며 실행 속도는 InnoDB 유형보다 빠르지 만 트랜잭션 지원은 제공하지 않습니다. 그러나 InnoDB 는 트랜잭션 지원, 외래 키 및 기타 고급 데이터베이스 기능을 제공합니다.
트랜잭션 (커밋), 롤백 (롤백) 및 충돌 복구
기능 (충돌 복구 기능)이있는 트랜잭션 안전 (ACID 준수) 유형 테이블

(3) 외래 키 지원 여부 : MyISAM은 지원하지 않지만 InnoDB는 지원합니다.

5 : 디자인 패턴

1. 싱글 톤 모드

배고픈 중국 스타일 :

 public class Singleton {
    
    

// 1、直接创建对象

public static Singleton instance = new Singleton();

///2、私有化构造函数

private Singleton() {
    
    

}

// 3、返回对象实例

public static Singleton getInstance() {
    
    

return instance;

}

게으른 스타일 :

 public class Singleton {
    
    

// 声明变量

private static volatile Singleton singleton = null;

// 私有构造函数

private Singleton() {
    
    

}

// 提供对外方法

public static Singleton getInstance() {
    
    

if (singleton == null) {
    
    

synchronized (Singleton.class) {
    
    

if (singleton == null) {
    
    

singleton = new Singleton();

}

}

}

return singleton;

}

2. 데코레이터

데코 레이팅 된 오브젝트와 데코 레이팅 된 오브젝트는 동일한 인터페이스를 구현하는 데 필요하며 데코 레이팅 된 오브젝트는 데코 레이팅 된 오브젝트의 인스턴스를 보유합니다.

public interface Sourceable {
    
    

public void method();

}

public class Source implements Sourceable {
    
    

\@Override

public void method() {
    
    

System.out.println("the original method!");

}

}

public class Decorator implements Sourceable {
    
    

private Sourceable source;

public Decorator(Sourceable source) {
    
    

super();

this.source = source;

}

\@Override

public void method() {
    
    

System.out.println("before decorator!");

source.method();

System.out.println("after decorator!");

}

}

public class DecoratorTest {
    
    

public static void main(String[] args) {
    
    

Sourceable source = new Source();

Sourceable obj = new Decorator(source);

obj.method();

}

}

추천

출처blog.csdn.net/hcyxsh/article/details/114030267