자바 의 배열 과 동적 배열

int[] x1 = new int[100];
int[] x2;
x2 = new int[100];

int[] x3 = new int[] { 1, 2, 3 };
int[][] x4;
x4 = new int[2][];
x4[0] = new int[1];
x4[1] = new int[2];

int x5[][] = new int[1][];
//  NullPointerException,           ,    null
//System.out.println(x5[0].length);
int x6[][] = new int[][] { { 1 }, { 2, 3 } };

int x7[][] = { { 1 }, {} };
//          
x7[1] = new int[] { 2, 3, };
//  ArrayIndexOutOfBoundsException,            
// ,      ,      x7,         。
x7[2] = new int[] { 2 };

1.배열 은 대상 이 고 Object 에서 계승 합 니 다.new Object[0].getClass().getSuperClass()는 Object.class 로 Object 보다 한 명의 구성원 변수 length 가 많 고 Public 이 어야 합 니 다.2.java.lang.reflect.Array 는 final 이기 때문에 배열 은 하위 클래스 가 아 닐 것 입 니 다.이 종 류 는 동적 으로 배열 을 만 들 거나 배열 을 조작 하 는 데 사 용 됩 니 다(길이 획득 등).3.java.util.Arrays 는 배열 작업 응용 류 로 주로 정렬,채 우기,검색 등 으로 나 뉜 다.메모:정렬 은 빠 른 정렬 을 사용 합 니 다.시간 복잡 도 는 o(n*log(2^n)입 니 다.배열 정렬 을 하려 면 Arrays 가 가장 좋 습 니 다.4.배열 에 대응 하 는 클래스 파일 이 없습니다.String 은 String.class 에 대응 하지만 배열 은 없습니다.그리고 그들의 클래스 이름 은 매우 이상 합 니 다.이렇게 new int[2].getClass().getName()을 얻 을 수 있 습 니 다.이것 은 다른 대상 과 가장 큰 차이 점 이다.왜냐하면 배열 류 는 운행 할 때 생 성 되 기 때문이다.다음 방법 을 통 해 MyClass[]의 Class 인 스 턴 스 를 얻 을 수 있 습 니 다:arr.getClass()또는 MyClass[].class.이렇게 하면 나 는 수조 류 안 을 엿 볼 수 있다.Class clazz = MyClass[].class; System.out.println(clazz.getConstructors().length); 인쇄 된 결 과 는 0 입 니 다.배열 류 는 확실히 구조 방법 이 없다 는 것 을 증명 한다.clazz.newInstance()를 강제로 실행 하면;다음 과 같은 실 수 를 하 게 될 겁 니 다.java.lang.InstantiationException: [Larraytest.MyClass; 배열 류 가 일반적인 반사 방식 을 통 해 인 스 턴 스 를 만 들 수 없다 는 것 을 증명 합 니 다.배열 류 의'여산 의 진면목'을 살 펴 보 자.System.out.println(clazz);출력 은:[Larraytest.MyClass System.out.println(int[].class.getName());/[I System.out.println(int[][].class.getName());//[[I.자바 Class 파일 구 조 를 조금 만 정리 하면 알 수 있 습 니 다.이 문자열 은 하나의 요소 유형 이 arraytest.MyClass 의 1 차원 배열 이라는 뜻 입 니 다.즉,배열 유형 은 일반 클래스 와 마찬가지 로 하나의 전체 한정 경로 명+클래스 명 으로 자신의 유일한 표 시 를 하 는 것 이 아니 라 배열 의 class 문자열 은[하나 또는 여러 개의 L 을 추가 하고 배열 요소 류 의 전체 한정 경 로 를 추가 하 며 유형 명 을 추가 하여 유일 하 게 표시 하 는 것 이다.배열 의 Class 클래스 인 스 턴 스 는 자바 가상 컴퓨터 가 동적 으로 동적 으로 불 러 오 는 것 으로 그 구 조 는 일반 자바 류 의 Class 인 스 턴 스 와 약간 다르다.배열 의 Class 클래스 인 스 턴 스 에 대해 서도 이상 한 현상 이 있 습 니 다.코드 자바.lang.reflect.Field fieldarr=clazz.getField("length")를 실행 하고 있 습 니 다.이 때 이상 을 던 집 니 다:java.lang.NoSuchFieldException:length.이것 은 배열 류 에 length 라 는 도 메 인 이 없다 는 것 을 말 하 는 것 같 습 니 다.이 도 메 인 은 사실 우리 가 가장 많이 사용 하 는 것 입 니 다(즉,이 도 메 인 은 반드시 존재 합 니 다).자바 배열 은 최대 255 차원 에 불과 하 다.
우 리 는 유형 과 유형 을 구분 해 야 한다.배열 이 유형 이 라 고 확신 할 수 있 지만 결코 유형 이 아니다.유형 은 컴 파일 러 와 관련 된 개념 으로 추상 성 은 대상 을 대상 으로 하 는 것 과 무관 하 다.클래스 는 대상 을 대상 으로 하 는 개념 이다.그들 은 더 이상 같은 등급 이 아니다.int,byte 는 모두 유형 이 고 상대 적 인 Class 에 대응 하 며 시스템 도 대응 하 는 포장 류 를 제공 합 니 다.그러나 주의해 야 할 것 은 그들의 밑바닥 실현 과 조작 은 모두 native 이다.대상 을 대상 으로 하 는 것 과 상 관 없 이 우 리 는'내장 대상'이 라 고 볼 수 있다.그들 은 c 로 이 루어 졌 고 반사 와 Proxy 도 마찬가지 이다.따라서 클래스 는 클래스 가 아 닌 모든 유형 을 취 할 수 있 습 니 다.이 클래스 자체 의 조작 도 모두 native 입 니 다.이런 의미 에서 Object 클래스 자체 도 대상 을 대상 으로 하 는 의미 가 아 닙 니 다.이런 점 에서 우 리 는 배열 이 같은 부류 가 아 닌 것 처럼 보인다 고 말 할 수 있다.문법 과 실현 방식 에 있어 서 배열 은 같은 종류 가 아니다.가상 컴퓨터 규범 과 바 텀 에서 이 루어 지 는 배열 은 유사 한 대상 이다.자바 에서 배열 은 완전한 의미 의 대상 입 니 다.그 는 대상 과 마찬가지 로 더미 에 저장 되 어 있 으 며,Class 류 인 스 턴 스 를 가리 키 는 참조 가 있 습 니 다.모든 같은 차원 과 유형의 배열 은 같은 Class 를 가지 고 있 으 며 배열 의 길 이 는 고려 하지 않 습 니 다.Class 에 대응 하 는 이름 은 차원 과 유형 을 표시 합 니 다.예 를 들 어 전체 데이터 의 Class 는"[I"이 고 바이트 형 3 차원 배열 Class 는"[B"이 며 2 차원 대상 데이터 Class 는"[Ljava.lang.Object"입 니 다.동적 으로 배열 을 만 드 는 절 차 는 다음 과 같 습 니 다.1.Class 대상 을 만 들 고 forName(String)방법 으로 배열 요소 의 종 류 를 지정 합 니 다.2、Array.newInstance(Class,length 호출of_array)동적 으로 배열 을 만 듭 니 다.동적 배열 요 소 를 방문 하 는 방법 은 일반적으로 다 릅 니 다.이 방법 은 Object 대상:Array.get(array Object,index)을 되 돌려 줍 니 다.동적 배열 요소 에 값 을 부여 하 는 방법 도 일반적인 것 과 다 릅 니 다.그 형식 은 다음 과 같 습 니 다.마지막 매개 변 수 는 Object 형식 이 어야 합 니 다.Array.set(array Object,index,object).동적 배열 Array 는 1 차원 배열 만 만 들 수 있 는 것 이 아니 라 다 차원 배열 도 만 들 수 있 습 니 다.절 차 는 다음 과 같다.1.성형 배열 을 정의 한다.예 를 들 어 int[]dims=new int{5,10,15};3 차원 배열 2 를 지정 하고 Array.newInstance(Class,dims)를 호출 합 니 다.지정 한 차원 의 배열 을 만 들 고 다 차원 동적 배열 에 접근 하 는 방법 은 1 차원 배열 에 접근 하 는 방식 과 크게 다 르 지 않 습 니 다.여러 번 나 누 어 가 져 올 뿐 매번 꺼 내 는 것 은 하나의 Object 입 니 다.마지막 까지 할당 도 마찬가지 입 니 다.동적 배열 Array 는 일반적인 배열 로 전환 할 수 있 습 니 다.예 를 들 어 Array arry=Array.new Instance(Integer.TYPE,5);int arrayCast[] = (int[])array;
//----        
Class<?> classType = Class.forName("java.lang.String");
//        10      
Object array = Array.newInstance(classType, 10);
//       5     "hello"
Array.set(array, 5, "hello");
//        5     
String s = (String) Array.get(array, 5);

//----        
int[] dims = new int[] { 5, 10, 15 };
//                     。
Object array = Array.newInstance(Integer.TYPE, dims);
System.out.println(array.getClass().getName());//[[[I
//getLength         , 3       5
System.out.println(Array.getLength(array));//5
//         3 ,     
Object arrayObj = Array.get(array, 3);
System.out.println(arrayObj.getClass().getName());//[[I
// getComponentType:           Class,         ,      null
Class<?> cls = arrayObj.getClass().getComponentType();
System.out.println(cls.getName());//[I
//    3   5 ,     
arrayObj = Array.get(arrayObj, 5);
//    3  5   10   ,    37
Array.setInt(arrayObj, 10, 37);
//    3  5   10   
System.out.println(Array.getInt(arrayObj, 10));//37
//             :          
int arrayCast[][][] = (int[][][]) array;
System.out.println(arrayCast[3][5][10]);//37

 
---------------------------------------------------------------------------------
배열 변환
 
//----A B   
/*
 *         ,  short       int, short  int   
 *             ,         
 */
//int[] intArr = new short[0];
/*
 *         ,  B A   ,         ,     
 */
A[] aArr = new B[1];
B[] bArr = (B[]) aArr;//         
aArr = new A[1];
//	bArr = (B[]) new A[1];//      
Object[] oArr = new A[1];
System.out.println(oArr.getClass().getName());//[LA;
//        
Object o = new A[1];
//      Object           ,           
System.out.println(o.getClass().getName());//[LA;
aArr = (A[]) o;//        ,  o   A    

좋은 웹페이지 즐겨찾기