importNew 사이트 의 라 는 글 에서 언급 된 문제 에 대해 자신의 정리 (1)

8665 단어 면접시험
자바 관련
Java GC 메커니즘 (중요 도: ★ ★ ★ ★)
주로 세 가지 측면 에서 대답 했다. GC 는 어떤 대상 을 대상 으로 회수 (접근 성 분석 법) 를 하 는 지, 언제 부터 GC (신세대 가 차 면 Minor GC 를 하고 옛날 에 대상 이 옛날 에 남 은 공간 보다 클 때 Major GC 를 한다), GC 는 무엇 을 하 는 지 (신세대 가 복제 알고리즘 을 사용 하고 옛날 에 태그 - 제거 또는 태그 - 정리 알고리즘 을 사용한다), 이런 대답 을 하 는 것 이 많 지 않 은 것 같다.조절 가능 한 인자 (- XX: newRatio, - Xms, - Xmx 등) 도 보충 할 수 있 습 니 다.
GC 메커니즘 을 이해 하 는 첫걸음 은 어떤 대상 이 회 수 될 지 이해 하 는 것 이다.한 대상 이 일련의 루트 대상 (예 를 들 어 정적 속성 참조 상수) 을 통 해 도달 하지 못 할 때 회수 된다.한 마디 로 대상 의 모든 인용 이 null 일 때.순환 의존 은 인용 이 아 닙 니 다. 대상 A 가 대상 B 를 가리 키 는 인용 이 있 으 면 대상 B 도 대상 A 를 가리 키 는 인용 이 있 습 니 다. 그 밖 에 다른 인용 이 없 으 면 대상 A 와 대상 B 는 모두 회수 되 어야 합 니 다 (아래 그림, ObjA 와 ObjB 는 회수 되 어야 합 니 다).출처: 자바 의 쓰레기 회수 메커니즘
GC 회수 대상 은 간단하게 말 하면 저 는 2 시 1 분 으로 요약 하고 인용 대상 이 도달 할 수 없 으 며 2. 순환 적 으로 인용 하 는 대상 입 니 다.
어떻게 안전하게 HashMap 을 사용 하 는 지 (중요 도: ★ ★ ★ ★)
자바 프로그래머 로 서 HashMap 과 자주 접촉 하기 때문에 HashMap 의 일부 원 리 는 제거 하 는 것 이 좋 습 니 다.이 문 제 는 주로 HashMap, HashTable, Concurrent HashMap, sychronizedMap 의 원리 와 차 이 를 묻 는 것 같다.
HashMap 을 안전하게 사용 하 는 방법
자바 생 성 대상 은 몇 가지 가 있 습 니까? (중요 도: ★ ★ ★ ☆)
1. new 키워드 사용
이것 은 가장 흔히 볼 수 있 는 대상 을 만 드 는 방법 이 며 매우 간단 하 다.이런 방법 을 사용 하면 우 리 는 우리 가 호출 해 야 할 모든 구조 함 수 를 호출 할 수 있다.
Employee emp1 = new Employee();

2. class 클래스 의 new Instance 방법 사용 하기
클 라 스 류 의 new Instance () 방법 으로 대상 을 만 들 수도 있 습 니 다.이 newInstance () 방법 은 대상 을 만 들 기 위해 무 참 구조 함 수 를 호출 합 니 다.
우 리 는 new Instance () 를 통 해 다음 과 같은 방식 으로 대상 을 만 들 수 있 습 니 다.
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();

혹은
Employee emp2 = Employee.class.newInstance();

3. 구조 함수 류 의 new Instance 방법 사용
클 라 스 류 를 사용 하 는 new Instance () 방법 과 비슷 합 니 다. 자바. lang. reflect. constructor 류 에는 대상 을 만 들 수 있 는 new Instance () 함수 방법 이 있 습 니 다.이 new Instance () 방법 을 사용 하면 우 리 는 매개 변수 화 구조 함수 와 개인 구조 함 수 를 호출 할 수 있 습 니 다.
Constructor constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();


이 new Instance () 방법 들 은 대상 을 만 드 는 반사 수단 으로 여 겨 진다.실제로 내부 클래스 의 new Instance () 방법 은 구조 함수 류 의 new Instance () 방법 을 사용한다.후 자 는 Spring, Hibernate, Struts 등 다양한 프레임 워 크 를 선 호 하고 사용 하 는 이유 다.
4. 클론 사용 방법
실제로 언제든지 클 라 이언 트 () 방법 을 호출 하면 JAVA 가상 머 신 은 새로운 대상 을 만 들 고 이전 대상 의 내용 을 이 새로운 대상 에 복사 합 니 다.clone () 방법 으로 대상 을 만 들 때 어떠한 구조 함수 도 호출 하지 않 습 니 다.
대상 에서 clone () 방법 을 사용 하기 위해 서 는 복제 가능 한 유형 을 실현 하고 clone () 방법 을 정의 해 야 합 니 다.
Employee emp4 = (Employee) emp3.clone();

5. 역 직렬 화 사용
언제든지 우리 가 한 대상 을 직렬 화 하고 반 직렬 화 할 때 JAVA 가상 기 는 우리 에 게 단독 대상 을 만들어 줄 것 이다.역 직렬 화 에서 JAVA 가상 기 는 어떠한 구조 함수 로 도 대상 을 만 들 지 않 습 니 다.
한 대상 을 직렬 화 하려 면 우리 가 클래스 에서 직렬 화 가능 한 인 터 페 이 스 를 실현 해 야 한다.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

위 바이트 코드 세 션 에서 보 듯 이 첫 번 째 함수 와 invokespecial 명령 을 제외 하고 다른 4 가지 방법 은 모두 invokefirtual 로 호출 되 고 변환 되 었 습 니 다.
예시
생 성 대상 을 준비 하 는 Employee 클래스 를 살 펴 보 겠 습 니 다.
class Employee implements Cloneable, Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    public Employee() {
        System.out.println("Employee Constructor Called...");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Employee [name=" + name + "]";
    }
    @Override
    public Object clone() {
        Object obj = null;
        try {
            obj = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return obj;
    }
}

아래 자바 프로그램 에서 우 리 는 5 가지 방식 으로 Employee 대상 을 만 듭 니 다.
public class ObjectCreation {
    public static void main(String... args) throws Exception {
        // By using new keyword
        Employee emp1 = new Employee();
        emp1.setName("Naresh");
        System.out.println(emp1 + ", hashcode : " + emp1.hashCode());
        // By using Class class's newInstance() method
        Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                               .newInstance();
        // Or we can simply do this
        // Employee emp2 = Employee.class.newInstance();
        emp2.setName("Rishi");
        System.out.println(emp2 + ", hashcode : " + emp2.hashCode());
        // By using Constructor class's newInstance() method
        Constructor constructor = Employee.class.getConstructor();
        Employee emp3 = constructor.newInstance();
        emp3.setName("Yogesh");
        System.out.println(emp3 + ", hashcode : " + emp3.hashCode());
        // By using clone() method
        Employee emp4 = (Employee) emp3.clone();
        emp4.setName("Atul");
        System.out.println(emp4 + ", hashcode : " + emp4.hashCode());
        // By using Deserialization
        // Serialization
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));
        out.writeObject(emp4);
        out.close();
        //Deserialization
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
        Employee emp5 = (Employee) in.readObject();
        in.close();
        emp5.setName("Akash");
        System.out.println(emp5 + ", hashcode : " + emp5.hashCode());
    }
}

이 프로그램의 출력 결 과 는 다음 과 같 습 니 다.
Employee Constructor Called...
Employee [name=Naresh], hashcode : -1968815046
Employee Constructor Called...
Employee [name=Rishi], hashcode : 78970652
Employee Constructor Called...
Employee [name=Yogesh], hashcode : -1641292792
Employee [name=Atul], hashcode : 2051657
Employee [name=Akash], hashcode : 63313419

원문 링크: 자바 에서 대상 을 만 드 는 5 가지 다른 방법
주해 (중요 도: ★ ★ ☆ ☆ ☆)
이력서 에 사용자 정의 주 해 를 언급 한 적 이 있다 면 잘 아 는 것 이 좋다.사용자 정의 주석 에 사용 할 두 개의 주요 원 주석 @ Retention 과 @ Target 을 알 고 있 습 니 다. @Retention 은 주 해 를 설명 하 는 보존 정책 으로 CLASS, RUNTIME, SOURCE 세 가지 가 있 습 니 다. 각각 주 해 는 클래스 파일, JVM 실행 시간 과 소스 코드 에 저 장 됩 니 다. @Target 은 주석 이 어떤 종류의 요소 에 추 가 될 수 있 는 지 설명 하 는 데 사 용 됩 니 다. 예 를 들 어 유형, 방법, 도 메 인 등 입 니 다.추천 글: 자바 주석 튜 토리 얼 및 사용자 정의 주석
이상 (중요 도: ★ ★ ☆ ☆ ☆)
필기시험 문제, 코드 는 다음 과 같 습 니 다. 반환 값 이 무엇 인지 물 어보 세 요.
int ret = 0;
try{
throw new Exception();
}
catch(Exception e){
ret = 1;
return ret;
}
finally{
ret = 2;
}

주요 시험 점 은 catch 의 return 이 finally 이후 에 실행 되 지만 return 의 값 을 한 곳 에 저장 하기 때문에 finally 의 ret = 2 는 실행 되 지만 반환 값 은 1 입 니 다.
추천 글:
자바 이상 처리 메커니즘 깊이 이해
자바 이상 처리 및 디자인
자바 이상 면접 문제 및 답 - part 1
자바 이상 면접 문제 및 답 - part 2
자바 이상 면접 문제 및 답 - part 3
비관 자물쇠 와 낙관 자물쇠 의 차이, 낙관 자 물 쇠 는 어떤 상황 에 적합 합 니까 (중요 도: ★ ★ ★ ☆)
비관 적 인 자 물 쇠 는 괴 질 이 짐 을 해 치 려 고 한다 고 생각 하고 데 이 터 를 방문 할 때마다 다른 사람 이 수정 할 것 이 라 고 생각 하기 때문에 데 이 터 를 가 져 올 때마다 자 물 쇠 를 잠 그 고 자신 이 사용 하 는 과정 에서 다른 사람 에 게 접근 하지 않도록 하 는 것 이다.낙관적 인 자 물 쇠 는 단순 하고 마음가짐 이 좋 기 때문에 데 이 터 를 가 져 올 때마다 자 물 쇠 를 잠 그 지 않 고 데 이 터 를 업데이트 할 때 이 데이터 가 다른 사람 에 의 해 수정 되 었 는 지 판단 할 뿐이다.대부분의 관계 데이터 베 이 스 를 기록 하 는 작업 은 비관 적 인 자 물 쇠 를 바탕 으로 하 는 것 입 니 다. 자 물 쇠 를 가 진 클 라 이언 트 가 느리게 실행 되면 잠 금 해 제 를 기다 리 는 클 라 이언 트 가 막 히 는 시간 이 길 어 지 는 것 이 단점 입 니 다.Redis 의 업 무 는 낙관적 인 잠 금 체 제 를 바탕 으로 WATCH 명령 을 실행 할 때 데 이 터 를 잠 그 지 않 습 니 다. 다만 데이터 가 다른 클 라 이언 트 에 의 해 먼저 수 정 된 상황 에서 WATCH 명령 을 실행 하 는 클 라 이언 트 에 게 알 립 니 다.낙관적 인 자 물 쇠 는 많이 읽 고 적 게 쓰 는 경우 에 적합 하 다. 왜냐하면 쓰기 동작 이 비교적 빈번 할 때 끊임없이 retry 를 해서 성능 을 떨 어 뜨리 기 때문이다.참고 자료: 비관 자물쇠 와 낙관 자물쇠 의 차이 에 대한 낙관 자물쇠 와 비관 자물쇠
단일 모드 에서 오 류 를 찾 는 것 (중요 도: ★ ★ ★ ☆) 오 류 는 구조 함 수 를 사유 화하 지 않 았 다. 단일 사례 는 비교적 간단 하 다. 그의 굶 주 린 식 과 게 으 른 식 의 두 가지 실현 방식 을 알 아 보면 된다.
추천 글: 단일 모드 를 어떻게 정확하게 쓰 는 지

좋은 웹페이지 즐겨찾기