자바,너 몰래 하 는 거.

35567 단어 javaSE
프로 그래 밍 을 할 때 jdk 가 기본적으로 하 는 일 들 을 모 르 면 이해 하기 어 려 운 것들 이 있 습 니 다.예 를 들 어 Integer 의 자동 봉인 을 뜯 는 것 은 매우 힘 들 것 입 니 다.
역 컴 파일 도구 제 가 사용 하 는 것 은 JDK 1.5 중 입 니 다.높 은 버 전에 서 클래스 의 기본 계승 을 볼 수 없습니다.
이것 은 기본 클래스 의 소스 파일 입 니 다.
public class Demo {
	public static void main(String[] args) {
		System.out.println("HelloWorld!");
	}
}

역 컴 파일 후의
# javap -c Demo
Compiled from "Demo.java"
public class Demo extends java.lang.Object{
public Demo();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String helloWorld!
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

}

역 컴 파일 후 볼 수 있 습 니 다.
  • 사용자 정의 클래스 는 기본적으로 계승java.lang.Object합 니 다.이것 도 Object 가 다 중 태 를 이용 하여 임의의 대상 을 받 아들 일 수 있 는 이유 입 니 다
  • 한 가지 유형 에서 기본 적 으로 구조 방법 이 있 는데 그의 기본 적 인 실현 은 아버지 류 에 호출 된 빈 구조 방법
  • 이다.
  • 구조 방법 을 사용자 정의 하면 jdk 는 빈 구 조 를 기본 으로 하지 않 습 니 다
  • 구조 방법 중super(...)은 반드시 첫 번 째 줄 코드 임 에 주의해 야 한다.쓰 지 않 더 라 도super(...)그녀 는 부모 류 의 빈 구 조 를 기본 으로 호출 할 것 이다
  • .
    다음은 소스 코드 를 보 겠 습 니 다.
    import java.util.Arrays;
    import java.util.List;
    
    public class Demo {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("Java", "JavaME", "JavaSE", "JavaEE");
            String data = "";
            for (String s : list) {
                data += s + ",";
            }
            System.out.println(data);
        }
    }
    

    역 컴 파일 후의 결 과 는?
    # javap -c Demo
    Compiled from "Demo.java"
    public class Demo extends java.lang.Object{
    public Demo();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."":()V
       4:   return
    
    public static void main(java.lang.String[]);
      Code:
       0:   iconst_4
       1:   anewarray       #2; //class java/lang/String
       4:   dup
       5:   iconst_0
       6:   ldc     #3; //String Java
       8:   aastore
       9:   dup
       10:  iconst_1
       11:  ldc     #4; //String JavaME
       13:  aastore
       14:  dup
       15:  iconst_2
       16:  ldc     #5; //String JavaSE
       18:  aastore
       19:  dup
       20:  iconst_3
       21:  ldc     #6; //String JavaEE
       23:  aastore
       24:  invokestatic    #7; //Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
       27:  astore_1
       28:  ldc     #8; //String
       30:  astore_2
       31:  aload_1
       32:  invokeinterface #9,  1; //InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
       37:  astore_3
       38:  aload_3
       39:  invokeinterface #10,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
       44:  ifeq    86
       47:  aload_3
       48:  invokeinterface #11,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
       53:  checkcast       #2; //class java/lang/String
       56:  astore  4
       58:  new     #12; //class java/lang/StringBuilder
       61:  dup
       62:  invokespecial   #13; //Method java/lang/StringBuilder."":()V
       65:  aload_2
       66:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       69:  aload   4
       71:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       74:  ldc     #15; //String ,
       76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       79:  invokevirtual   #16; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
       82:  astore_2
       83:  goto    38
       86:  getstatic       #17; //Field java/lang/System.out:Ljava/io/PrintStream;
       89:  aload_2
       90:  invokevirtual   #18; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       93:  return
    
    }
    

    역 컴 파일 에서 볼 수 있다.
  • 문자열 맞 춤 법
  • 소량의 문자열 을 연결 할 때 jdk 는 기본적으로 String Builder 로 전환 합 니 다.이것 도 소량의 문자열 을 연결 할 때 String 대상 을 사용 할 수 있 는 이유 입 니 다
  • 사용 시for (String s : list) {}
  • 인터페이스 에 기본적으로 호출 되 는 방법java.util.Iterator
  • 저 희 는 사용자 정의 클래스 를 사용 하려 면 두 가지 조건 을 만족 시 켜 야 합 니 다.
  • 은 집합 구조 중의 일원
  • 이다.
  • 사용자 정의 실현Iterator중의 방법


  • 사용자 정의 매 거 진 클래스
    public enum Demo {
    
        SUCCESS(0, "  "),
        ERROR(1, "  ");
    
        private Integer code;
        private String msg;
    
        Demo(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
    }
    

    역 컴 파일 매 거 후 볼 수 있 습 니 다.
    # javap Demo
    Compiled from "Demo.java"
    public final class Demo extends java.lang.Enum{
        public static final Demo SUCCESS;
        public static final Demo ERROR;
        public static final Demo[] values();
        public static Demo valueOf(java.lang.String);
        static {};
    }
    

    역 컴 파일 결과 에서 볼 수 있 습 니 다.
  • 매 거 진 종 류 는 실제 적 으로 플러스final클 라 스 가 기본 적 으로 계승 할 것 이다java.lang.Enum
  • 매 거 진 유형 마다 Public static final 대상
  • 으로 전 환 됩 니 다.
    사용자 정의 주석
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Demo {
    
        String value();
    
    }
    

    역 컴 파일 결과
    # javap Demo
    Compiled from "Demo.java"
    public interface Demo extends java.lang.annotation.Annotation{
        public abstract java.lang.String value();
    }
    

    역 컴 파일 결과 에서 볼 수 있다.
  • 주해 회 묵인 상속java.lang.annotation.Annotation
  • 하나의 속성 은 추상 적 인 방법
  • 이다.
    상식 이 좀 있어 요.
  • Java기본 가 져 오기java.lang패키지
  • 이 자동 가 져 오기 로 인해 우 리 는Integer,Object,System등 종 류 를 사용 할 때 수 동 가이드 백
  • 이 필요 하지 않 습 니 다.
  • System.out.println();시 대상 에 기본적으로 호출 되 는toString();방법
  • HashSet저장 할 때 대상 에 기본적으로 호출 되 는hashCode()::equals()방법
  • HashSet요소 의 중복 을 판단 할 때hashCode()의 hash 알고리즘 을 통 해 중복 되 지 않 는 데 이 터 를 선별 했다
  • .
  • hash 값 이 같 을 때equals()의 도움 을 받 아 중복 여 부 를 판단 하고 중복 되면 입력 하지 않 습 니 다
  • 왜 두 가지 방법 으로 중복 여 부 를 판단 하 는 지 여 기 는 hash 알고리즘 의 한 특징 입 니 다.HashMap에서 hash 값 이 같 지 않 으 면 hash 표 에서 하나의 hash 체인
  • 을 형성 합 니 다.
  • TreeSet저장 할 때 요소 실현Comparable인 터 페 이 스 를 요구한다.
  • TreeSet나무 모양 구 조 를 사용 하여java.lang.Comparable#compareTo방법의 반환 값
  • 을 사용 해 야 한다.
  • 원소 의 중복 여 부 를 되 돌려 서 결정 한다.[0 ,<0 ,>0 ]

  • Integer 의 자동 패키지 와 catch
    먼저 소스 코드 를 보 겠 습 니 다.
    Integer val1 = 1;
    Integer val2 = 1;
    System.out.println(val1 == val2);
    
    Integer val3 = 996;
    Integer val4 = 996;
    System.out.println(val3 == val4);
    

    역 컴 파일 결과
    # javap -c Demo
    Compiled from "Demo.java"
    public class Demo {
      public Demo();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: iconst_1
           1: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           4: astore_1
           5: iconst_1
           6: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           9: astore_2
          10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
          13: aload_1
          14: aload_2
          15: if_acmpne     22
          18: iconst_1
          19: goto          23
          22: iconst_0
          23: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
          26: sipush        996
          29: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          32: astore_3
          33: sipush        996
          36: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          39: astore        4
          41: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
          44: aload_3
          45: aload         4
          47: if_acmpne     54
          50: iconst_1
          51: goto          55
          54: iconst_0
          55: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
          58: return
    }
    
  • Integer 유형 에서 자동 으로 포장 을 뜯 는 것 은 실제로Integer.valueOf()방법
  • 을 사용 했다.
  • 우 리 는valueOf()의 소스 코드 를 통 해 Integer-128~127캐 시
  • 를 이해 할 수 있다.
    Integer.valueOf()의 실현
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    Integer 캐 시 핵심 구현
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
    
        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;
    
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
    
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }
    
        private IntegerCache() {}
    }
    

    좋은 웹페이지 즐겨찾기