매일 6 개의 자바 초보 입문 면접 문제,자유 로 운 길 로 가 는 다음날

1.String 류 에 대해 다른 이 해 를 가지 고 있 는 지 말씀 해 주 시 겠 어 요?
String 의 소스 코드 를 보 는 과정 에서 String 내부 의 실제 저장 구 조 는 char 배열 이 고 String 에서 몇 가지 중요 한 구조 함수 가 있 음 을 알 수 있 습 니 다.

//        
public String() {
        this.value = "".value;
}
//  String        
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
//  char[]        
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
//  StringBuffer         
public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}
//  StringBuilder         
public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
한편,String 류 에서 우리 가 흔히 볼 수 있 는 방법 은 equals 방법 으로 두 문자열 이 같은 지 비교 하 는 데 사용 된다.이것 은 사실 Object 류 의 equals 방법 을 다시 썼 습 니 다.구체 적 인 비교 과정 은 다음 과 같 습 니 다.
  • 은 먼저 두 대상 의 인용 이 같 는 지 판단 한다.같 으 면 트 루 로 바로 돌아 갑 니 다.
  • 과 다 르 면 대비 해 야 할 값 이 String 형식 인지 먼저 판단 하고 그렇지 않 으 면 false 로 되 돌려 줍 니 다.
  • .String 형식 이 라면 두 문자열 의 모든 문 자 를 반복 적 으로 비교 하고 모든 문자 가 같 을 때 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
  • 구체 적 인 소스 코드 는 다음 과 같다.
    
    public boolean equals(Object anObject) {
        //            true
        if (this == anObject) {
            return true;
        }
        //             String   ,          false
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                //            char     
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //                
                while (n-- != 0) {
                    //               true false,      
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    
    String 클래스 에 도 equals()와 유사 한 방법 이 있 습 니 다.equals Ignorecase()는 문자열 의 대소 문 자 를 무시 한 후에 문자열 을 비교 하 는 데 사 용 됩 니 다.
    물론 String 클래스 에 도 우리 가 흔히 사용 하 는 방법 이 많 습 니 다.
  • compareTo() :두 문자열 비교
  • indexOf(): 검색 문자열 이 처음으로 나타 난 아래 표 시 된 위치
  • lastIndexOf(): 검색 문자열 이 마지막 으로 나타 난 아래 표 시 된 위치
  • contains(): 검색 문자열 에 다른 문자열 이 포함 되 어 있 는 지 여부
  • toLowerCase(): 문자열 을 모두 소문 자
  • 으로 변환 합 니 다.
  • toUpperCase(): 문자열 을 모두 대문자
  • 으로 변환 합 니 다.
  • length(): 검색 문자열 의 길이
  • trim(): 문자열 의 맨 끝 빈 칸 을 제거 합 니 다
  • replace(): 대체 문자열 의 일부 문자
  • split(): 문자열 을 분할 하고 문자열 배열
  • 으로 되 돌려 줍 니 다.
  • join(): 문자열 배열 을 문자열
  • 으로 바 꿉 니 다.
    이것들 은 모두 우리 가 실제 응용 에서 사용 할 수 있 는 방법 이다.
    2.==equals 와 의 차이
  • == :
  • 은 기본 데이터 유형 에 있어'값'이 같 는 지 비교 하 는 데 사용 된다.
  • 은 인용 유형 에 있어 서 인용 주소 가 같은 지 비교 하 는 데 사용 된다.
  • equals():그 역할 도 두 대상 이 같은 지 판단 하 는 것 이다.그러나 그것 은 일반적으로 두 가지 사용 상황 이 있다.
  • 상황 1:클래스 가 equals()방법 을 덮어 쓰 지 않 았 을 때 기본 적 인 equals 방법(Object 류 에서 계승 한)은 조작 자 를 사용 하 는 것 이 고 두 변수 가 가리 키 는 대상 이 같은 대상 인지 비교 하 는 것 입 니 다.이때 equals 를 사용 하면 같은 결 과 를 얻 을 수 있 습 니 다.인용 주소 가 같은 지 비교 할 수 있 습 니 다.
  • 상황 2:클래스 가 equals()방법 을 덮어 씁 니 다.일반적으로 우 리 는 equals()방법 을 덮어 두 대상 의 내용 이 같다.이들 의 내용 이 같다 면 트 루 로 돌아 갑 니 다.
  • 3.String s=new String("nz")은 몇 개의 문자열 대상 을 만 들 었 습 니까?
    String 에서 흔히 볼 수 있 는 생 성 방식 은 두 가지 가 있 습 니 다.new String()방식 과 직접 값 을 부여 하 는 방식 입 니 다.
  • 직접 할당 방식 은 문자열 상수 탱크 에서 이 값 이 있 는 지 찾 습 니 다.있 으 면 참조 주 소 를 이 값 으로 직접 가리 키 지 않 으 면 상수 탱크 에서 만 든 다음 에 이 값 을 가리 킵 니 다.
  • 과 new String()의 방식 은 반드시 더미 위 에 문자열 대상 을 만 든 다음 상수 탱크 에 가서 이 문자열 의 값 이 이미 존재 하 는 지 확인 합 니 다.존재 하지 않 으 면 상수 탱크 에 이 문자열 을 만 든 다음 에 인 용 된 값 을 이 문자열 에 가 리 킵 니 다.
  • 그래서 두 개의 대상 을 만 들 것 입 니 다.하 나 는 문자열 상수 탱크 의 대상 인'nz'이 고,또 하 나 는 new 가 쌓 여 있 는 문자열 대상 s 입 니 다.그리고 인용 한 값 은 이 문자열 상수 탱크 의 대상 을 가리 키 고 있 습 니 다.
    간단하게 테스트 해 봅 시다.
    
    public static void main(String[] args) {
        String s1 = "nz";
        String s2 = new String("nz");
        System.out.println(s1 == s2);  // false
        System.out.println(s1.equals(s2)); // true
    }
    

    4.JVM 이 실 행 될 때 데이터 영역 이나 메모리 구 조 를 말씀 해 주 시 겠 습 니까?
    우 리 는 스 레 드 의 개인 과 스 레 드 가 공유 하 는 두 가지 상황 으로 나 눌 수 있다.
    스 레 드 개인:프로그램 카운터,로 컬 방법 스 택,가상 컴퓨터 스 택
    스 레 드 공유:쌓 기 및 방법 영역
  • 프로그램 카운터:아주 작은 메모리 공간 을 차지 하고 현재 스 레 드 의 실행 줄 수 를 기록 합 니 다.스 레 드 가 계속 전환 할 수 있 기 때문에 현재 스 레 드 를 어떻게 보장 합 니까?어디 까지 실행 합 니까?바로 프로그램 카운터 로 이 루어 집 니 다.이 메모리 영역 은 유일 하 게 자바 가상 컴퓨터 규범 에 OOM 상황 이 규정 되 어 있 지 않 은 영역 입 니 다.
  • 가상 컴퓨터 스 택:jvm 에서 방법 을 실행 할 때 이 지역 에 스 택 프레임 을 만들어 스 택 에 들 어 갑 니 다.이 는 국부 변수 표,조작 스 택,동적 연결,방법 으로 주소 등 정 보 를 저장 합 니 다.
  • 로 컬 방법 스 택:가상 스 택 도 유사 하지만 주로 native 방법 으로 서 비 스 를 제공 합 니 다.예 를 들 어 자바 가 c 언어의 인터페이스 서 비 스 를 사용 해 야 할 때.
  • 더미:자바 더미 또는 GC 더미 라 고도 부 릅 니 다.스 레 드 가 공유 하 는 메모리 구역 이자 JVM 에서 메모리 가 가장 큰 구역 입 니 다.거의 모든 대상 이 여기에 저장 되 어 메모 리 를 분배 하 는 것 도 쓰레기 회수 기의 주요 관리 구역 입 니 다.
  • 방법 구역:가상 컴퓨터 에 불 러 온 클래스 정보,상수,정적 변수,컴 파일 러 가 컴 파일 한 코드 등 데 이 터 를 저장 합 니 다.

  • 5.클래스 로 딩 과정
    시스템 에서 Class 형식 파일 을 불 러 오 는 주요 절 차 는 C>연결 C>초기 화 입 니 다.연결 은 인증 C>준비 C>분석 으로 나 눌 수 있 습 니 다.
  • 로 딩:클래스 의 전체 한정 명 에 따라 클래스 의 바 이 너 리 바이트 흐름 을 가 져 오고 메모리 에 이러한 클래스 를 대표 하 는 Class 대상
  • 을 생 성 합 니 다.
  • 검증:주로 class 파일 의 정확성 을 검증 합 니 다.예 를 들 어 파일 형식,메타 데이터,바이트 코드,기호 참조 검증 등 입 니 다.
  • 준비:주로 클래스 변 수 를 위해 메모 리 를 분배 하고 클래스 변 수 를 설정 하 는 초기 단계 입 니 다.
  • 해석:가상 컴퓨터 는 상수 탱크 안의 기호 인용 을 직접 인용 하 는 과정 으로 대체 합 니 다.
  • 초기 화:클래스 로 딩 의 마지막 단계 입 니 다.클래스 에서 정 의 된 자바 프로그램 코드 를 진정 으로 실행 하 는 과정 입 니 다.
  • 6.그 중 에 카 운 터 는 무엇 입 니까?어떤 것 이 있 습 니까?
    임의의 클래스 에 대해 서 는 클래스 로 더 를 불 러 오 는 것 과 이 클래스 자체 가 JVM 에서 의 유일 성 을 확립 해 야 합 니 다.모든 클래스 로 더 는 독립 된 클래스 이름 공간 이 있 습 니 다.클래스 로 더 는 지 정 된 모든 한정 이름 에 따라 class 파일 을 JVM 메모리 에 불 러 온 다음 class 대상 으로 전환 하 는 것 입 니 다.
    주로 네 종류의 로 더 가 있 습 니 다.
  • 시작 클래스 로 더(BootstrapClassLoader)는 자바 핵심 라 이브 러 리 를 불 러 오 는 데 사용 되 며 자바 프로그램 에서 직접 참조 할 수 없습니다.
  • 확장 클래스 로 더(ExtensionClassLoader):자바 의 확장 라 이브 러 리 를 불 러 옵 니 다.자바 가상 컴퓨터 의 구현 은 확장 라 이브 러 리 디 렉 터 리 를 제공 합 니 다.이 종류의 로 더 는 이 디 렉 터 리 에서 자바 류 를 찾 아 불 러 옵 니 다.
  • 응용 프로그램 클래스 로 더(ApplicationClassLoader):자바 응용 클래스 경로(CLASSPATH)에 따라 자바 류 를 불 러 옵 니 다.일반적으로 자바 응용 종 류 는 로 딩 을 완료 합 니 다.ClassLoader.getSystemClassLoader() 을 통 해 얻 을 수 있 습 니 다.일반적으로 사용자 정의 클래스 로 더 가 없 으 면 기본적으로 이 로 더 를 사용 합 니 다.
  • 사용자 정의 클래스 로 더 는 java.lang.ClassLoader 클래스 를 계승 하 는 방식 으로 이 루어 질 수 있 습 니 다.

  • 한편,하나의 클래스 로 딩 과정 에서 하나의 클래스 로 딩 요청 을 받 았 을 때 이 클래스 를 직접 불 러 오지 않 고 이 요청 을 자신의 부모 클래스 로 딩 에 위임 합 니 다.맨 위 에 있 는 시작 클래스 로 딩 이 완료 되 지 않 을 때 만 부모 로 딩 이 완료 되 지 않 을 때 만 이 로 딩 요청 을 수행 할 수 있 습 니 다.클래스 를 불 러 오 려 고 시도 합 니 다.이런 모델 은 바로 부모 위임 모델 이다.이런 모델 의 장점 은 유형 을 차원 적 으로 구분 하고 안전 도 보장 할 수 있다.
    총결산
    이 글 은 여기까지 입 니 다.만약 이 글 이 당신 에 게 도 도움 이 된다 면,당신 은 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기