Java ノート コレクション クラス

コレクションクラス

1 コレクション クラスを使用する理由

コレクション クラスは、複数のデータを格納するために使用されるクラスです。Java
基礎で配列について学習しましたが、データは複数のデータを格納できます。なぜコレクションを使用するのでしょうか?

1.2 アレイの特徴

  1. 複数のデータを保存するために使用されます
  2. 配列内のデータのデータ型が同じである
  3. 配列の長さは固定です
  4. 配列の操作には、開発者が関連する操作アルゴリズムを定義する必要があります。

1.3 コレクションクラスの特徴

  1. コレクションクラスには複数のデータを格納可能
  2. コレクションクラスに格納されるデータの型のいずれかの型(内部型はObject型のため、任意の型を格納可能)
  3. コレクションクラスの長さは可変です
  4. このようなコレクションに対する共通の操作メソッドはコレクション クラスで提供され、開発者はこれらのメソッドを通じてコレクションに対する共通の操作を実装できます。

コレクション クラスはクラスではなく、インターフェイスとクラスのセットの総称です。

2 Javaにおけるコレクションクラスのクラス構造

Javaのコレクションクラスは、保存方法の違いにより2種類のコレクションに分けられます。

  1. Collectionインターフェースに基づく线性コレクション

    Collection インターフェースの下には、異なる線形コレクションに対応する 2 つのサブインターフェースがあります。

    1. リストインターフェイスの機能

      (1). 順序集合(集合に入る順序と取り出す順序が同じ)
      (2). 重複したデータを格納できる集合

      • Listインターフェースの実装クラス:
        ①.ArrayList
        ②.LinkedList
        ③.Vector
    2. インターフェースの設定

      (1). 順序なしコレクション (コレクション内の要素の順序は保証されません)
      (2). 重複データを許可しないコレクション

      • Setインターフェースの実装クラス:
        ①.HashSet
        ②.TreeSet
  2. Map インターフェイスに基づくkey-valueマッピング ペアのコレクション

3 List インターフェイスに基づく ArrayList クラスの使用

ArrayList の最下層は動的配列に基づいて実装されます

3.1 ArrayListの特徴

  1. ArrayList を使用する場合、その中の要素を見つける方が効率的です。配列には添字があり、添字を介して要素に直接ロックできます。

  2. ArrayList は要素の挿入または削除時に非効率的です (メモリ内のシフト)。

3.2 ArrayListの共通API

  1. ArrayList オブジェクトを作成する

    //创建ArrayList集合类对象
    ArrayList arrayList = new ArrayList();
    
  2. add(element): ArrayList の末尾に要素を追加します。

    //向ArrayList的尾部追加元素
         arrayList.add("aaa");
         arrayList.add(20);
         arrayList.add('a');
         arrayList.add(true);
      arrayList.add(20.5);
    
  3. add(index, element): コレクション内の特定の位置に要素を挿入します。

    //向ArrayList某个位置插入元素
         arrayList.add(2,"str")
    
  4. set(index,element) : コレクション内の要素を置き換えます

    //更改ArrayList替换位置的元素
         arrayList.set(2,"set")
    
  5. contains(element): コレクションに指定された要素があるかどうかを確認します。

    //检查ArrayList中是否含有指定元素
         arrayList.contains("set")
    
  6. isEmpty(): コンテナが空かどうかを確認します

    arrayList.isEmpty()
    
  7. get(index): 添え字に従って添え字に対応する要素を取得し、デフォルトでオブジェクト型を返します (必要に応じて特定の型を変換します)。

    //根据下标获得一个元素
         String str= (String) arrayList.get(0);
         System.out.println(str);
    
  8. 削除(要素|インデックス):

    パラメータがオブジェクト型の場合は内容に応じて削除され、パラメータが基本型のint型の場合は添字に従って削除されます。

         //移除元素
         arrayList.remove("aaa");
         System.out.println(arrayList);
         //如果参数为int类型,则根据下标移除,如果要移除的内容为整数则需要使用Integer类型删除
         arrayList.remove(new Integer(3));
         System.out.println(arrayList);
    
  9. addAll(): ユニオン操作の設定

            ArrayList<String> arrayList=new ArrayList<>();
            arrayList.add("1");
            arrayList.add("2");
            ArrayList<String> arrayList1=new ArrayList<>();
            arrayList1.add("我是一");
            arrayList1.add("我是二");
            arrayList.addAll(arrayList1);
    
  10. continueAll(): 交差演算を設定します

        ArrayList<String> arrayList2=new ArrayList<>();
        arrayList2.add("1");
        arrayList2.add("我是二");
        arrayList2.add("我是一");
        ArrayList<String> arrayList3=new ArrayList<>();
        arrayList3.add("我是一");
        arrayList3.add("我是二");
        boolean flag= arrayList2.retainAll(arrayList3);//判断是否交集成功
  1. RemoveAll(): 差分設定操作

            ArrayList<String> arrayList4=new ArrayList<>();
            arrayList4.add("1");
            arrayList4.add("我是二");
            arrayList4.add("我是一");
            ArrayList<String> arrayList5=new ArrayList<>();
            arrayList5.add("我是一");
            arrayList5.add("我是二");
            boolean flag1=arrayList4.removeAll(arrayList5);
    
  2. ArrayList コレクション内のすべての要素を反復処理します。

    //遍历List集合中的所有元素
            //使用传统for循环遍历
            for(int i=0;i<arrayList.size();i++){
          
          
            Object obj = arrayList.get(i);
            System.out.println(obj);
            }
            System.out.println("---------------");
            //使用for循环加强版遍历
            for(Object obj : arrayList){
          
          
            System.out.println(obj);
            }
            System.out.println("---------------");
            //用迭代器遍历
            Iterator  iterator=arrayList.iterator();
            while(iterator.hasNext()
                System.out.println(iterator.next())
            }
            //使用list集合中的foreach方法进行遍历
            arrayList.forEach(System.out::println);
    

4 List インターフェースに基づく実装クラス Vector

4.1 ベクターの特徴

1. Vector の最下層も動的配列に基づいて実装されています。
2. Vector で提供される操作は基本的に ArrayList と同じです

4.2 ArrayList と Vector の違い

  1. 同じ点: ArrayList と Vector の最下層はどちらも動的配列に基づいて実装されており、同様の API を提供します
  2. 違い:
    (1) ArrayList はデフォルトで長さ 0 の配列を作成しますが、Vector は長さ 10 の配列を作成します
    (2) Vector はスレッドセーフですが、ArrayList はスレッドセーフではありません。
    ArrayList をスレッドセーフにする外部手段を渡すことができます

5 Vector のサブクラス Stark

Vector のサブクラスである Stark スタック コンテナは、後入れ先出しスタックを実装します。

5.1 スタークの特徴

最初のうちの最後の

5.2 Stark の共通 A​​PI

  1. スタークオブジェクトを作成する

     //实例化栈容器
        Stack<String> stack=new Stack<>();
    
  2. スタックにpush()、スタックをプッシュ

    //入栈
            stack.push("one");
            stack.push("two");
            stack.push("three");
    
  3. Pop() はスタックをポップし、スタックをポップします (スタックの先頭にあるオブジェクトを削除し、その値を返します)

    //出栈  
    //获取栈容器元素
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop()); 
    
  4. empty() はスタックコンテナが空かどうかをチェックします

    //检查栈容器是否为空 
            System.out.println(stack.empty());
    
  5. Peak() はスタックの最上位要素を読み取ります

    //查看栈顶元素
            System.out.println(stack.peek());
    
  6. search() はコンテナ内のスタック要素の位置を返します。

    System.out.println(stack.search("one"));
    

5.3 スタークの使用例

  1. 要素の対称性の判定

    文字列 str=「… {…[…(…)…]…}…(…)…[…]…」 ;

    public class Test01 {
          
          
        public static void main(String[] args) {
          
          
            String str="... {.....[....(....)...]....}..(....)..[...]..." ;
            Stack<String> stack=new Stack<>();
            //假设修正法
            boolean flag=true;//假设是匹配的
            //拆分字符串获取字符
            for (int i=0;i<str.length();i++){
          
          
                char chars=str.charAt(i);
                if (chars == '['){
          
          
                    stack.push("]");
                }
                if (chars =='{'){
          
          
                    stack.push("}");
                }
                if (chars =='('){
          
          
                    stack.push(")");
                }
                //判断符号是否匹配
                if (chars =='}'||chars==']'||chars==')'){
          
          
                    if (stack.empty()){
          
          
                        flag=false;
                        break;
                    }
                    String str1= stack.pop();
                    if (str1.charAt(0)!=chars){
          
          
                        flag=false;
                        break;
                    }
                }
            }
            if (!stack.empty()){
          
          
                flag=false;
            }
            System.out.println(flag);
        }
    }
    

6 Listインターフェースに基づく実装クラスLinkedList

LinkedList の最下層はリンク リストの実装に基づいています

6.1 LinkedListの特徴

1. 要素の挿入または削除時の効率が高い
2. 要素のクエリおよび走査時の効率が低い

6.2 LinkedListの共通API

  1. add(要素): 最後に追加
  2. addFirst(element): 最初の挿入
  3. addLast(要素): 末尾の挿入
  4. add(index,element): 指定された添字位置に要素を挿入します。
  5. プッシュ(要素): スタックに
  6. Pop(): スタックから外されました
  7. toArray(): リストを配列に変換します

7 Setインターフェースに基づく実装クラスHashSet

7.1 ハッシュセットの特徴

  1. 最下層は Map コレクションの実装に基づいています。
  2. 重複したデータは保存できない
  3. セット内の要素の順序は保証されていません
  4. Set コレクションはコレクションから要素を直接取得できません。
  5. Set コレクションには添字がありません

7.2 HashSetの共通API

1.add(element): コレクションに要素を追加します。
2.iterator(): コレクション内のすべての要素を走査します。

//遍历集合中元素
        Iterator<String> iterator = hashSet.iterator();
        //循环遍历集合中的每个元素
        while(iterator.hasNext()){
    
    //检测集合中是否存在要迭代的数据,true表示存在
            String str = iterator.next();//获取一个元素
            System.out.println(str);
        }

3. foreach ループを通じてコレクション内のすべての要素を走査します。

//使用foreach遍历集合中的所有元素
        for(String str : hashSet){
    
    
            System.out.println(str);
        }

4. foreach メソッドを使用してコレクション内の要素を走査します。

//通过foreach方法遍历集合中的所有元素
        hashSet.forEach(System.out::println);

8 Set インターフェイスに基づく TreeSet 実装

TreeSet はツリー構造に基づいた Set コレクションであり、並べ替えることができ、並べ替え可能な Set コレクションと呼ばれます。

8.1 TreeSetコレクションの特徴

1. TreeSet は順序付けされた Set コレクションです。
2. TreeSet に重複データを格納することはできません。
3. TreeSet に格納される要素は並べ替え可能な要素 (コンパレータ インターフェイスを実装するオブジェクト) である必要があります。格納された要素が並べ替え可能でない場合、要素は例外を報告します (クラスキャスト例外)

9 キーと値(キーと値のペア)に基づくマップの収集

Map コレクションに格納される要素は、値に対応するキーです。

9.1 マップコレクションの特徴

1. キーの繰り返しは許可されていません。デフォルトでは、キーはオブジェクト タイプであり、あらゆるタイプのデータを保存できます。 2. 値の
繰り返しは許可されています。デフォルトでは、値はオブジェクト タイプであり、任意のタイプのデータを保存できます。
3. Map キー (1 回のみ出現可能) および null 値では null が許可されます

9.2 Mapインタフェースに基づく実装クラスHashMap

重複したキーを HashMap に保存することはできません。新しく追加されたキーがすでに存在する場合は、新しい値が元の値を置き換えるために使用されます。

9.3 HashMapの共通API

1.put(key,val): キーと値のペアを Map コレクションに追加します。
2.get(key): キーに従って対応する値を取得します。
3.remove(key): に従って Map コレクション内の要素を削除します。 key4への
.size(): コレクション内の要素の数を取得します。
5.keySet(): Map コレクション内のすべてのキーを取得し、包含所有key的set集合

        //获取hashmap中所有元素
        System.out.println(hashMap.keySet());
        for (String map :hashMap.keySet()){
    
    
            System.out.println(map+"<--------->"+hashMap.get(map));
        }
    }
}

6.values(): Map コレクション内のすべての値を取得し、Collection コレクションを返します。
7.entrySet(): Map コレクション内の各要素の Entry コレクション オブジェクトを取得し、Set コレクションを返します。

for (Map.Entry<String,String> entry : map.entrySet()){
    
    
            System.out.println(entry.getKey()+"<--->"+entry.getValue());
        }

Map コレクションのキーを繰り返すことはできません。Map に新しい要素を追加したい場合、Map コレクションはその要素がコレクション内に存在するかどうかをどのように判断しますか?

10 Map インターフェースに基づく TreeMap 実装クラス

TreeMap は TreeSet と同様にソート可能なコレクションです。TreeMap
はキーに従ってソートされます。TreeMap
に入る要素 (キー) はソート可能な要素 (キー) でなければなりません。

11 追加の知識ポイント

  • コレクションツールクラス

    • よく使用されるコレクション API
      void sort(List) コンテナ内の要素を並べ替えます
      void shuffle(List) リスト内の要素をランダムに並べ替えます
      void reverse(List) リスト内の要素を逆順に並べ替えます
      void fill(List,Object) は、特定のオブジェクト コンテナ全体を書き換える
      int binarySerach(List,Object) バイナリ検索
      addAll(Collection,element...): 複数の要素を一度にコレクションに追加します
  • イコールメソッド

== は、2 つのオブジェクトが等しいかどうかを判断するためにも使用されます。2つのオブジェクトが同じであるかどうかを判断するために使用される、
equals メソッドは、 2 つのオブジェクトの値が等しいかどうかを判断するために使用されます。

        String s1 = "abc";
        String s2 = "abc";
        //s1和s2两个变量都指向“abc”字符串对象,他们两个是同一个对象
        System.out.println(s1 == s2);
        /**
         * Java中每次使用new关键字创建对象时,在JVM的堆区都会自动创建一个新对象
         * 只不过两个对象的值都是"abc"字符串
         * 这两个对象不是同一个对象,但他们的值是相等
         * 所以“==”的结果为false,他们两个不是同一个对象
         * 如果要判断两个对象的值是否相等使用equals方法
         */
        String str = new String("abc");
        String str1 = new String("abc");
        System.out.println(str == str1);//false
        System.out.println(str.equals(str1));

equals メソッドは任意のオブジェクトに存在します。このメソッドは Object クラスで定義されます。デフォルトでは次のように配置されます。

 public boolean equals(Object obj) {
    
    
        return this == obj;
    }

Object クラスのソースコードを見るとわかるように、equals メソッドのデフォルトの定義は、2 つのオブジェクトが同じオブジェクトであるかどうかを判断することになっているため、2 つのオブジェクトの値が同じオブジェクトであるかどうかを判断できるようにするために
、が等しい場合は、定義したエンティティ クラスでこのメソッドを書き換えます。 String メソッドは、
equals メソッドをオーバーライドし、JDK のほとんどのクラスはこのメソッドをオーバーライドします。

  • hashCodeメソッド

hashCode メソッドはどのクラスにも存在します。このメソッドは Object クラスにも定義されています。hashCode メソッドは、
現在のオブジェクトに対応するメモリ アドレスのハッシュ コードを取得するために使用されます。2
つのオブジェクトのハッシュが等しい場合、それは意味します。現在の 2 つのオブジェクトは次でなければなりません。同じオブジェクト
の開発者実際のニーズに応じて hashCode を書き換えることができ、書き換え後は異なるオブジェクトの hashCode が等しくなる可能性があります。

開発では、通常、equals メソッドと hashCode メソッドはデフォルトの動作を変更するために書き直されます。

  • Map コレクションは、新しく追加された要素のキーがコレクション内に存在するかどうかをどのように判断するのでしょうか?

1. まず hashCode が等しいかどうかを判定し、等しくない場合は、同一のオブジェクトが存在しないとみなし、新しい要素をマップ コレクションに直接追加します 2. hashCode の値が等しい場合、同じオブジェクトが存在するかどうか判断できない
ため、引き続きequalsメソッドの判定を行い、equalsの戻り値がtrueであれば、等しい要素が存在するとみなします。equals判定の場合は、元の要素を新しい要素に置き換えます
。が等しくない場合は、同一のオブジェクトが存在しないとみなされ、新しい要素がマップ コレクションに直接追加されます。

  • コンパレータインターフェース

コンパレータは、比較ルールを定義するために使用されます。比較ルールを使用すると、比較ルールに従ってデータを並べ替えることができます。Java
で比較ルールを定義するには、次の 2 つの方法があります。

(1) Comparable インターフェースの実装: Comparable は java.lang パッケージの下にあります
- Comparable はオブジェクトのデフォルトの比較ルールを実装するために使用され、デフォルトの比較ルールは 1 つだけあります
- Comparable には CompareTo メソッドがあり、これは次の目的で使用されます。比較ルールを定義する
- メソッドの戻り値 値は正の整数で、現在のオブジェクトが比較オブジェクトより大きいことを示す
- メソッドの戻り値は 0 に等しく、2 つのオブジェクトは等しい
- メソッドの戻り値メソッドは、現在のオブジェクトが比較オブジェクトより小さいことを示す負の整数です。

@Override
    public int compareTo(User user) {
    
    

        return this.userId - user.getUserId();
    }

(2) Comparator インターフェースの実装: Comparator は java.util パッケージの下にあります
- Comparator はオブジェクトの拡張比較規則を定義するために使用され、複数定義できます
- Comparator インターフェースにはメソッド Compare(obj1, obj2) があります
- 比較を定義するメソッドルール戻り値は、obj1 が obj2 より大きいことを示す正の整数です。
- メソッドの戻り値は 0 に等しく、2 つのオブジェクトが等しいです。
- メソッドの戻り値は、obj1 が obj2 より小さいことを示す負の整数です。

/**
 * 使用内部类定义扩展规则
 * 1.根据积分升序排序
 */
    static class sortByScoreASC implements Comparator<User>{
    
    


    @Override
    public int compare(User user1, User user2) {
    
    
        return user1.getUserScore() - user2.getUserScore();
    }
}

/**
 * 2.根据积分降序排序
 */

static class sortByScoreDESC implements Comparator<User>{
    
    


    @Override
    public int compare(User user1, User user2) {
    
    
        return user2.getUserScore() - user1.getUserScore();
    }
}


    /**
     * 2.根据学号降序排序
     */

    static class sortByUserIdDESC implements Comparator<User>{
    
    


        @Override
        public int compare(User user1, User user2) {
    
    
            return user2.getUserId() - user1.getUserId();
        }
    }
    
    //调用
// TreeSet<User> users = new TreeSet<>();//使用user对象中的默认排序规则进行排序
       //使用User内定义的内部类指定排序规则
    // TreeSet<User> users = new TreeSet<>(new User.sortByUserIdDESC());
       //使用匿名内部类定义排序规则
    TreeSet<User> users = new TreeSet<>(new Comparator<User>() {
    
    
       //使用匿名内部类实现比较器接口
       @Override
       public int compare(User user1, User user2) {
    
    
          return user1.getRegDate().compareTo(user2.getRegDate());
       }
    });
  • 一時的なキーワード

シリアル化する必要のないプロパティの前にキーワード transient を追加します。オブジェクトをシリアル化する場合、このプロパティはシリアル化されません。

1) 変数が一時的に変更されると、その変数はオブジェクトの永続化の一部ではなくなり、シリアル化後は変数の内容にアクセスできなくなります。

2) transient キーワードは変数のみを変更でき、メソッドやクラスは変更できません。ローカル変数は transient キーワードでは変更できないことに注意してください。変数がユーザー定義のクラス変数の場合、クラスは Serializable インターフェイスを実装する必要があります。

3) transient キーワードによって変更された変数はシリアル化できなくなり、静的変数は transient によって変更されたかどうかに関係なくシリアル化できなくなります。

  • ネイティブキーワード

Java は、オペレーティング システムとハードウェアの最下層に直接アクセスできません。最下層を制御するには、ネイティブ キーワードを使用する必要があります。これには、下位言語のサポートが必要です。これがネイティブの役割です。


  • 学びは西安家中の訓練から生まれる

おすすめ

転載: blog.csdn.net/woschengxuyuan/article/details/126262111