2020 봄 모집 자바 인터뷰 질문 요약 "이"

머리말

또 ~ 오와 같이이 문서에게 포인트를주고 기억, 작은 친구의 마지막 기사를 파티에 올 2020 봄 트릭 질문이 문제에 직면 공유하고, 지켜

단어를 말하지 않는다 그래서 우리에게 직접 건조를주고 ,,,

  1. 에서 처리 Java 예외

자바에서 모든 예외는 공통 조상 인 java.lang의 Throwable 클래스 패키지가 있습니다.

Throwable를 두 서브 클래스을 포함한다 :

예외 (비정상) :

자체 처리 할 수있는 비정상적인 프로그램. 예외 클래스의 RuntimeException의 중요한 서브 클래스가 있습니다. Java 가상 머신에 의해 throw의 RuntimeException. NullPointerException이 (당신이 어떤 객체를 참조하는 예외를 발생하지 않는 변수에 액세스 할 때), arithmeticexception이 (0으로 정수 나누기, 슬로우 산술 예외)과는 ArrayIndexOutOfBoundsException (첨자 범위 예외).

오류 (오류) :

오류가 응용 프로그램을 실행하는 심각한 문제를 표현, 처리 할 수 ​​없습니다. 대부분의 운영 및 코드 작가의 실행과 관련이없는 오류 및 문제의 코드는 JVM (자바 가상 머신)가 나타납니다 실행되고 있는지. JVM이 더 이상 작업을 계속 메모리 리소스를 필요하지 않을 경우 예를 들어, 자바 가상 머신 런타임 오류 (가상 MachineError)는, OutOfMemoryError가 나타납니다. 이러한 예외가 발생하면, 자바 가상 머신 (JVM)은 일반적으로 스레드를 종료하도록 선택합니다.

이러한 오류는 자신의 가상 머신에서 실패를 표시하거나, 클래스 정의 오류 (NoClassDefFoundError를) 등등에 자바 가상 머신 런타임 오류 (가상 MachineError)와 같은 응용 프로그램을 실행하려고 할 때 VM가 발생합니다. 이러한 오류들은 제어 및 응용 프로그램의 처리 능력 밖에 있기 때문에 확인하지 않습니다,하지만 대부분은 상황을 실행중인 프로그램에 사용할 수 없습니다. 응용 프로그램 디자인과 합리적인를 들어, 오류가 발생할 경우에도, 본질적으로, 우리는 그것에 의해 발생하는 비정상적인 상황에 대처하려고해서는 안된다. 자바에서 오류가 오류의 서브 클래스 설명했다.

참고 : 예외와 오류의 차이는 : 프로그램 자체가 예외 처리 할 수 ​​있습니다, 오류 처리가되지 않습니다.

일반적인 방법 클래스의 Throwable

공공 문자열의 getMessage은 () : 이상이 발생 간단한 설명을 반환

공공 문자열 toString () : 반환 이상이 발생 자세한 정보

공공 문자열로 getLocalizedMessage은 () : 예외 객체 현지화 정보를 반환합니다. 의 Throwable의 사용 서브 클래스는 지역화 된 정보를 생성하기 위해이 메소드를 오버라이드 (override). 자식 클래스는이 메소드를 오버라이드 (override)하지 않는 경우, 동일한 결과 정보가 메소드의 getMessage ()에 의해 반환 반환

공공 무효의 printStackTrace은 () : 인쇄 개체는 콘솔에서의 Throwable 예외 정보를 캡슐화

예외 처리 요약

블록을 시도 : 예외를 캡처. 이후에는 catch 블록이없는 경우, 최종적으로 블록 와야합니다, 0 개 이상의 catch 블록합니다.

catch 블록 : 프로세스가 예외를 포착하려고합니다.

finally 블록 : 캡처 또는 핸들 예외 여부, finally 블록은 성명에서 실행됩니다. try 블록 또는 catch 블록에서 return 문을 발생하는 경우, 마지막으로 문 블록은 메소드가 복귀하기 전에 실행됩니다.

예를 들면 :

반환 값이 try 블록 마지막 문장의 반환 값을 포함하기 때문에 호출 F (6), 반환 값은 0이됩니다.

다음과 같은 네 가지 특별한 경우, finally 블록은 실행되지 않습니다 :

이상이 마지막 블록의 첫 번째 행에 발생. 다른 행의 마지막 블록은 아직 구현 될 것이기 때문에

을 System.exit (int)를 사용하여 이전 코드에서는 프로그램에서 철수했다. 기능은 매개 변수 출구이며, 예외 문 다음 문장, 마지막으로 실행하는 경우

스레드 프로그램의 경우 죽음.

닫기 CPU.

  1. IO는 자바 스트림

션트의 흐름에 따라, 그 입력 및 출력 스트림으로 분할 될 수있다;

조작부에 의한 분할, 그것은 바이트 스트림과 문자 스트림으로 분할 될 수있다;

스트림 노드로 분할하고, 처리의 역할은 흐름에 따라 흐른다.

자바 이오 매우 지저분한 보이는 40 개 이상의 클래스의 전체를 포함하는 흐름 있지만, 사실은 규칙이 있고, 자바 I0 흐름은 다음 네 가지 추상 클래스에서 각각 다른 40 개 이상의 클래스와 매우 긴밀한 접촉이있다 베이스 클래스로부터 파생.

의 InputStream / 리더 : 모든 입력 스트림에 대한 기본 클래스, 전자는 문자 입력 스트림 바이트의 입력 스트림입니다.

OutputStream에 / 라이터 모든 출력 스트림에 대한 기본 클래스는 이전 출력 문자 스트림 출력 바이트 스트림이다.

도 동작 모드 구조의 분류 :

도 동작 모드 구조의 분류 :

문제 :

파일 판독 및 기록과 네트워크 전송 및 수신에서, 정보의 최소 단위는 바이트에 저장되는 이유는 I / O 동작들을 바이트 스트림에 유입 및 문자 스트림은 작동 하는가?

답변 :

우리는 왜곡 현상이 발생하기 쉬운 바이트 스트림 인코딩 타입으로 그것을 모르는 경우 자바 가상 머신의 문자 스트림은 바이트로 변환되고,이 과정에서 문제 거짓말은 매우 많은 시간이 소요될 수합니다. 따라서, 나는 / O 스트림 인터페이스가 직접 캐릭터에 우리가 일반적으로 편리하게 작동 할 수있는 문자를 운영합니다. 바이트 스트림 오디오 파일, 이미지 및 기타 미디어 파일이 더 나은 경우가 문자로 오면, 더 좋은 문자의 스트림을 사용합니다.

BIO, NIO, AIO 무슨 차이점은 무엇입니까?

BIO (I / O 차단) 동기 블로킹 I / O 모드, 판독 데이터는 스레드 내에 완성 대기 차단에 기록된다. 활성 연결의 경우 특히 높지 않다 (독립 실행 형 1000보다 작),이 모델은 꽤 좋은, 각각 자신의 연결된 I에 집중할 수 있도록 / O 및 간단한 프로그래밍 모델은,이 시스템을 과부하 많은 생각을하지 않습니다, 이러한 제한과 같은 문제. 스레드 풀 자체가 일부 시스템 버퍼 또는 연결 요청을 처리 할 수없는, 자연 깔때기이다. 수천의 얼굴에 연결하거나 그러나, 백만, BIO 전통적인 모델은 힘이다. 따라서, 우리는 더 높은 동시성에 대처하기 위해보다 효율적인 I / O 처리 모델이 필요합니다.

NIO (새 I / O는) : NIO는 채널, 선택기, 버퍼가 다른 추상적 제공되는 java.nio 패키지를 해당 자바 1.4 NIO 프레임에 통합 된 동기 비 블록 I / O 모델이다. NIO N은 비 차단, 단순히 새로운으로 이해 될 수있다. 또한, 완충액을 지향 채널 기반 I / O 동작 방법을 지원한다. NIO는 두 채널 차단 지원 및 비 차단 모드를 달성하기 위해 SocketChannel에와 ServerSocketChannel을 두 개의 서로 다른 소켓 채널을 해당 전통적인 BIO 모델 소켓과 ServerSocket의를 제공합니다. 지원처럼, 단지 전통을 사용하여 모드를 차단하면 비교적 간단하지만, 성능과 안정성이 좋지 않다, 그냥 반대 비 블록 모드. 저 부하의 경우, 낮은 동시 응용 프로그램은, 동기 블로킹 I / O 속도를 사용할 수 있으며 더 나은 유지 보수의 개발을 강화하기 위해, 높은 부하, 높은 동시성 (네트워크) 응용 프로그램, NIO을 개발하기 위해 비 블록 모드의 사용을

AIO (비동기 I / O) AIO 즉 NIO 2. 자바 7 NIO 2 NIO의 개선 된 버전을 도입, 그것은 비동기 비 차단 IO 모델입니다. 동작 프로그램을 직접 리턴한다 후에 비동기 IO가되는 이벤트 및 달성 콜백 메카니즘을 기반으로, 백그라운드 처리가 완료 될 때, 운영체제가 후속 작업에 적절한 스레드가 알려드립니다 플러그 않는다. AIO는 NIO 비록 네트워크 동작에서 비동기 IO 약자 인 비 차단 방법을 제공하지만, IO NIO 동기식 동작. NIO, 우리의 사업 알림을 준비 IO 작업이며, 그들은이 IO 스레드 자체에 의해 운영 된 스레드의 경우, IO 작업 자체가 동기화됩니다. 관련 정보에 액세스 온라인, 내가 본 응용 프로그램에 대한 AIO는 매우 광범위한 아니라는 것을 발견, 또한 AIO가의 Netty 전의 사용하려고하지만 포기했다.

  1. 공통 키워드 요약 : 정적, 마지막이, 슈퍼

마지막 키워드

변수, 메소드 및 클래스 : 마지막 키워드는 주로 세 곳에서 사용된다.

도 1은 최종 변수 변수의 기본 데이터 타입의 경우, 그 값은 초기화 후에 후 변경 될 수 없다는 초기화가 다른 객체의 포인트를 허용하지 않는 한 다음 이후 참조 형 변수 인 경우.

2, 최종적으로 클래스 수정이 클래스가 상속 할 수없는 것을 나타내는 경우. 최종 클래스 메소드의 모든 구성원은 암시 적으로 마지막 수단으로 지정됩니다.

3, 마지막 방법을 사용하여 두 가지 이유가 있습니다. 첫 번째 이유는 그 의미를 수정하는 어떤 파생 된 클래스 않도록 고정하는 방법이며, 두 번째 원인은 효율이다. 자바 구현의 이전 버전에서는, 최종 메소드 호출에 내장됩니다. 방법이 너무 큰 경우, 당신은 (마지막을 최적화하기 위해 이러한 방법을 사용할 필요가 없습니다 자바의 현재 버전)을 가지고 어떤 성능 임베디드 통화 표시되지 않을 수 있습니다. 모든 개인 클래스 메소드는 암시 마지막으로 지정.

정적 키워드

네 가지 주요 정적 키워드 사용 시나리오가 있습니다 :

멤버 변수와 멤버 메소드 수정 : 수정 된 정적 멤버는 클래스, 객체의 하나의 클래스의 일부 클래스의 모든 객체가 공유하는 속하고 클래스 이름의 호출에 의해 추천 할 수있다. 정적 멤버 변수가 고정 부재 변수 선언 자바 메소드 영역의 메모리 영역에 저장된 정적 변수. 통화 형식 : 클래스의 정적 변수 이름 클래스 이름 정적 메소드 이름의 이름 ().

정적 블록 코드 : 비 정적 블록 전 (> 생성자 - -> 비 정적 블록 코드의 정적 블록) 코드의 정적 블록은 외부 클래스 메소드 코드 블록의 정적으로 정의된다. 아무리 클래스가 생성됩니다 얼마나 많은 개체를, 정적 코드 블록은 한 번만 실행되지 않습니다.

정적 내부 클래스 (그런 종류의 정적 변형 만 클래스 내에 수정 될 수있다) : 비 정적 내부 클래스와 최대 정적 내부 클래스 사이의 차이가있다 : 번역 종료 후의 비 정적 내부 클래스 것 내재적 기준이 보유 포인트는 둘러싸는 클래스를 만들 수 있지만, 정적 내부 클래스하지 않습니다. 것을이 참조없이 수단 : 그것은 의존의 작성을 필요로하지 않습니다 1. 클래스를 둘러싸 만들었습니다. 2. 이는 비 정적 멤버 변수 및 클로징 클래스의 방법을 사용할 수 없다.

(1.5 이후 수입 클래스의 정적 자원, 새로운 기능에 사용) 정적 가이드 패키지 : 매 2 개 키워드 번 수입 정적 가져 오기가 정적 자원 클래스를 지정 지정할 수 있으며 클래스 이름 통화의 사용을 요구하지 않습니다 형식은 정적 반원 클래스는 직접 고정 부재 변수 부재와 방법을 사용할 수있다.

이 키워드

이 키워드는 클래스의 현재 인스턴스를 참조하는 데 사용됩니다.

위의 예에서,이 키워드는 두 곳에서 사용된다 :

this.employees.length : 액세스 변수를 클래스 관리자의 현재 인스턴스에.

this.report () : 클래스 관리자의 현재 인스턴스에 메서드 호출.

이 키워드를 사용하는 수단과, 선택적임을 경우에이 키워드를 사용하지 않고 상술 한 실시 예에서와 동일한 성능. 그러나, 코드를 읽기 또는 이해 할 수도 키워드를 사용.

슈퍼 키워드

부모 클래스는 서브 클래스에서 슈퍼 키워드는 액세스 변수와 메소드에 사용됩니다.

상위 클래스의 멤버 변수 참조 액세스 상위 클래스의 슈퍼 showNumber () 메소드를 호출하는 서브 클래스 위의 예에서.

이 슈퍼 문제 및 노트에 사용 :

생성자에서 슈퍼를 사용하는 경우 () 부모 클래스의 다른 생성자를 호출, 문 그렇지 않으면 컴파일러는 불평 할 것이다, 생성자의 첫 번째 줄 수 있어야합니다. 또한,이뿐만 아니라 첫 번째 줄에,이 클래스의 다른 생성자를 호출합니다.

이것은, 슈퍼 정적 방법에 사용될 수 없음.

간단한 설명 :

클래스에 속하는 수정 정적 멤버는 객체의 하나의 클래스의 일부가 아닌 모든 클래스가 공유 객체입니다. 부모 오브젝트를 차례로 슈퍼 대표 상위 클래스 오브젝트 참조; 및 객체의 클래스에 대한 언급이 대표는 본 클래스 객체 지향 따라서이 대상 영역에 속하는 수퍼 일이 정적 메소드는 클래스 분류에 속하는 무엇 .

  1. 서블릿 요약

자바 웹의 doGet (에 따라 처리 사용자 요청 HttpServletRequest의를 수신 서블릿 주로 담당 프로그램)의 doPost () 및 사용자 피드백에 HttpServletResponse를 응답합니다. 서블릿 초기화 파라미터는 내부 서블릿 위해 제공 될 수있다. 서블릿 클래스가 초기화 될 때 파괴 할 때 ** 소멸 () 메서드를 호출, 초기화 () 메서드를 호출, 하나의 인스턴스 만 할 것이다. ** 구성하려면 서블릿 필요가 web.xml에 (서블릿 자동은 MyEclipse를 구성 생성), 서블릿은 여러 URL 액세스를 설정할 수 있습니다. 서블릿 때문에, 스레드 안전 클래스 변수를 사용하여 조심하지 않습니다.

서블릿 인터페이스는 다섯 개 가지 방법 서블릿주기와 관련된 상기 제 세 가지 방법을 정의한다 :

수명주기 :

웹 서블릿 컨테이너로드 및 인스턴스화, 서블릿의 라이프 사이클이 시작 후에는 서블릿 컨테이너가 초기화 () 메소드를 실행 초기화, 서비스 () 메소드, 서비스 () 메서드 호출 요청이 필요할 때 서블릿 호출 요청이 도착 또는이의 doGet doPost 메소드에 대응처럼, 폐쇄 서버 나 서버가 서블릿 예를 파괴 항목을 언로드 될 때, 서블릿을 파괴 () 메서드를 호출합니다.

초기화 방법 번만 방법을 파괴, 서비스 방법 서블릿마다 클라이언트 요청을 실행됩니다. 당신이 파괴 방법으로, 코드 자원의 파괴를 자원을 초기화 init 메소드에 코드를 삽입 할 수 있도록 서블릿은 때때로 당신이 초기화 할 각 클라이언트의 요청을 처리 할 필요가 없습니다 그래서, 초기화 및 자원의 파괴를 필요로 사용된다 자원의 파괴.

취득 및 사후 요청의 차이 :

수와 두 개의 서로 다른 행동으로 게시, 그리고 둘 사이에 본질적인 차이가 없다, 그것은 기본 TCP 연결입니다. 서버 자원을 얻기위한 요청을 받고, 포스트는 서버로 데이터를 전송하는 데 사용됩니다. 사람들이 요청의 예를 들어, 목록을 얻을 수 있습니다, 당신은 사람을 게시 할 수 만들어야합니다. 이것은 또한 기본적인 요구 사항 평안한 API입니다.

(앞으로) 및 리디렉션 (리디렉션)의 차이 사이의 전달 :

서버 동작을 전달, 클라이언트 동작을 리디렉션합니다.

RequestDispatcher의 전진에 의해 전달 (정) 타겟 (HttpServletRequest 요청, HttpServletResponse 응답) 구현 방법. RequestDispatcher의 () 메소드 getRequestDispatcher HttpServletRequest의 구한다. 예를 들어, 다음 코드는 login_success.jsp 페이지로 이동하는 것입니다.

리디렉션 (리디렉션) 서버에 의해 반환 된 상태 코드를 사용하여 달성된다. 클라이언트 브라우저가 서버에 요청하면, 서버는 상태 코드를 반환합니다. HttpServletResponse를 대해 setStatus (INT 상태) 방법에 의해 제공 서버 상태 코드. 서버가 301 또는 302을 반환하는 경우, 브라우저는 새로운 URL 재 요청 리소스로 이동합니다.

1 주소창에서 그것을 보여주는

직접 URL을 통해 읽을 수있는 대상 주소, 응답 콘텐츠에 액세스 한 다음에 앞으로 서버 자원 요청, 서버 URL 인 콘텐츠를 브라우저에 다시 배포했습니다. 브라우저가에서 온 서버로 콘텐츠를 보냈습니다 알고하지 않기 때문에 의 주소 표시 줄이나 원래 주소. 리디렉션 서버는 논리에 기반, 주소 표시 줄 쇼 있도록 새로운 URL을 다시 요청 주소로 브라우저를 알려주는 상태 코드를 보냅니다.

2, 데이터 공유는

앞으로 : 전달 페이지와 페이지는 데이터가 재 :. 당신은 데이터를 공유 할 수 없습니다 공유 요청에 전달 될 수있다.

3 지역의 사용

앞으로 : 해당 모듈 리디렉션 전송 된 역할에 따라 일반 사용자 로그인, 시간 :. 일반적으로 등, 착륙 오프 할 때 사용자가 로그인을 메인 페이지를 반환하고 다른 사이트로 이동하는 데 사용

효율에서 말하는 4

앞으로 : 높은 리디렉션 :. 저.

자동 새로 고침 (새로 고침)

자동으로 일정 시간 후에 다른 페이지로 이동할 수 있습니다 자동 새로 고침뿐만 아니라, 또한 자동 잠시 후이 페이지를 새로 고칠 수 있습니다. 서블릿 HttpServletResponse를에 의해 제공되는 헤더 속성은 자동 새로 고침 예를 객체 :

JSP와 서블릿 무슨 관계입니다

서블릿은 JVM 서버에서 실행이 서버가 콘텐츠를 표시하는 브라우저에 제공하는 지원에 의지 할 수있는 특별한 자바 프로그램입니다. JSP로 본질적 서블릿의 간략화 된 형태이며, JSP 자바 서블릿 프로그램을 수신 서버 유사 페이지 콘텐츠의 생성을 간소화 할 수있다. 애플리케이션 로직은 자바 서블릿 파일이며, 완전히 표현 계층 HTML에서 분리 된 것을 서블릿과 JSP는 큰 차이점. 상황 JSP는 자바와 HTML이 .jsp로 파일 확장자에 결합 될 수있다. 어떤 사람들은 서블릿은 자바, HTML로 작성된, 말과 JSP 자바 코드는 물론,이 주장은 매우 일방적하고 부정확, HTML로 작성된 것입니다. JSP보기에 집중 서블릿 더 제어기 (제어부)로서의위한 JSP 뷰 (뷰) 및 서블릿 활동할 적합한 MVC 아키텍처 모델에서의 제어 로직에 초점을 맞추었다.

  1. JSP 요약

JSP는 클래스 서블릿이지만, HttpServlet을 작품은 동일하지 않습니다. 첫 번째 배포 후 컴파일로 HttpServlet을 한 후, 다음에 배포 할 클래스 파일 서버의 소스 코드를 컴파일하여 처음이다. JSP는 배포 전에 컴파일됩니다. JSP는 JSP 파일에 대한 첫 번째 요청은 클라이언트 HttpJspPage 클래스 (서블릿 인터페이스의 서브 클래스)로 컴파일 할 때. 이 클래스는 일시적으로 서버 서버 작업 디렉토리에 저장됩니다.

JSP 내장 객체 :

JSP는 구가 내장 된 객체있다 :

요청 : 클라이언트의 요청 패키지는 GET 또는 POST 요청의 매개 변수를 포함;

응답 : 클라이언트에 응답 패키지 엔드 서버;

pageContext와 기타 객체는 객체가 획득 될 수있다;

세션 : 사용자 세션 객체의 캡슐화;

응용 프로그램 : 객체는 서버 운영 환경을 캡슐화;

아웃 : 서버 응답 출력 대상 스트림 출력;

구성은 : 구성은 웹 응용 프로그램을 객체;

페이지 : (이 자바 프로그램에 해당) JSP 페이지 자체;

예외 : 패키지 페이지 던질 수있는 예외입니다.

요청 개체의 주요하는 방법

의 setAttribute (문자열 이름, 개체) : 요청 매개 변수 값의 이름에 대한 이름을 설정

대해 getAttribute (문자열 이름) : 속성 이름에 의해 지정된 값을 반환

대해 getAttributeNames () : 반환 요청 객체의 모든 속성의 이름의 모음입니다, 결과는 인스턴스의 열거입니다

대해 getCookies는 () : 쿠키가 클라이언트에 모든 객체를 반환 결과는 쿠키의 배열

반환 몸의 요청 길이로 getCharacterEncoding () : 반환 문자 인코딩 요청 = 대해 getContentLength ()

대해 getHeader (문자열 이름) : 파일 헤더 정보 HTTP 프로토콜 정의를 얻을

대해 getHeaders (문자열 이름) : 요청 헤더의 모든 값의 이름을 돌려, 결과는 인스턴스의 열거입니다

getHeaderNames는 () : 요청 헤더 그래서 이름을 돌려, 결과는 인스턴스의 열거입니다

는 getInputStream는 () 데이터 요청을 획득하기위한 입력 스트림 요청을 반환

getMethod 메소드 () : 서버에 전송 데이터를 클라이언트 방법을 얻을

의 getParameter (문자열 이름) : 클라이언트를 얻을 매개 변수 값에 의해 지정된 서버 이름에 전달된다

대해 getParameterNames () : 서버 측 클라이언트의 모든 파라미터의 이름을 취득로서는, 결과의리스트는

대해 getParameterValues ​​(문자열 이름) : 모든 값은 이름 인수로 지정받을

서버에 전송 데이터에 대한 클라이언트 프로토콜의 이름을 기반으로 가져옵니다 :주는 getProtocol ()

() 대해 getQueryString하기 : 쿼리 문자열을 얻을

대해 getRequestURI는 () : 요청하는 클라이언트의 주소 문자열을 가져옵니다

getRemoteAddr () : 클라이언트의 IP 주소를 얻을 수

getRemoteHost () : 클라이언트의 이름을 얻을

대해 getSession은 ([부울을 만들]) 세션 요청과 연관된 돌려

getServerName는 () : 서버 이름을 가져옵니다

대해 getServletPath는 () : 클라이언트가 요청한 스크립트 파일의 경로를 가져옵니다

대해 getServerPort는 () : 서버 포트 번호를 가져옵니다

속성 요청 삭제 : removeAttribute (문자열 이름)

네 개의 범위에서 JSP

JSP 네 범위는 특히 페이지, 요청, 세션 및 응용 프로그램을 포함한다 :

개체와 특성의 페이지와 관련 페이지의 대표.

클라이언트에 의해 발행 된 웹 요청과 관련 개체와 속성을 대신 요청. 이 범위는 필요한 임시 데이터를 배치 할 수있다 페이지를 표시, 요청은 웹 컴포넌트의 복수, 복수 페이지에 걸쳐있다.

서버 관련 개체와 속성을 가진 세션 설립 사용자 세션 대신에. 사용자 데이터와 연관는 사용자 자신의 세션에 배치해야합니다.

전체 웹 응용 프로그램 관련 개체와 특성을 대신하여 응용 프로그램, 그것은 여러 페이지 요청 및 글로벌 세션 범위를 포함한 전체 웹 응용 프로그램을 통해 본질적으로.

목록, 설정, 세 가지의지도의 차이에 대해 6 토크?

목록 (좋은 도우미를 처리하기 위해) : 목록 저장 인터페이스의 집합 (여러 요소가 같은 객체를 참조있을 수 있습니다) 고유하지 않은 개체를 주문

세트 (독특한 자연에주의) : 마 중복 수집을 허용하지. 더 이상 요소가 같은 객체를 참조있을 것입니다.

(검색 할 키와 전문가)지도 : 사용을 저장 키 - 값 쌍으로. 지도는 유지하고 키 값을 관련. 키 두 사람은 같은 객체를 참조 할 수 있지만, 일반적으로 유형 문자열 키의 키를 반복 할 수는 없지만 어떤 객체가 될 수 있습니다.

7.Arraylist와 LinkedList의 차이점은 무엇입니까?

  1. 여부 보증 스레드 안전 : ArrayList를하고 LinkedList의가 동기화되지 않습니다, 스레드 안전을 보장 할 수 없습니다;

  2. 데이터 기본 구조 : ArrayList를 바닥 배열 동적 배열을 사용하여, 링크리스트 데이터 구조를 연결 근본적인 LinkedList의 사용 (JDK1.6 원형 연결리스트 전에 JDK1.7 취소 및 원형 이중 연결리스트 양방향 주목 구별 원형 연결리스트로한다.)

3. 효율성 다른 :

랜덤 액세스 목록 (get 및 set 작업), LinkedList의 때문에 데이터 저장 선형의 ArrayList LinkedList의보다 더 효율적으로 할 때, 다시 주문 조회에 정면에서 포인터를 이동하는 것이 필요하다.

때 작업 ArrayList를 배열이기 때문에 시간이 삭제 작업, 다음 동작 점 의지 지수 인덱스 원인에있는 모든 데이터를 추가하거나, 그래서는 LinkedList의 ArrayList를보다 더 효율적 (추가 및 제거 작업)을 추가 및 삭제 데이터, 충격, 모바일 데이터에 대한 필요성.

  1. 지원 빠른 랜덤 액세스 : LinkedList의이 ArrayList를 효율적 임의 요소 액세스 및 지원을 지원하지 않습니다. 대물 요소 (가져 오기 (INT 인덱스) 방법에 대응) 요소 번호가 빠른 랜덤 액세스를 통해 빠른 액세스이다.

  2. 메모리 풋 프린트 : ArrayList를 주로 목록의 끝에 목록에 반영됩니다 낭비 공간이 어떤 공간 용량, 비용과 공간 LinkedList의 예약 것이다는의 각 요소에 반영됩니다 당신이 가게에 원하기 때문에 (ArrayList에보다 더 많은 공간을 소비 할 필요가 직접적이고 즉각적인 후속 및 이전 데이터).

  3. 벡터와 ArrayList에 그것을 왜 ArrayList의 차이는 벡터를 대체?

Vector 클래스의 모든 메소드가 동기화됩니다. 벡터 객체는 동기 운전에 많은 시간을 보내고 벡터의 코드 워드에 액세스 할 수 안전하게 두 개의 스레드하지만, 하나 개의 스레드에 액세스 할 수 있습니다.

동기화되지 ArrayList를, 그것은 스레드의 ArrayList의 안전한 사용을 보장하기 위해 필요하지 않을 때하는 것이 좋습니다.

  1. 그것은 ArrayList를 확장 메커니즘에 대해 이야기

a.ArrayList 건물 기능 :

당신은 인수가없는 생성자와의 ArrayList를 만들 때 **, 할당은 실제로 초기화 빈 배열입니다. 때 정말로 요소가 작동 배열에 정말 할당 된 용량을 추가 할 수 있습니다. 즉 첫 번째 배열 요소 어레이 (10)의 용량의 확장을 추가 할 때 ** (10 이유를 설명한다)

B. 팽창기구

다음은 인수가없는 생성자는 ArrayList를 사례 연구를 만들 수 없습니다

  1. 추가 방법에서 첫보기

  2. ensureCapacityInternal에서 살펴 보자 () 메소드

우리는 추가 메소드는 우선 ensureCapacityInternal를 호출하여 볼 수 있습니다 (크기 + 1)

첫 번째 요소로 추가 할 때, minCapacity가 10 일, 비교 Math.max () 메소드에 minCapacity가 하나가 될 수 있습니다.

3. ensureExplicitCapacity() 方法

우리는 제 1 흡기의 ArrayList에 요소를 추가하면 elementData.length 0 (또는 목록이 비어 있기 때문에) 때문에,이 경우 10 ensureCapacityInternal () 메소드의 실행 minCapacity가되도록한다. 이 시점에서, minCapacity가 - elementData.length> 0 성장 (minCapacity가) 메소드를 입력합니다 따라서 보유합니다.

두 번째 추가 구성 요소가있다 minCapacity가 2 일 때, 그 다음에 제 1 팽창 소자 (10)를 추가 한 후 lementData.length (용량) 전자. 이 시점에서, minCapacity가 - elementData.length> 0 보유하지 않습니다, 그것은 (실행) 성장 (minCapacity가) 메소드를 입력하지 않습니다.

3,4- ··· 10 번째 요소로, 상기 방법은 아직 실행되지 않고 성장한다을 추가 할 때, 어레이 (10)의 용량이다.

제 11 개 요소를 추가 할 때까지 minCapacity가 (11) elementData.length (10)보다 크다. 확장의 방법으로 성장한다.

  1. 성장 () 메소드

INT newCapacity oldCapacity = + (oldCapacity >> 1), 각각의 확장 이후의 ArrayList 용량의 1.5 배 일본어 될 것이다! (JDK1.6 이후 버전) JDK1.6 버전 1.5 배 +1의 팽창 후의 용량이다!

제 결정을 비교 한 후, newCapacity = minCapacity가 (10) 긍정이면 첫 번째 추가 요소는 oldCapacity 0 인 경우. 그러나 판사는 newCapacity MAX_ARRAY_SIZE보다 더 큰, 그것은 hugeCapacity 방법을 입력하지 않습니다, 두 번째를 설정하지 않는 경우. 어레이 용량 (10)는, 추가의 방법은 크기가 1 증가, true를 돌려줍니다.

첫 번째 추가 성장한다 방법으로 소자 (11), (15) newCapacity, 비 minCapacity가 될 때 상기 제 판정이 충족되지 않으면 (11), 크다. 새로운 용량 hugeCapacity 수단을 입력하지 않을 어레이의 최대 크기보다 크다. 어레이 (15)의 용량을 확장 추가 방법은 진정한 크기가 11로 상승 복귀.

그래서 ??????

5. hugeCapacity () 메소드.

위 성장한다 () 메소드의 소스 코드에서 우리는 알고 : 새로운 용량이 MAX_ARRAY_SIZE보다 큰 경우 (실행)을 입력 hugeCapacity () 최대 용량보다 minCapacity가의 큰이, 새로운 용량에 Integer.MAX_VALUE 있다면 방법은 그렇지 minCapacity가와 MAX_ARRAY_SIZE을 비교하기 위해, 새로운 용량의 크기를 8 - 그것은 MAX_ARRAY_SIZE가에 Integer.MAX_VALUE입니다했다.

그리고 Hashtable의 차이 10.HashMap

스레드가 그 것이다 안전 : HashMap의가 안전을 스레드되지 않으며, 해시는 스레드 안전, 내부 해시 기본적인 방법은 동기화 된 수정. (당신이 스레드 안전을 보장하기 위해 싶은 경우에, ConcurrentHashMap의 사용!)

효율성 : 스레드 안전 문제 때문에, 조금 높은 효율보다는 HashMap의 해시. 또한, 해시 테이블은 기본적으로 제거되고, 이것은 코드가 사용되지 않는다;

널 키를 지원하고 NULL 값 :의 해시 MAP 널 키로서, 하나 개의 열쇠는 널 (null) 값에 대응하는 하나 이상의 키가있을 수있다. . 그러나 한 널, 직접 던져 NullPointerException이 존재하는 한 키에 해시 테이블을 넣어.

초기 용량 각각 증설 크기가 서로 다른 크기 : ① 용량이 지정되지 않으면, 초기 값 생성, 해시 테이블 디폴트 초기 크기는 각각의 팽창 후에, 원래의 용량은 2N + 1이되고, (11)이다. HashMap의 기본 초기화 크기는 16입니다. 각각의 전개 후, 용량은 2 회 일본어된다. 초기 값의 용량을 주어진 경우에 당신이 만들 때 ②, 해시 테이블은 주어진 크기를 사용하도록 지시 할 것이며, HashMap에 그 크기가 아래로 주어진다 () 메소드를 보장 소스 2 (tableSizeFor의 HashMap의 힘 확장됩니다 코드). HashMap에 항상 해시 테이블의 크기가 2의 거듭 제곱을 사용하는 것이, 그것은는 2의 거듭 제곱 이유는 나중에 소개합니다.

데이터 구조를 기본 : 체인 길이가 임계 값 (기본값은 8)보다 큰 경우 HashMap의 검색 시간을 단축하기 위해 레드 - 블랙 트리 목록으로, 해결 해시 충돌에 큰 변화를했다 JDK1.8 후. 해시 테이블은 그러한 메커니즘입니다.

11.HashMap 및 HashSet의 차이점

당신은 HashSet의 소스를 본 적이 있다면, 당신은 알고 있어야합니다 : HashSet의는 부하의 HashMap 구현을 기반으로합니다. (HashSet의 소스 매우 작은 클론 때문에 (뿐만 아니라)의 writeObject ()의 readObject ()는 외부 스스로 구현 HashSet에 구비하고, 다른 방법은 직접 호출 HashMap의 메소드이다.

중복 HashSet에 확인하는 방법

당신이 가입하면은 HashSet의가, HashSet의 첫 번째 일치하는 해시 코드가없는 경우 개체가 HashSet의 반복되지 않는 가정, 기타 부가가치의 해시 코드 객체와 비교도 추가되지만, 객체의 위치를 ​​결정하는 목표 값의 해시 코드를 계산 객체 이 나타납니다. 객체가 동일한 해시 값 FOUND이있는 경우 그러나, 우리는 개체 정말 동일한 해시 동일 여부를 확인하기 위해 등호 () 메소드를 호출 할 것이다. 그들이 동일한 경우, HashSet의 성공적인 운영에 참여하지 않습니다. (발췌 내 책 자바에서 "헤드 주먹 자바"두 번째 버전 깨달음)

그리고 Hashtable의 차이 12.ConcurrentHashMap

ConcurrentHashMap의 해시 테이블과의 차이는 주로 스레드 안전성을 달성하기 위해 다양한 방식으로 반사된다.

내부 데이터 구조 : JDK1.7 +를 사용 ConcurrentHashMap의 하단 세그먼트의 배열은리스트의 구현, 구성, 연결리스트 어레이 + / 레드 블랙 이진 트리처럼 JDK1.8 HashMap1.8에서 사용되는 데이터 구조를 연결. 해시 테이블의 HashMap 데이터 기본 구조 및 배열을 사용하여 이전 JDK1.8 + 연결 목록과 유사한, 어레이는 자기의 HashMap는 주쇄 해시 충돌이 존재 해결이다;

스레드 안전 (중요) 달성하는 방법 : ① 전체 버킷 배열의 JDK1.7, ConcurrentHashMap의 (부 잠금)이 분할 된 세그먼트들 (세그먼트)는 각각의 잠금은 컨테이너를 잠금하는 데이터의 일부, 멀티 - 스레드 액세스에 다른 세그먼트에서 컨테이너 데이터는이 경합을 잠금 및 동시성 비율을 개선하지 않을 것입니다. JDK1.8 시간 세그먼트의 개념을 포기했다,하지만 직접 연결리스트 데이터 구조 노드 배열 + + 레드 - 블랙 트리 동시성 제어를 구현하고 CAS가 작동하여 동기화. 만에, 당신은 여전히 ​​JDK1.8에서 데이터 구조 세그먼트를 볼 수 있지만, 최적화 된 스레드 안전의 HashMap 같은 전체 모양 (나중에 동기화 잠금 JDK1.6 최적화를 많이 수행하는), 그러나 재산을 단순화했다 이전 버전과 호환; ② 해시 테이블 (같은 잠금) : 사용 스레드 안전을 보장하기 위해 동기화, 효율성이 매우 낮습니다. 액세스 동기화 방법에 하나 개의 스레드가 다른 스레드는 액세스 동기화 방법, 차단 될 수 있습니다 또는 풋를 사용하여 요소를 추가하는 등, 폴링 상태를 입력 할 때 사용 요소를 넣어 다른 스레드를 추가 할 수 없습니다, 당신은 경쟁이 점점 더 치열한 될 것입니다 얻을 사용할 수 없습니다 는 효율성을 낮 춥니 다.

무한 루프 문제 멀티 스레드 운영 결과를 해시 맵

주된 이유는 동시 개작 원형 연결리스트 될 것이다의 요소 사이에 형성되어 있다는 점이다. 그러나 1.8을 해결해이 문제를 JDK 만의 HashMap은 여전히 ​​데이터 손실 등의 문제가 있기 때문에 여전히 다중 스레드, 다중 스레드 사용의 HashMap의 사용을 권장하지 않습니다. 동시 환경은 ConcurrentHashMap의 권장.

마지막으로, 같은,이 문서 샤오 총통의 전체 내용으로 구성 된 PDF 문서 의 경우. 무료로 이용할 수의 클릭하십시오 아래의 링크 : HTTPS : //shimo.im/docs/pVhDCpYqdRTqWRqq/read

게시 65 개 원래 기사 · 원 찬양 5 · 조회수 5350

추천

출처blog.csdn.net/WANXT1024/article/details/104364675