JAVA 기초 정리 (3)

9499 단어 자바
1. 포장 류 및 자동 분해 포장int a1= 1000;int a2=1000;if(a1==a2){System.out.println("yes");}

= = 의 비교, 기본 데이터 형식 은 값 이 같 는 지, 참조 데이터 형식 은 대상 인지 (주소 가 같 는 지)     Integer a=1377;
    Integer b=1377;
    if(a==b){
        System.out.println("yes");
    }

포장 할 때 자동 으로 Integer 의 value Of (int) 방법 을 호출 합 니 다.상 자 를 뜯 을 때 자동 으로 호출 되 는 것 은 Integer 의 intValue 방법 입 니 다.public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);

}
포장 함수 valueof 에서 알 수 있 듯 이 - 128 ~ 127 사이 의 정 수 는 Integer Cache 캐 시 가 있어 서 새로운 대상 을 만 들 지 않 습 니 다.
면접 문제:public class Main {
public static void main(String[] args) {

    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;

    System.out.println(i1==i2);
    System.out.println(i3==i4);
}

}
int 형 이 라면 100 은 새로운 대상 을 만 들 지 않 습 니 다. 200 회 이지 만 부동 소수점 형 은 다 릅 니 다. double 의 value of 소스 코드 를 보 세 요. public static Double valueOf(String s) throws NumberFormatException {
    return new Double(parseDouble(s));
}

바로 새로운 대상 이 생 겼 어 요.(double 의 수 는 범위 가 너무 넓 기 때문에 - 128 ~ 127 사이 에 거의 무수 한 숫자 가 있다)
요약:
Integer, Short, Byte, Character, Long 등 몇 가지 value of 방법의 실현 은 유사 하 다.
Double, Float 의 value of 방법의 실현 은 유사 하 다.
'= =' 연산 자의 두 조작 수 는 모두 포장 기 형식의 인용 이 고 같은 대상 을 가리 키 는 지 비교 하 는 것 입 니 다. 그 중에서 하나의 조작 수가 표현 식 (즉 산술 연산 포함) 이 라면 수치 (즉, 자동 으로 상 자 를 뜯 는 과정 을 촉발 할 수 있 습 니 다) 를 비교 합 니 다.public class Main {
public static void main(String[] args) {

    Integer a = 1;
    Integer b = 2;
    Integer c = 3;
    Integer d = 3;
    Integer e = 321;
    Integer f = 321;
    Long g = 3L;
    Long h = 2L;

    System.out.println(c==d); //       ,true
    System.out.println(e==f);//        ,false
    System.out.println(c==(a+b));//a+b   ,     ,true
    System.out.println(c.equals(a+b));equals      ,         ,       ,        true
    System.out.println(g==(a+b));true      
    System.out.println(g.equals(a+b));      ,               new        ,false
    System.out.println(g.equals(a+h));    long  ,   longvalueof  ,   -128~127      ,true
}

}
2.string,stringbuilder,stringbuffer
2.1String 클래스: (가 변 시퀀스)
(1)final char value[]; 하나의 문자열 배열 로 구성 되 어 있 으 며, final 수식 이 므 로 변 하지 않 습 니 다.
(2) 안의 일부 문자열 작업 방법 은 모두 새로운 문자열 을 되 돌려 주 었 습 니 다. 원본 함수 substring 을 보 세 요.public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > value.length) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);//new     string   
}

여기 서 한 가 지 를 영원히 기억 해 야 한다.
"String 대상 에 대한 어떠한 변화 도 원래 대상 에 영향 을 주지 않 으 며, 관련 된 어떠한 change 작업 도 새로운 대상 을 생 성 합 니 다."     String s1="hello";
    String s2="hello";
    System.out.println(s1==s2);// true,hello      ,      
    String s3=new String("hello");
    System.out.println(s1==s3);//false//new        。

(2) stringbuilder 클래스 public StringBuilder append(String str) {
    super.append(str);
    return this;//          。
}

StringBuilder 와 StringBuffer 류 가 가지 고 있 는 구성원 속성 과 구성원 방법 은 기본적으로 같 습 니 다. 차이 점 은 StringBuffer 류 의 구성원 방법 앞 에 하나의 키 워드 를 추가 한 것 입 니 다. synchronized, 더 말 할 필요 도 없 이 이 키 워드 는 다 중 스 레 드 에 접근 할 때 안전 보호 역할 을 합 니 다. 즉, StringBuffer 는 스 레 드 가 안전 합 니 다.그래서 보통 stringbuilder 는 많이 사용 합 니 다.
직접 추가 문자열 에 대해 효율 이 높 습 니 다. 컴 파일 러 에서 값 을 확 정 했 기 때 문 입 니 다. 즉, 'I' + 'love' + '자바' 와 같 습 니 다.의 문자열 을 더 하면 컴 파일 기간 에 'Ilovejava' 로 최적화 되 었 습 니 다.
간접 추가 (즉 문자열 참조 포함), 예 를 들 어 s1 + s2 + s3;컴 파일 러 에 서 는 인용 변 수 를 최적화 하지 않 기 때문에 효율 이 직접적 으로 낮 습 니 다.
String, StringBuilder, StringBuffer 의 실행 효율:
StringBuilder > StringBuffer > String
물론 이것 은 상대 적 인 것 이지 모든 상황 에서 다 그런 것 은 아니다.
예 를 들 어 String str = "hello" + "World" 의 효율 은 StringBuilder st = new StringBuilder (). append ("hello"). append ("World") 보다 높다.
따라서 이 세 가지 유형 은 각각 장단 점 이 있 으 므 로 서로 다른 상황 에 따라 선택 하여 사용 해 야 한다.
문자열 을 추가 하거나 변경 이 적은 경우 String str = "hello" 형식 을 사용 하 는 것 을 권장 합 니 다.
문자열 추가 작업 이 많은 경우 StringBuilder 를 사용 하고 다 중 스 레 드 를 사용 하면 StringBuffer 를 사용 하 는 것 을 권장 합 니 다.
몇 개의 면접 문제:
1. 다음 코드 의 출력 결 과 는 무엇 입 니까?
String a = “hello2″;   String b = “hello” + 2;   System.out.println((a == b));
출력 결 과 는 true 입 니 다. 이 유 는 간단 합 니 다. 'hello' + 2 는 컴 파일 기간 에 'hello 2' 로 최적화 되 었 기 때문에 실행 기간 에 변수 a 와 변수 b 는 같은 대상 을 가리 키 고 있 습 니 다.
2. 다음 코드 의 출력 결 과 는 무엇 입 니까?
String a = “hello2″;   String b = “hello”; String c = b + 2; System.out.println((a == c));
출력 결 과 는 false 입 니 다. 기호 참조 가 존재 하기 때문에 String c = b + 2; 컴 파일 기간 에 최적화 되 지 않 고 b + 2 를 문자 상수 로 처리 하지 않 습 니 다. 따라서 이러한 방식 으로 생 성 된 대상 은 사실상 더미 에 저 장 됩 니 다. 따라서 a 와 c 가 가리 키 는 대상 은 같은 대상 이 아 닙 니 다.
3. 다음 코드 의 출력 결 과 는 무엇 입 니까?
String a = “hello2″;   final String b = “hello”; String c = b + 2; System.out.println((a == c));
출력 결 과 는: true 입 니 다. final 로 수 정 된 변 수 는 class 파일 상수 풀 에 복사 본 을 저장 합 니 다. 즉, 연결 을 통 해 접근 하지 않 고 final 변수 에 대한 접근 은 컴 파일 기간 에 실제 값 으로 대 체 됩 니 다. 그러면 String c = b + 2; 컴 파일 기간 에 String c = "hello" + 2 로 최 적 화 됩 니 다.
4. 다음 코드 출력 결 과 는:public class Main { public static void main(String[] args) { String a = "hello2" ; final String b = getHello(); String c = b + 2 ; System.out.println((a == c)); } public static String getHello() { return "hello" ; }``}
출력 결 과 는 false 입 니 다. 이 안 에는 b 를 final 로 수 정 했 지만 할당 값 은 방법 을 통 해 호출 되 었 기 때문에 실행 기간 에 만 확인 할 수 있 습 니 다. 따라서 a 와 c 가 가리 키 는 것 은 같은 대상 이 아 닙 니 다.
5. 다음 코드 의 출력 결 과 는 무엇 입 니까?public class Main { public static void main(String[] args) { String a = "hello" ; String b = new String( "hello" ); String c = new String("hello" ); String d = b.intern(); System.out.println(a==b); System.out.println(b==c); System.out.println(b==d); System.out.println(a==d); } }
이 안 에는 String. intern 방법의 사용 이 포함 되 어 있 습 니 다. String 클래스 에서 intern 방법 은 로 컬 방법 입 니 다. JAVA SE6 이전에 intern 방법 은 런 타임 풀 에서 같은 내용 의 문자열 이 있 는 지 찾 습 니 다. 존재 하면 이 문자열 을 가리 키 는 인용 을 되 돌려 줍 니 다. 존재 하지 않 으 면 이 문자열 을 풀 에 넣 고 이 문자열 을 가리 키 는 문자열 을 되 돌려 줍 니 다.인용. 따라서 a 와 d 는 같은 대상 을 가리 키 고 나머지 는 false 입 니 다.
6. String str = new String ("abc") 은 몇 개의 대상 을 만 들 었 습 니까?
이 문 제 는 많은 책 에서 예 를 들 어 을 언급 했다. 예 를 들 어 국내 대기업 의 필기시험 면접 문 제 를 포함 하여 대부분 인터넷 에 떠 도 는 것 과 일부 면접 책 에서 2 개의 대상 이 라 고 말 하 는 것 은 단편 적 인 것 이다.
모 르 는 부분 이 있 으 면 이 댓 글 을 참고 하 세 요.
프로그래머 면접 보전
먼저 대상 을 만 드 는 의 미 를 알 아야 합 니 다. 만 드 는 것 이 언제 만 들 어 졌 습 니까? 이 코드 는 실행 기간 에 두 개의 대상 을 만 들 수 있 습 니까? 불가능 합 니 다.
new 는 한 번 만 호출 한 것 이 분명 하 다. 즉, 하나의 대상 만 만 만 들 었 다 는 것 이다.
이 문제 가 헷 갈 리 는 점 은 바로 여기 입 니 다. 이 코드 는 실행 기간 에 하나의 대상 만 만 만 들 었 습 니 다. 즉, 쌓 여 있 는 'abc' 대상 을 만 들 었 습 니 다.왜 모두 가 두 개의 대상 이 라 고 말 하고 있 습 니까? 이 안에 하나의 개념 을 밝 혀 야 합 니 다. 이 코드 의 실행 과정 과 유형의 로드 과정 은 차이 가 있 습 니 다.클래스 를 불 러 오 는 과정 에서 실행 시 상 당량 탱크 에 'abc' 대상 을 만 들 었 고 코드 실행 과정 에서 String 대상 만 만 만 들 었 습 니 다.
따라서 이 문 제 를 String str = new String (abc) 으로 바 꾸 면 몇 개의 String 대상 과 관련 이 있 습 니까?합 리 적 인 해석 은 두 가지다.
개인 적 으로 면접 을 볼 때 이 질문 에 부 딪 히 면 면접 관 에 게 '이 코드 를 수행 하 는 과정 에서 몇 개의 대상 을 만 들 었 는 지, 몇 개의 대상 을 만 들 었 는 지' 구체 적 인 것 에 따라 대답 할 수 있다 고 생각 합 니 다.
7. 아래 코드 1) 과 2) 의 차 이 는 무엇 입 니까?public class Main { public static void main(String[] args) { String str1 = "I" ; //str1 += "love"+"java"; 1) str1 = str1+ "love" + "java" ; //2) }``}
1) 효율 은 2) 보다 높 습 니 다. 1) 의 "love" + "자바" 는 컴 파일 기간 에 "love 자바" 로 최적화 되 며, 2) 의 것 은 최적화 되 지 않 습 니 다.
3. Date 클래스
4. Calendar 클래스
5. Dateformat 클래스
6. simpledateformat 클래스
7. exception 정리

좋은 웹페이지 즐겨찾기