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 를 해서 성능 을 떨 어 뜨리 기 때문이다.참고 자료: 비관 자물쇠 와 낙관 자물쇠 의 차이 에 대한 낙관 자물쇠 와 비관 자물쇠
단일 모드 에서 오 류 를 찾 는 것 (중요 도: ★ ★ ★ ☆) 오 류 는 구조 함 수 를 사유 화하 지 않 았 다. 단일 사례 는 비교적 간단 하 다. 그의 굶 주 린 식 과 게 으 른 식 의 두 가지 실현 방식 을 알 아 보면 된다.
추천 글: 단일 모드 를 어떻게 정확하게 쓰 는 지
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
면접 에서 자바 SE 와 관련 된 몇 가지 큰 문제인터페이스 라 는 것 은 바로 시스템 류 (구조) 디자인 에 대한 고려 를 바탕 으로 하 는 것 이다.시스템 은 보통 여러 모듈 을 설계 해 야 한다. 여러 모듈 간 의 결합 관 계 는 보통 인터페이스 로 연결 되 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.