概要:
この記事では、主に配列とコンテナ、配列の作成と初期化、配列とジェネリック、配列と変数パラメータリスト、など、Javaの配列に関する知識を説明します。 Arrayのツールクラスの実用的な関数を使って、配列を5つの側面から詳細に記述し、要約します。
配列とコンテナ
配列の作成と初期化
配列と変数パラメータのリスト
配列ツールクラスの概要実用的な関数の
効率
配列は最も効率的なストレージおよびランダム アクセス オブジェクトです。順次方式。配列は単純な線形シーケンスであるため、要素へのアクセスが非常に高速になります。
ただし、この速度の代償は、配列オブジェクトのサイズが固定されており、その存続期間中中変更できないことです。 ArrayList はスペースの自動割り当てを実現でき、柔軟性が高いため、通常は配列よりも ArrayList を優先する必要がありますが、この柔軟性にはオーバーヘッドが必要です。したがって、ArrayList は配列よりも効率が大幅に低くなります。 Types JDK 1.5 より前の Java ではジェネリックスが導入されていませんでした。したがって、ジェネリックスの前の
コンテナクラスがオブジェクトを処理する場合、オブジェクトは特定の型を持たないものとして扱われます。つまり、これらのオブジェクトはもちろん、Java はコンパイル時と実行時の両方で、オブジェクトに不適切なメッセージを送信することを防ぎます。したがって、どちらの方法が安全性が低いというわけではありませんが、コンパイル中にエラーを指摘できた方がよりエレガントになります。
基本型を保存する機能 配列は基本型を保持できますが、ジェネリックの前のコンテナーは保持できません。
JDK 1.5以降、Javaはジェネリックスと自動パッケージ化メカニズムを導入しました(ジェネリックスはタイプセーフなコンテナの生成を保証でき、自動パッケージ化メカニズムはコンテナが基本的な型を保持できるようにします)。これにより、現在のコンテナはパフォーマンスに加えて配列が可能になります。以外のすべての面で矮小化されています。
さらに、ジェネリックは配列にとって大きな脅威であり、通常、この 2 つはうまく組み合わせられません (パラメータ化された型を持つ配列はインスタンス化できません)。
したがって、最新の Java バージョン を使用して をプログラムする場合、 は配列よりもコンテナを優先する必要があります。 パフォーマンスが問題であり、配列に切り替えるとパフォーマンスが向上することが証明されている場合にのみ、配列を使用するようにプログラムをリファクタリングする必要があります。
"[ ]" 構文は配列オブジェクトにアクセスする唯一の方法です。
String[] strs = { ... }; // 创建方式 1 --- 花括号内对象的个数就是数组大小System.out.println(strs.length); // 输出 0
Use new Expression明示的な作成
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)];
}
5. 配列と変数パラメータ型
Java SE5 では、「Type... args」の形式で変数パラメータ型 (Variable Argument Type) が追加されました。メソッド へのパラメータとしてのみ使用できます。 変数パラメータのリストは、パラメータの数は不確実だが型は確実である状況に適しています (Java は変数パラメータを配列として扱います)。
複数の可変パラメータリストがある場合、項目のうちの 1 つが最後の項目であってはいけないため、サポートされる可変パラメータは 1 つだけです。可変パラメータリスト内のパラメータの数は不確実であるため、その後ろに同じ型のパラメータがある場合、Java は渡されたパラメータが前の可変パラメータに属するか次のパラメータに属するかを区別できないため、可変パラメータを配置することしかできません。最後に一品。
T[] first = new T[3]; // ERROR A<String>[] arrays = new A<String>[4]; // ERROR: Cannot create a generic array of A<String>変数パラメータ リストには次の特性があります: はメソッド パラメータ リストの最後にのみ出現できます。変数type と Variable name (前後にスペースがあってもなくても)
の形式の変数パラメーター リスト (コンパイラーは変数パラメーターを配列として扱います) 。
2. 変数パラメータの型と配列の互換性 コンパイラは、配列の型と変数パラメータの型を同じものと見なします。つまり、 ; A<String>[] arrays;
// OK
可変パラメータは配列型パラメータと互換性がありますが、配列型パラメータは可変パラメータと互換性がありません;Object[] objs = new String[3];
// OK
// 代码示例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の場合、必要なメソッドは1つだけですdealArray(int, int, int) または dealArray(int…) として定義されたメソッドとして。したがって、当然のことながら、 dealArray(int[]) メソッドと配列型パラメータを一致させることは不可能です。 parameter一致する原則:固定長の方法と一致する場合、
関数 | 概要 | 注 |
---|---|---|
System.arraycopy(Object src, int srcPos, Object dest, int, int length) | 指定されたものからソース 配列内の配列をコピーします。コピーは、ターゲット配列の指定された位置から開始され、指定された位置で終了します。 | オブジェクト配列をコピーする場合、オブジェクトの参照のみがコピーされます。オブジェクト自体 (浅いコピー); このメソッドでは自動ラッピングと自動アンパックは実行されないため、2 つの配列は同じ型でなければなりません コピーとして新しい配列オブジェクトを明示的に作成する必要があります。 |
指定された配列をコピーし、 | をnullでインターセプトするか、新しい配列オブジェクトを返します。新しい配列の長さが元の配列の長さを超える場合は、配列のデフォルト値を維持します |
对于以上两个方法:
2、数组的字符串方式表示 方法: Arrays.toString(Object[] a) / Arrays.deepToString(Object[] a) 作用: 返回指定数组内容的字符串表示形式:前者适用于一维数组,或者适用于多维数组 3、数组的比较 方法: Arrays.equals(Object[] a, Object[] a2) / deepEquals(Object[] a1, Object[] a2) (多维) 作用: 比较两个数组:元素类型相同,元素个数相等,对应位置的元素相同; 注意:
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) 作用: 对数组内元素进行升序排序 (默认) 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) 方法)对数组进行多态升序排序。 注意:
関数: 各位置には同じ値のみを埋め込むことができます。同じオブジェクトの参照をコピーして埋めるだけです 関数: 指定されたオブジェクトでサポートされている 固定サイズを返しますarray List
配列の代わりにコンテナを使用することを推奨します。
|
以上がJava 配列コード例の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。