추상:
이 글은 주로 Java의 배열에 대한 지식을 설명하고 있으며, 주로 배열은 배열과 컨테이너, 배열 생성과 초기화, 배열과 제네릭, 배열과 변수 매개변수목록, 배열 도구 클래스의 실제 기능 등 다섯 가지 측면에서 자세히 논의됩니다. 설명 및 요약.
어레이 및 컨테이너
생성 및 생성 배열 초기화
배열 및 일반
배열 및 변수 매개변수 목록
배열 도구 클래스 실용적인 기능 요약
Java에서는 배열과 컨테이너를 모두 객체 를 담을 수 있는데 배열과 컨테이너의 차이점은 무엇일까요? 객체를 보관해야 할 때 어떤 상황에서 배열에 우선순위를 두어야 하며, 어떤 상황에서 컨테이너에 우선순위를 두어야 할까요?
Java 초기 버전에서는 고정 크기 배열이 절대적으로 필요했는데, 이는 Java 디자이너가 Java에 기본 유형을 포함하고 일부 성능 기반 고려 사항을 고려했을 뿐만 아니라 초기 버전 때문이기도 했습니다. 컨테이너에 대한 지원이 거의 없습니다. 따라서 초기 버전의 Java에서는 특히 다음 세 가지 측면에서 배열을 포함하도록 선택하는 것이 항상 합리적입니다.
효율성
Java에서는 배열은 객체참조의 시퀀스를 저장하고 무작위로 액세스하는 가장 효율적인 방법입니다. 배열은 요소 액세스를 매우 빠르게 만드는 간단한 선형 시퀀스입니다. 그러나 이 속도에 대한 대가는 배열 객체의 크기가 고정되어 있고 수명 동안 변경할 수 없다는 것입니다. ArrayList는 자동 공간 할당을 실현할 수 있고 더 유연하기 때문에 일반적으로 배열보다 ArrayList를 선호해야 하지만 이러한 유연성에는 오버헤드가 발생합니다. 따라서 ArrayList는 배열보다 훨씬 덜 효율적입니다.
Type
JDK 1.5 이전에는 Java에 제네릭이 도입되지 않았습니다. 따라서 개체를 처리할 때 제네릭 이전의 컨테이너 클래스는 해당 개체를 특정 유형이 없는 것으로 처리합니다. 즉, 이러한 개체는 Object로 처리됩니다. 제네릭보다 배열이 컨테이너보다 나은 이유는 특정 유형을 보유하는 배열을 만들 수 있기 때문입니다. 즉, 컴파일 타임 유형 검사를 통해 잘못된 유형이 삽입되거나 부적절한 유형이 추출되는 것을 방지할 수 있습니다. 물론 Java는 컴파일 타임과 런타임 모두에서 객체에 부적절한 메시지를 보내는 것을 방지합니다. 따라서 어떤 방법이 덜 안전한 것이 아니라, 컴파일 중에 오류를 지적할 수 있다면 더 우아할 것입니다.
기본 유형을 저장하는 기능
배열은 기본 유형을 담을 수 있지만 제네릭 이전의 컨테이너는 담을 수 없습니다.
JDK 1.5 이후 Java에서는 제네릭 및 자동 패키징 메커니즘을 도입했습니다(제네릭은 유형이 안전한 컨테이너의 생성을 보장할 수 있고 자동 패키징 메커니즘은 컨테이너가 기본 유형을 보유할 수 있도록 허용함). 이는 성능을 제외한 모든 측면에서 오늘날의 컨테이너를 왜소한 배열로 만듭니다. 또한 제네릭은 배열에 큰 위협이 되며 일반적으로 둘을 잘 결합할 수 없습니다. (매개변수화된 유형의 배열은 인스턴스화할 수 없습니다) .
따라서 최신 Java 버전 을 사용하여 을 프로그래밍할 때 은 배열보다 컨테이너를 선호해야 합니다. 성능이 문제이고 어레이로 전환하면 성능에 도움이 된다는 것이 입증된 경우에만 어레이를 사용하도록 프로그램을 리팩터링해야 합니다.
1. 배열 기본
배열 식별자는 reference 힙에 생성된 실제 객체를 가리키는 이 객체는 다른 객체에 대한 참조 또는 기본 유형의 값을 저장하는 데 사용됩니다. 배열을 직접 저장합니다.
"[ ]" 구문은 배열 객체에 액세스하는 유일한 방법입니다. > 2. 생성 및 초기화
는 배열 초기화의 일부로 암시적으로 생성됩니다
String[] strs = { ... }; // 创建方式 1 --- 花括号内对象的个数就是数组大小System.out.println(strs.length); // 输出 0
String[] strs = new String[5]; //创建方式 2String[] ss = new String[]{ ... }; //创建方式 3
3을 사용하여 명시적으로 생성 . 다차원 배열
다차원 배열의 본질: 배열의 요소는 여전히 배열입니다
// 创建方式 1int[][] a = { { 1, 2, 3, }, { 4, 5, 6, }, }; // 创建方式 2int[][][] a = new int[2][2][4];//粗糙数组:每个向量具有任意长度Random rand = new Random(47); // 3-D array with varied-length vectors: int[][][] a = new int[rand.nextInt(7)][][]; for(int i = 0; i < a.length; i++) { a[i] = new int[rand.nextInt(5)][]; for(int j = 0; j < a[i].length; j++) a[i][j] = new int[rand.nextInt(5)]; }
배열과 제네릭은 잘 결합할 수 없습니다. 즉, 매개변수화된 유형의 배열은 인스턴스화할 수 없습니다.
T[] first = new T[3]; // ERROR A<String>[] arrays = new A<String>[4]; // ERROR: Cannot create a generic array of A<String>
는 일반 배열 참조를 생성할 수 있습니다.
A<String>[] arrays; // OK
배열은 공변적입니다.
Object[] objs = new String[3]; // OK
즉, 일반 컨테이너는 항상 일반 배열보다 더 나은 선택입니다.
1. 가변 매개변수 유형의 개념
Java SE5에는 가변 매개변수 유형(변수 인수 유형), "Type...args" 형식에서 는 메서드 매개 변수 로만 사용할 수 있습니다. 가변 매개변수 목록은 매개변수의 개수는 불확실하지만 유형은 확실한 상황(java는 가변 매개변수를 배열로 처리함)에 적합합니다. 변수 매개변수 목록은 마지막 항목이어야 한다는 점에 특히 주의해야 합니다(즉, 최대 하나의 가변 매개변수만 지원됩니다). 변수 매개변수 목록이 2개 이상인 경우, 변수 중 하나가 마지막 항목이 아니어야 하므로, 하나의 변수 매개변수만 지원됩니다. 변수 매개변수 목록에 있는 매개변수의 개수가 불확실하기 때문에 뒤에 같은 유형의 매개변수가 있는 경우 자바는 전달된 매개변수가 이전 변수 매개변수에 속하는지 다음 매개변수에 속하는지 구분하지 못하기 때문에 가변 매개변수만 배치할 수 있다. 마지막에 한 항목.
// 代码示例public class TestVarArgus { public static void dealArray(int... intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ dealArray(); dealArray(1); dealArray(1, 2, 3); } }/* Output: 1 1 2 3 *///:~
변수 매개변수 목록에는 다음과 같은 특징이 있습니다.
은 메소드 매개변수 목록 끝에만 나타날 수 있습니다. 🎜>
… >변수 이름, 앞뒤에 공백이 있거나 없음; 변수 매개변수를 사용하여 메소드를 호출하면 컴파일러는 변수 매개변수는 암시적으로 배열을 생성하므로 메서드 본문의 변수 매개변수 목록 에 배열로 액세스할 수 있습니다(컴파일러는 변수 매개변수를 배열로 처리합니다)
2. 가변 매개변수 유형과 배열의 호환성
public class TestVarArgus { public static void dealArray(int... intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } //ERROR : Duplicate method dealArray(int[]) in type TestVarArgus public static void dealArray(int[] intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ dealArray(); dealArray(1); dealArray(1, 2, 3); } }
할 수 없습니다. 변수 매개변수는 배열 유형 매개변수와 호환되지만, 배열 유형 매개변수는 가변 매개변수와 호환되지 않습니다.
// 代码示例 1 : 给参数为可变参数类型的方法传递数组public class TestVarArgus { public static void dealArray(int... intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ int[] intArray = {1, 2, 3}; dealArray(intArray); // OK } }rrree
이 일치하는 이 방법은;
// 代码示例 2 : 给参数为数组类型的方法传递可变参数public class TestVarArgus { public static void dealArray(int[] intArray){ for (int i : intArray) System.out.print(i +" "); System.out.println(); } public static void main(String args[]){ dealArray(1, 2, 3); // ERROR } }
우리에게 친숙한 메인 함수가변 매개변수 유형의 형태로 다시 작성할 수도 있습니다: public static void main(String... args) .
6. 배열 도구 클래스의 실제 기능1. 배열 복사
Function | Introduction | Note |
---|---|---|
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) | 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束 | 若复制对象数组,那么只是复制了对象的引用,而不是对象本身的拷贝(浅复制);该方法不会执行自动包装和自动拆包,所以两个数组必须具有相同的确切类型;须明确自行新建立一个数组对象,作为副本 |
copyOf(T[] original, int newLength) | 复制指定的数组,截取或用 null 填充 | 底层调用的还是 System.arraycopy;返回一个新的数组对象,若新数组的长度超过原数组的长度,则保留数组默认值 |
注意:
对于以上两个方法:
若复制对象数组,那么只是复制了对象的引用,而不是对象本身的拷贝;
这两个方法不会执行自动包装和自动拆包,所以两个数组必须具有相同的确切类型。
2、数组的字符串方式表示
方法: Arrays.toString(Object[] a) / Arrays.deepToString(Object[] a)
作用: 返回指定数组内容的字符串表示形式:前者适用于一维数组,或者适用于多维数组
3、数组的比较
方法: Arrays.equals(Object[] a, Object[] a2) / deepEquals(Object[] a1, Object[] a2) (多维)
作用: 比较两个数组:元素类型相同,元素个数相等,对应位置的元素相同;
注意:
通过对每个元素使用 equals() 作比较来判断;
对于基本类型,使用的是基本类型的包装器类的 equals() 方法(对于 int 类型使用 Integer.equals() 作比较);
使用 equals() 方法比较原则:是不是同一个对象,是不是同一个类型,是不是具有相同的内容。
int[] a1 = new int[10]; int[] a2 = new int[10]; Arrays.fill(a1, 47); Arrays.fill(a2, 47); print(Arrays.equals(a1, a2)); //true
4、数组的排序
使用内置的排序方法,就可以对任意的基本类型数组排序;也可以对任意的对象数组进行排序,只要该对象实现了 Comparable 接口或具有相关联的 Comparator (独立的实现该接口的类)。
方法: Arrays.sort(Object[] a) / Arrays.sort(Object[] a, int fromIndex, int toIndex)
Arrays.sort(T[] a, Comparatorafdb413486077de11f19a9eac0d8049c c) / Arrays.sort(T[] a, int fromIndex, int toIndex, Comparator117c5a0bdb71ea9a9d0c2b99b03abe3e c)
作用: 对数组内元素进行升序排序 (默认)
String[] sa = Generated.array(new String[20], new RandomGenerator.String(5)); // 利用 String 内置的比较器(已实现 Comparable 接口):字典序(大写字母开头的词都放在前面输出,之后才是小写字母开头的词)Arrays.sort(sa); // ... ,WHkjU, YNzbr, bkIna, cQrGs, .... // 利用 Comparator 比较 : Collections.reverseOrder() : 现有顺序的逆序Arrays.sort(sa, Collections.reverseOrder()); // 利用 Comparator 比较 : String.CASE_INSENSITIVE_ORDER : 忽略大小写将单词一起进行排序Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER);
Java 标准类库中的排序算法针对正排序的特殊类型进行了优化 ———— 针对基本类型设计的“快排” 和 针对对象设计的“稳定归并排序”。所以,无需担心排序的性能,除非你可以证明排序部分的确是程序效率的瓶颈。
5、在已排序的数组中查找
若数组已经 排好序,就可以使用该方法执行快速查找;若对未排序的数组使用该方法,将产生不可预料的结果。
方法: binarySearch(Object[] a, Object key) / binarySearch(T[] a, T key, Comparator117c5a0bdb71ea9a9d0c2b99b03abe3e c)
作用: 使用 二分搜索法 来搜索指定数组,以获得指定对象。在进行此调用之前,必须根据元素的自然顺序对数组进行升序排序(通过 sort(Object[]) 方法); 使用二分搜索法来搜索指定数组,以获得指定对象。在进行此调用之前,必须根据指定的比较器(通过 sort(T[], Comparator) 方法)对数组进行多态升序排序。
注意:
对 已经有序 的数组进行查找;
"sort(Object[])"는 "binarySearch(Object[] a, Object key)", "sort(T[], Comparator)"에 해당합니다. BinarySearch(T[] a, T key, Comparator79029acd66acf9dd985b977b8ab9c0f6 c)에 해당합니다.
배열에 중복 요소가 포함된 경우 이 방법은 어떤 요소가 발견되는지 보장할 수 없습니다. 중복 요소 없이 배열을 정렬해야 하는 경우 Tree Set을 사용할 수 있습니다. 정렬을 위해
(정렬 순서 유지) 또는 Linked해시Set(삽입 순서 유지)를 선택하세요. 프로그램에서 병목 현상이 발생하지 않는 한 배열을 직접 유지 관리할 필요는 없습니다. 6. 배열 채우기
은 각 위치를 동일한 값으로만 채울 수 있으며, 객체의 경우 동일한 객체의 참조를 복사하여 채우는 것입니다
7. 배열과 컨테이너 간 변환
을 반환합니다. 지정된 배열에서 지원되는 고정 크기 목록
참고:
결과 목록은 때문에 고정 크기입니다.
lang.UnsupportedOperationException이 발생합니다(선택적 작업). 따라서
Arrays.asList()는 실제로 결과를 생성자 인수로 컬렉션에 전달하거나 add배열 대신 컨테이너 사용을 선호합니다.
만들 때 배열과 변수 매개변수를 사용하세요. 메소드 매개변수, 가변 매개변수 사용의 우선순위를 지정하면 프로그램이 더 분리될 수 있습니다. 프로그래밍에 드는 노력을 절반으로 줄여 두 배의 결과를 얻으세요.
위 내용은 Java 배열 코드 예제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!