ホームページ >Java >&#&チュートリアル >Java 配列コード例の概要

Java 配列コード例の概要

黄舟
黄舟オリジナル
2017-03-14 11:54:041561ブラウズ


概要:

この記事では、主に配列とコンテナ、配列の作成と初期化、配列とジェネリック、配列と変数パラメータリストなど、Javaの配列に関する知識を説明します。 Arrayのツールクラスの実用的な関数を使って、配列を5つの側面から詳細に記述し、要約します。


1. 重要なポイント概要

  • 配列とコンテナ

  • 配列の作成と初期化

  • 配列と変数パラメータのリスト

  • 配列ツールクラスの概要実用的な関数の

  • 2. 配列とコンテナ
Javaでは、配列とコンテナの両方が
オブジェクト

を保持できます。オブジェクトを保持する必要がある場合、どのような場合に配列を優先し、どのような場合にコンテナを優先する必要があるでしょうか。

Java の初期バージョンでは、固定サイズの配列が絶対に必要でした。これは、Java 設計者が Java に基本型とパフォーマンスベースの考慮事項を含めることを選択しただけでなく、初期バージョンではコンテナーが非常に強力にサポートされていたためでもあります。少し。したがって、Java の初期バージョンでは、特に次の 3 つの側面において、配列を含めることを選択することが常に合理的です:


効率

    Java では、
  • 配列は最も効率的なストレージおよびランダム アクセス オブジェクトです。順次方式。配列は単純な線形シーケンスであるため、要素へのアクセスが非常に高速になります。

    ただし、この速度の代償は、配列オブジェクトのサイズが固定されており、その存続期間中中変更できないことです。 ArrayList はスペースの自動割り当てを実現でき、柔軟性が高いため、通常は配列よりも ArrayList を優先する必要がありますが、この柔軟性にはオーバーヘッドが必要です。したがって、ArrayList は配列よりも効率が大幅に低くなります。 Types JDK 1.5 より前の Java ではジェネリックスが導入されていませんでした。したがって、ジェネリックスの前の

    コンテナクラスがオブジェクトを処理する場合、オブジェクトは特定の型を持たないものとして扱われます。つまり、これらのオブジェクトは
  • Object
  • として扱われます。ジェネリック以前に配列がコンテナーよりも優れている理由は、特定の型を保持する配列を作成できるためです。つまり、コンパイル時の型チェックによって、不適切な型が挿入されたり、不適切な型が抽出されたりすることを防ぐことができます。

    もちろん、Java はコンパイル時と実行時の両方で、オブジェクトに不適切なメッセージを送信することを防ぎます。したがって、どちらの方法が安全性が低いというわけではありませんが、コンパイル中にエラーを指摘できた方がよりエレガントになります。

    基本型を保存する機能 配列は基本型を保持できますが、ジェネリックの前のコンテナーは保持できません。

  • JDK 1.5以降、Javaはジェネリックスと自動パッケージ化メカニズムを導入しました(ジェネリックスはタイプセーフなコンテナの生成を保証でき、自動パッケージ化メカニズムはコンテナが基本的な型を保持できるようにします)。これにより、現在のコンテナはパフォーマンスに加えて配列が可能になります。以外のすべての面で矮小化されています。

    さらに、ジェネリックは配列にとって大きな脅威であり、通常、この 2 つはうまく組み合わせられません (パラメータ化された型を持つ配列はインスタンス化できません)。

    したがって、最新の Java バージョン を使用して をプログラムする場合、 は配列よりもコンテナを優先する必要があります。 パフォーマンスが問題であり、配列に切り替えるとパフォーマンスが向上することが証明されている場合にのみ、配列を使用するようにプログラムをリファクタリングする必要があります。

    3. 配列の作成と初期化 1. 配列の基本

配列識別子は、ヒープ内に作成された実際のオブジェクトを指す単なる参照です。このオブジェクトは、他のオブジェクトへの参照を保存するために使用されます。基本型の値は参照を格納し、基本型の配列は基本型の値を直接格納します。

"[ ]" 構文は配列オブジェクトにアクセスする唯一の方法です。

  • 2. 作成と初期化

  • 配列の初期化の一部として暗黙的に作成されます

String[] strs = { ... };    
// 创建方式 1 --- 花括号内对象的个数就是数组大小System.out.println(strs.length);    
// 输出 0
String[] strs = new String[5];  
//创建方式 2String[] ss = new String[]{ ... };   
//创建方式 3

3, 多次元配列

多次元配列の本質: ​​配列の要素は依然として配列です

りー

4. 配列とジェネリック

  • 配列とジェネリックはうまく組み合わせることができません。つまり、パラメータ化された型を持つ配列はインスタンス化できません

ジェネリック型の配列参照を作成できます。 ;
  • // 创建方式 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. 配列と変数パラメータ型

  • 1. 変数パラメータ型の概念

Java SE5 では、「Type... args」の形式で変数パラメータ型 (Variable Argument Type) が追加されました。メソッド へのパラメータとしてのみ使用できます。 変数パラメータのリストは、パラメータの数は不確実だが型は確実である状況に適しています (Java は変数パラメータを配列として扱います)。


変数パラメータ リストは最後の項目になければならないという事実に特別な注意を払う必要があります (つまり、最大 1 つの変数パラメータのみがサポートされます)。

複数の可変パラメータリストがある場合、項目のうちの 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 (前後にスペースがあってもなくても)

    変数パラメーターを使用してメソッドを呼び出すと、コンパイラーは暗黙的に変数パラメーターの配列を作成するため、Access を使用できます。配列
  • の形式の変数パラメーター リスト (コンパイラーは変数パラメーターを配列として扱います)

  • 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一致する原則:固定長の方法と一致する場合、

  • はこの方法と一致するように優先度を与えます。 main
関数に精通しています。 パラメーターは、変数パラメーター型の形式 ( public static void main(String... args) ) で書き換えることもできます。copyOf(T[]original, int newLength)
関数 概要
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) (多维)

作用: 比较两个数组:元素类型相同,元素个数相等,对应位置的元素相同;

注意:

  • 通过对每个元素使用 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) 方法)对数组进行多态升序排序

注意:

  • 已经有序 的数组进行查找;

  • ターゲットが見つかった場合、メソッドによって返される値は 0 以上です。それ以外の場合、生成される負の戻り値は、この並べ替えの下に挿入される位置を示します。 Object[])」と「binarySearch(Object[] a, Object key)」は、binarySearch(T[] a, T key, Comparator super T> c) に対応する「sort(T[], Comparator)」に対応します。 。

  • 配列に重複要素が含まれている場合、このメソッドではどの要素が見つかるか保証できません。重複要素のない配列を並べ替える必要がある場合は、TreeSet (並べ替え順序を維持する) または Linked

    Hash

    を使用できます。 (掲載順を維持して)並べ替えを設定します。プログラムのボトルネックにならない限り、配列を自分で保守する必要はありません。 6. 配列を埋める

  • メソッド:
fill(Object[] a, Object val)

関数:

各位置には同じ値のみを埋め込むことができます。同じオブジェクトの参照をコピーして埋めるだけです
7. 配列とコンテナ間の変換 メソッド:

asList(T… a)

関数:

指定されたオブジェクトでサポートされている

固定サイズを返しますarray List
注:
その基礎となる表現が配列であるため、結果として得られる List は固定サイズですので、サイズを変更することはできません。

    そのため、add/remove メソッドを呼び出すと java.
  • lang

    .UnsupportedOperationException (オプションの操作) がスローされます。 つまり、Arrays.asList() の実際の意味は次のとおりです。その結果をコンストラクター パラメーターとして任意の Collection に渡します (または、add

    All
  • メソッド、Collections.addAll
  • static

    メソッドを使用します)。動的コンテナを生成できます。 7. 概要

原則:

配列の代わりにコンテナを使用することを推奨します。

    メソッドのパラメータとして配列や変数パラメータを使用する場合、最初に変数パラメーターを使用すると、プログラムがより分離されます
  • Arrays ツール クラスの実用的な関数を使用すると、プログラミングの半分の労力で 2 倍の結果が得られます。

以上がJava 配列コード例の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。