1. Equals 메소드는 객체의 내용이 동일한지 여부를 비교하는 데 사용됩니다 (나중에 재정의).
2. 해시 코드 방법은 수집에서만 사용됩니다
3. Equals 메소드가 덮어 쓰는 경우, 비교 객체가 동일한지 여부는 덮어 쓰기 한 동등한 방법을 통해 비교 될 것입니다 (물체의 내용이 동일한지 판단).
4. 객체를 컬렉션에 넣을 때 먼저 배치 할 객체의 해시 코드 값이 컬렉션의 모든 요소의 해시 코드 값과 동일인지 결정하십시오. 동일하지 않은 경우 객체를 컬렉션에 직접 넣으십시오. 해시 코드 값이 같으면 동등한 메소드를 사용하여 배치 할 객체가 컬렉션의 객체와 동일인지 결정하십시오. 동등한 판단이 동일하지 않은 경우 요소를 컬렉션에 직접 넣으면 배치되지 않습니다.
5. Equals 메소드는 객체 메모리 주소가 객체의 동일인지 결정하기 위해 객체 메모리 주소가 동일인지 여부를 사용합니다.
그것들은 두 개의 새로운 객체이기 때문에 객체의 메모리 주소는 같지 않으므로 stu1.equals (stu2)는 false입니다.
6. 스레드 A와 B는 O의 잠금을 얻어야합니다. O의 잠금을 취득한다고 가정하면 O, B는 A의 잠금을 해제하기를 기다립니다. 동기화 된 사용이 사용되지 않으면 A가 계속 해제되면 B가 계속 유지 될 때까지 대기하고 중단 될 수 없습니다. ReintrantLock을 사용하는 경우 A가 릴리스되지 않으면 B는 오랫동안 기다린 후 대기를 방해하고 다른 일을 할 수 있습니다.
ReintrantLock은 세 가지 방법으로 자물쇠를 획득합니다.
a) 잠금 (), 잠금 장치가 취득되면 즉시 돌아옵니다. 다른 스레드가 잠금 장치를 보유하면 자물쇠가 획득 될 때까지 현재 스레드가 휴면 상태로 유지됩니다.
b) trylock (), 잠금이 획득되면 즉시 true를 반환하고 다른 스레드가 잠금을 보유하면 즉시 False를 반환합니다.
c) TryLock (긴 시간 초과, TimeUnit Unit), 잠금 장치가 취득되면 즉시 True를 반환합니다. 다른 스레드가 잠금 장치를 잡고 있으면 매개 변수의 주어진 시간을 기다립니다.
대기 과정에서 잠금이 획득되면 TRUE가 반환되고 대기 시간 초과가 있으면 False를 반환합니다.
d) 잠금성 : 잠금 장치가 취득되면 즉시 반환하십시오. 잠금 장치가 획득되지 않으면 현재 실은 휴면 상태에 있거나 잠겨 있습니다.
또는 현재 스레드가 다른 스레드에 의해 중단됩니다
동기화 된 것은 JVM 레벨에서 구현됩니다. 일부 모니터링 도구를 통해 동기화 잠금을 모니터링 할 수있을뿐만 아니라 코드 실행 중에 예외도 발생할 수 있습니다.
JVM은 자동으로 잠금을 해제하지만 잠금을 사용할 수는 없습니다. 잠금은 코드를 통해 구현됩니다. 잠금 장치가 해제되도록하려면 잠금 해제 ()가 최종적으로 {}에 배치해야합니다.
자원 경쟁이 매우 치열하지 않으면 동기화의 성능은 재 retrantlock의 성능보다 낫습니다. 그러나 자원 경쟁이 매우 치열한 경우, 동기화의 성능은 수십 번 감소하지만 재 retrantlock의 성능은 정상으로 유지 될 수 있습니다.
JDK에서 다음 클래스는 주로 Java.lang.reflect 패키지에있는 Java 반사 메커니즘을 구현하는 데 주로 사용됩니다.
클래스 : 클래스를 나타냅니다.
필드 클래스 : 클래스를 나타내는 멤버 변수 (멤버 변수를 클래스의 속성이라고도합니다).
메소드 클래스 : 클래스를 나타내는 메소드.
생성자 클래스 : 클래스의 생성자 메소드를 나타냅니다.
배열 클래스 : 배열의 배열을 동적으로 생성하고 배열의 요소에 액세스하기위한 정적 메소드를 제공합니다.
반사 API의 실제 적용을 보는 몇 가지 예는 다음과 같습니다.
1. 클래스 클래스를 통해 멤버 변수, 멤버 메소드, 인터페이스, 슈퍼 클래스, 생성자 메소드 등을 가져옵니다.
getClass () 메소드는 java.lang.object 클래스에 정의되므로 Java 객체의 경우이 메소드를 통해 객체 유형을 얻을 수 있습니다. 클래스 클래스는 반사 API의 핵심 클래스이며 다음과 같은 방법이 있습니다.
getName () : 클래스의 전체 이름을 얻습니다.
getfields () : 공공 유형의 클래스의 재산을 얻습니다.
getDeclaredFields () : 클래스의 모든 속성을 가져옵니다.
getMethods () : 수업의 공공 유형을 얻는 메소드.
getDeclaredMethods () : 클래스의 모든 메소드를 얻습니다.
getMethod (문자열 이름, class [] parameterTypes) : 클래스의 특정 메소드를 가져옵니다. 이름 매개 변수는 메소드의 이름을 지정합니다. 매개 변수 매개 변수는 메소드의 매개 변수 유형을 지정합니다.
getConstructors () : 공공 유형의 클래스의 생성자를 얻습니다.
getConstructor (class [] parameterTypes) : 클래스의 특정 생성자를 가져옵니다. ParameterTypes 매개 변수는 생성자의 매개 변수 유형을 지정합니다.
NewInstance () : 매개 변수가없는 클래스의 생성자를 통해이 클래스의 객체를 만듭니다.
자바 반사판을 작성하는 단계 :
1) 먼저 클래스의 클래스 개체를 받아야합니다.
예를 들어:
클래스 C1 = test.class; 클래스 c2 = class.forname ( "com.reflection.test"); 클래스 C3 = New Test (). getClass ();
2) 그런 다음 클래스 객체의 메소드를 별도로 호출하여 클래스의 속성/방법/생성자를 얻습니다.
참고 : 수업에서 방법/속성/생성자를 정상적으로 얻으려면 다음 반사 클래스에 집중해야합니다.
필드
건설자
방법
<servlet-mapping> <servlet-name> </servlet-name> <Url-pattern> </url-pattern> </servlet-mapping> for (string elementa : string) {system.out.print (elementa + ""); } list <string> list = new ArrayList <string> (); for (int i = 0; i <str.length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} set <string> set = new Hashset <문자열> (); for (int i = 0; i <str.length; i ++) {set.add (str [i]); }봄에는 6 개의 거래와 5 개의 격리 수준이 있습니다
카테고리 1 : Inte Short Int Long
카테고리 2 : 플로트 더블
세 번째 범주 : 논리적 부울 (true false로 간주 될 수있는 두 가지 값 만 있습니다)
카테고리 4 : 캐릭터 숯
최종 수정 클래스의 방법
기능 : 상속 될 수 있지만 상속 후에 다시 작성할 수는 없습니다.
최종 수정 클래스
기능 : 수업을 상속받을 수 없습니다.
기본 유형을 최종 수정하면 값은 변경되지 않습니다. 참조 유형은 주소가 변경되지 않음을 나타냅니다. 즉, 새로운 경우 주소를 재 할당 할 수 없습니다.
최종 수정 속성을 알고 있습니다
준비는 사전 컴파일됩니다. 먼저 전처리를 위해 데이터베이스에 SQL을 제출 한 다음 캐시에 넣으십시오. 다음에 동일하다는 것을 알게되면 컴파일 할 필요가 없습니다. 실행 효율이 높고 점검을 용이하게하기위한 구문 프롬프트가 있으며 매개 변수는 동적이며 구문 검사로 인해 SQL 주입을 방지합니다.
tbname = 'zck'및 passwd = '또는'1 '='1 '에서 *를 선택하십시오.
명령문은 사전 컴파일되지 않았으며, 구문 오류에 대한 수동 점검이 필요합니다.
Hashmap은 NULL이 항목의 키 또는 값으로 허용하지만 Hashtable은 그렇지 않습니다.
방법을 넣으십시오
Hashmap은 NULL 값 키에서 특수 처리를 수행하여 항상 테이블 [0] 위치에 넣습니다. 프로세스는 먼저 해시를 계산 한 다음 해시와 테이블을 통해 인덱스 값을 계산 한 다음 키를 테이블 [색인] 위치에 놓는 것입니다. 다른 요소가 이미 표 [index]에 존재하면 링크 된 목록이 표 [색인] 위치에 형성되고 새로 추가 된 요소가 표 [index]에 배치되며 원래 요소는 다음 항목을 통해 연결됩니다. 이러한 방식으로 해시 충돌 문제는 링크 된 목록의 형태로 해결됩니다. 요소 수가 임계 값 (Capactiy*accor)에 도달하면 용량이 확장되고 테이블 배열의 길이는 테이블이됩니다. length*2
방법을 얻으십시오
마찬가지로, 키가 NULL 인 경우, 특수 처리가 수행되고 키가있는 요소가 링크 된 표 [0]에 NULL이 있습니다.
Get의 프로세스는 먼저 해시를 계산 한 다음 해시와 테이블을 통해 인덱스 값을 계산하는 것입니다. 길이는 키가 발견 될 때까지 테이블 [index]의 링크 된 목록을 반복 한 다음 해시 맵과 해시 가능의 기본 구현을 반환하는 것이 해시를 먼저 계산하기위한 배열 + 연결 목록 구현입니다. 테이블 배열의 첨자 인 인덱스는 해시와 테이블에 기초하여 계산되며, 길이가 계산되고 해당 작업이 수행됩니다.
대부분의 인덱스는 B- 트리를 기반으로합니다
서블릿 스레드 안전 문제는 주로 인스턴스 변수로 인해 발생하므로 인스턴스 변수는 서블릿에서 피해야합니다.
애플리케이션 디자인이 인스턴스 변수를 사용하지 않으면 동기화가 사용될 인스턴스 변수를 보호하는 데 사용되지만 최적의 시스템 성능을 위해 최소한의 가용성을 가진 코드 경로를 동기화해야합니다.
싱글 톤 패턴을 작성하십시오
public static long recursive (int n) {if (n <= 0) return 0; if (n == 1) 반환 1; 반환 재귀 (n -1) + 재귀 (n -2);} 공개 정적 롱 루프 (int n) {if (n <= 0) return 0; if (n == 1) return 1; long fib1 = 0; long sum =; i ++) {sum = fib1+fib2; fib1 = fib2; fib2 = sum;} return sum;} Hashtable은 스레드 안전 클래스입니다. 동기화 된 해시 테이블을 잠그기 위해 동기화되어 스레드 안전성을 달성하여 매번 전체 테이블을 잠그고 스레드가 점유하도록합니다. ConsurenThashMap을 사용하면 다중 수정 작업을 동시에 수행 할 수 있으며 열쇠는 잠금 분리 기술을 사용하는 것입니다. 해시 테이블의 다른 부분에 대한 수정을 제어하기 위해 여러 자물쇠를 사용합니다.
ConsurenThashMap은 세그먼트 (세그먼트)를 사용하여 이러한 다른 부분을 나타냅니다. 각 세그먼트는 실제로 작은 해시 가능이며 자체 자물쇠가 있습니다. 여러 세그먼트에서 다중 수정 작업이 발생하는 한 동시에 수행 할 수 있습니다.
일부 방법은 size ()와 같은 세그먼트를 가로 지르고 포함해야합니다. 특정 세그먼트 대신 전체 테이블을 잠쳐야 할 수도 있습니다. 이를 위해서는 모든 세그먼트를 순서대로 잠그려야합니다. 작업이 완료된 후 모든 세그먼트의 잠금 장치가 순서대로 해제됩니다. "순서"는 여기서 매우 중요합니다. 그렇지 않으면 교착 상태가 높습니다. ConcurrEthashMap에서는 세그먼트 배열이 최종이며 멤버 변수는 실제로 최종입니다. 그러나 단순히 배열을 최종으로 선언한다고해서 배열 멤버가 최종임을 보장하지는 않으므로 구현 보증이 필요합니다.
자물쇠가 획득되는 순서가 고정되어 있기 때문에 교착 상태가 없도록합니다.
짐
ThreadLocal
ThreadLocal은 다른 스레드마다 인스턴스가 다른지 확인하고 동일한 스레드에 동일한 인스턴스가 있어야합니다. 즉, 변수를 사용하는 각 스레드는 변수 값의 사본을 제공합니다. 각 스레드는 다른 스레드의 사본과 충돌하기보다는 독립적으로 자체 사본을 변경할 수 있습니다.
장점 : 스레드 안전 공유 객체를 제공합니다
다른 동기화 메커니즘과의 차이점 : 동기화 메커니즘은 여러 스레드에 의해 동일한 자원에 대한 동시 액세스를 동기화하고 여러 스레드간에 통신하는 것입니다.
ThreadLocal은 여러 스레드에서 분리 된 데이터 공유이며 기본적으로 여러 스레드간에 리소스를 공유하지 않습니다. 이것은 확실히 여러 스레드를 동기화 할 필요는 없습니다.
휘발성 물질
휘발성 수정 된 멤버 변수는 스레드에 의해 액세스 할 때마다 공유 메모리에서 멤버 변수의 값을 다시 읽어야합니다. 그리고,
멤버가 변수가 변경되면 스레드는 변경 값을 공유 메모리에 다시 작성해야합니다.
장점 : 이런 식으로, 언제든지 두 개의 다른 스레드는 항상 특정 멤버 변수의 동일한 값을 볼 수 있습니다.
이유 : Java Language Specification에 따르면 최상의 속도를 얻으려면 스레드가 공유 멤버 변수의 개인 사본을 저장할 수 있습니다.
그리고 스레드가 동기 코드 블록에 들어가거나 떠날 때 공유 멤버 변수의 원래 값과 비교됩니다.
이러한 방식으로, 여러 스레드가 동시에 객체와 상호 작용할 때, 스레드가 적시에 공유 멤버 변수의 변경 사항을 얻을 수 있도록주의를 기울여야합니다.
휘발성 키워드는 VM을 프롬프트합니다.이 멤버 변수의 경우 개인 사본을 저장할 수는 없지만 공유 멤버 변수와 직접 상호 작용해야합니다.
사용 요령 : 둘 이상의 스레드가 액세스하는 멤버 변수에서 휘발성을 사용하십시오.
액세스 할 변수가 이미 동기화 된 코드 블록에 있거나 상수 일 때 사용할 필요는 없습니다.
효율을 향상시키기 위해 스레드는 멤버 변수 (예 : A) (예 : B와 같은)를 복사하고 스레드의 A에 대한 액세스는 실제로 B에 액세스합니다. A와 B의 동기화는 특정 동작에서만 수행되므로 A와 B가 일치하지 않는 상황이 있습니다. 휘발성은이 상황을 피하기 위해 사용됩니다.
Villatile은 JVM에 수정하는 변수가 사본을 유지하지 않고 기본 메모리의 사본에 직접 액세스하지 않는다고 말합니다 (많은 읽기 작업이있을 때 사용하는 것이 좋습니다. 스레드간에 커뮤니케이션이 필요하지만이 기사는 할 수 없습니다).
휘발성 변수는 가시성 특성을 동기화하지만 원자 속성은 없습니다.
이는 스레드가 휘발성 변수의 최신 값을 자동으로 발견 할 수 있음을 의미합니다. 휘발성 변수는 스레드 안전성을 제공하는 데 사용될 수 있지만 매우 제한된 사용 세트에만 적용될 수 있습니다. 여러 변수 또는 변수의 현재 값과 수정 된 값 사이에는 제약이 없습니다.
제한된 경우 잠금 대신 휘발성 변수 만 사용할 수 있습니다. 휘발성 변수 이상적인 스레드 안전을 만들려면 다음 두 조건을 동시에 충족해야합니다.
변수에 대한 쓰기 작업은 현재 값에 의존하지 않습니다. 변수는 다른 변수와의 변수에 포함되지 않습니다.
수면 () vs 대기 ()
Sleep은 스레드 클래스 (스레드)로,이 스레드가 지정된 시간 동안 실행을 일시 중지하고 실행 기회를 다른 스레드로 보냅니다. 그러나 모니터링 상태는 유지되며 그 후에 자동으로 재개됩니다. 수면을 호출하면 객체 잠금이 해제되지 않습니다.
대기는 객체 클래스의 방법입니다. 이 객체에서 대기 방법을 호출하면 스레드가 객체 잠금 장치를 포기하고 대기 잠금 풀 에이 객체를 대기 대기합니다. 이 객체에 대한 알림 메소드 (또는 Notifyall)를 발행 한 후에만이 스레드는 객체 잠금 풀에 들어가 객체 잠금을 얻을 준비를하고 실행 된 상태로 들어갑니다. (변수가 휘발성으로 선언되면 액세스 할 때마다 메인 메모리와 일치합니다. 변수가 동기 메소드 또는 동기 블록으로 액세스되면 메서드 또는 블록의 입구에서 잠금이 얻어지면 변수가 동기화되고 메소드 또는 블록이 종료 될 때 잠금이 해제 될 때 변수가 동기화됩니다).
http://www.yjbys.com/news/202750.html
클라이언트 프로그램은 먼저 특정 컨테이너 역할을 얻은 다음 특정 컨테이너 역할을 통해 특정 반복 역할을 얻어야합니다.
반복자 it = new arraylist.iterator ();
1) 내부 표현을 노출시키지 않고 컨테이너 객체의 내용에 액세스하십시오.
2) 컨테이너 객체의 여러 통과를 지원합니다.
3) 다른 컨테이너 구조를 통과하기위한 통합 인터페이스 (다형성 반복)를 제공합니다.
새 키워드를 사용하십시오} → 생성자가 호출되었습니다
클래스 클래스의 Newinstance 메소드 사용} → 생성자가 호출되었습니다.
생성자 클래스의 Newinstance 메소드 사용} → 생성자 함수를 호출했습니다.
복제 메소드 사용} → 생성자가 호출되지 않습니다
Deserialization 사용} → 생성자가 호출되지 않습니다
Employee emp2 = (Employee) class.forname ( "com.employee"). NewInstance ();
또는
Employee EMP2 = Employee.class.newinstance (); 생성자 생성자 = Employee.class.getConstructor (); 직원 EMP3 = Constructor.NewInstance ();
복제 방법을 사용하여 먼저 클로닝 가능한 인터페이스를 구현하고 이에 의해 정의 된 클론 방법을 구현해야합니다.
Employee EMP4 = (직원) EMP3.CLONE ();
프로그램이 시작되면 프로그램에서 사용할 모든 클래스 파일을 한 번에로드하지는 않습니다. 대신 프로그램의 요구에 따라 Java 클래스로드 메커니즘 (클래스 로더)을 통해 특정 클래스 파일을 메모리에 동적으로로드합니다. 따라서 클래스 파일이 메모리에로드 된 후에 만 다른 클래스에서 참조 할 수 있습니다. 따라서 클래스 로더는 클래스 파일을 메모리에 동적으로로드하는 데 사용됩니다.
부트 스트랩 클래스 로더 : 스타트 업 클래스 로더라고 불리는 것은 Java 클래스 로딩 계층 구조의 최상위 클래스 로더이며, 예 : rt.jar, resources.jar.jar, charsets.jar 등과 같은 JDK에 핵심 클래스 라이브러리를로드하는 책임을 맡고 있습니다. Extension Classloader : Extension Class Loader, Java 's Extension Class Library, 및 모든 Jars의로드에 대한 책임을 맡고 있습니다. java_home/jre/lib/ext/기본적으로.
App Classloader : 시스템 클래스 로더라고하며 Application ClassPath 디렉토리에 모든 항아리 및 클래스 파일을로드하는 데 책임이 있습니다.
이것은 반복적 인 하중을 피할 수 있기 때문에 아버지가 수업을 적재했을 때 아동 클래스 로더가 다시로드 할 필요가 없습니다.
보안 요인을 고려할 때이 대표 모드를 사용하지 않으면 언제든지 Java Core API에 정의 된 유형을 동적으로 교체 할 수 있으며, 이는 매우 큰 보안 위험이 발생할 수 있습니다. String은 시작시 부팅 클래스 로더 (bootstrcp classloader)에 의해 이미로드 되었기 때문에 부모 대의원 메소드는이 상황을 피할 수 있으므로 JDK에서 클래스 로더 검색 클래스의 기본 알고리즘을 변경하지 않는 한 사용자 정의 클래스 로더는 자체적으로 문자열을로드 할 수 없습니다.
1. 요청 객체 클라이언트 요청에 따라이 요청에는 GET/Post 요청의 매개 변수가 포함되어 있으며 고객의 요구 만 이해 한 다음 응답 할 수 있습니다.
2. 응답 객체에 대한 관련 정보는 고객 요청에 응답합니다.
3. 세션 객체는 클라이언트에서 서버로의 웹 application에서 클라이언트가 서버에서 분리 될 때까지 클라이언트와 서버 간의 세션을 말합니다.
4. Out Object는 JSPWriter 클래스의 인스턴스이며 일반적으로 사용되는 객체로서 클라이언트에 컨텐츠를 출력합니다.
5. 페이지 객체는 현재 JSP 페이지 자체를 가리키고 있는데, 이는 클래스 에서이 포인터와 비슷합니다. java.lang.object 클래스의 인스턴스입니다
6. 응용 프로그램 객체는 사용자 간 데이터 공유를 인식하고 글로벌 변수를 저장할 수 있습니다. 서버가 종료 될 때까지 서버 시작으로 시작합니다.
7. 예외 객체는 예외 객체입니다. 실행 중 과정에서 예외가 발생하면이 객체가 생성됩니다.
8. PageContext 객체 JSP 페이지의 모든 객체 및 네임 스페이스에 대한 액세스를 제공합니다.
9. 구성 객체는 JSP 엔진에서 서블릿이 초기화 될 때 정보를 전달하는 데 사용됩니다.
JS는 기능이 있습니다 isnan (val) // 숫자라면 false를 반환합니다.
XMLDOM 구문 분석, 색소폰 구문 분석 및 Stax 파싱이 있습니다
XMLDOM : (xmlDocumentObjectModel) 큰 파일을 처리 할 때 성능이 크게 악화됩니다. 이 문제는 많은 메모리를 차지하는 DOM 트리 구조로 인해 발생하며, DOM은 파일을 구문 분석하기 전에 전체 문서를 메모리에로드해야하며, 이는 XML에 대한 임의의 액세스에 적합합니다.
Sax : (simplepiforxml) dom과 달리 Sax는 이벤트 중심의 XML 구문 분석 방법입니다. XML 파일을 순서대로 읽으며 전체 파일을 한 번에로드 할 필요는 없습니다. 파일의 시작, 문서의 끝 또는 태그의 시작 및 태그의 시작과 같은 이벤트가 발생하면 콜백 이벤트에서 처리 코드를 작성하여 XML 파일을 처리하여 XML에 순차적으로 액세스 할 수있는 이벤트가 트리거됩니다.
STAX : (StreamingApiForXML)와 다른 방법의 차이점은 응용 프로그램이 XML을 이벤트 스트림으로 처리 할 수 있다는 것입니다. 이는 성능 및 가용성 측면에서 다른 방법보다 우수합니다.
Thread.getState ()
위는 편집자가 편집 한 Java 인터뷰 질문입니다. 나는 그들이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 당신에게 답장 할 것입니다!