자바 의 배열 과 동적 배열
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.