ホームページ  >  記事  >  Java  >  Java コレクション フレームワーク アーキテクチャの概要

Java コレクション フレームワーク アーキテクチャの概要

零下一度
零下一度オリジナル
2017-07-23 10:24:532569ブラウズ

1. 集合の概要 <br>

1) 集合の概念

現実の集合: 多くのものが一緒になります。

数学における設定: 共通の特性を持つものの集合。

Java のコレクション クラス: これは、共通の属性を持つ任意の数のオブジェクトを格納する、コンテナーのようなツール クラスです。

2) セットの役割

クラス内に同じ型のプロパティが複数あり、それらの機能と意味が同じである場合。たとえば、学生は複数のコースを選択でき、学生クラスの場合、XX コースが属性の 1 つであり、通常は複数の XX コースが存在します。このような状況では、コースごとに属性を定義するのは非常に面倒です。ここではセットの概念を使用する必要があります。

まとめると、setsの機能は以下の点になります:

  1. クラス内のデータを整理します。

  2. 大量のアイテムを簡単かつ迅速に検索します。

  3. 一部のコレクション インターフェイスでは、一連の順序付けされた要素が提供され、関連する要素をシーケンスの途中ですばやく挿入または削除できます。

  4. 一部のコレクション インターフェイスはマッピング関係を提供しており、キーを通じて対応する一意のオブジェクトをすばやく見つけることができます。このキーは任意のタイプにすることができます。

3) セットと配列の比較

セットと配列はどちらも一連のデータをコンテナーに入れる機能があることがわかりますが、なぜ Woolen クラス内で配列の代わりにセットを使用するのでしょうか。布?

  1. 配列の長さは固定で、コレクションの長さは可変です。 コレクションの利点は、配列の長さがすでに定義されている一方で、コレクションの長さが内部のコンテンツに応じて拡張されることです。

  2. 配列は添字を介してのみ要素にアクセスでき、型は固定されています (配列の添字は整数のみ) が、一部の セットは任意の型 (キー キーワードは任意の型) でマップされた特定のオブジェクトを見つけることができます。


2. Java コレクション フレームワークのアーキテクチャ

Java コレクション フレームワークを簡単に見てみましょう: (リストされていないインターフェイスとクラスが多数あります。ここには一般的に使用されるインターフェイスとクラスのみがリストされています)

図に示すように、JAVA コレクション フレームワーク アーキテクチャ: Collection と Map が 2 つのルート インターフェイスです。

コレクションインターフェイス: 内部ストレージは独立したオブジェクトです。含まれるもの:

1. リスト インターフェイス: sequence。要素を順序立てて反復可能な方法で保存します。実装クラス: ArrayList、配列シーケンス。実装クラス: LinkedList、リンクされたリスト。

2. キューインターフェイス:

Queue、要素を順序立てて反復可能な方法で保存します。実装クラス: LinkedList、リンクされたリスト。 3. インターフェースを設定します:

set

、要素を順序付けされておらず反復不可能に保存します。実装クラス: HashSet、ハッシュセット。

Map インターフェース:

(任意の型) のマッピングを内部的に使用して、データを保存します。このマッピングは、Entry クラス (Map の内部クラス) のインスタンスです。含まれるもの: 実装クラス: HashMap、ハッシュ テーブル。 Collection インターフェイスは、List、Set、Queue インターフェイスの親インターフェイスであり、List、Set、Queue の操作 (追加、削除、変更、クエリ) に使用できるメソッドを定義します。 (具体的な Collection インターフェースのメソッドは API を確認すれば分かるので、ここでは記載しません。)

その中で、最もよく使われる実装クラスは ArrayList、HashSet、HashMap の 3 つです。ここではこれら 3 つの実装クラスを紹介します。一つずつ。

この記事では、まずArrayListの使い方を紹介します。

3. ArrayList 実装クラス

<br>List インターフェースとその実装クラス - ArrayList

List は、各要素の挿入位置を正確に制御したり、特定の位置の要素を削除したりできます。 add() 挿入メソッドと get() 取得メソッド

ArrayList -- 配列シーケンスは List

の重要な実装クラスです。

ArrayList の最下層は array によって実装されており、これが名前の由来でもあります。

それでは、これらのコレクションをどのように使用するのでしょうか?小さな例を使用して、セットをより直観的に使用する方法を学ぶための小さなプログラムを作成してみましょう。 (以降の記事の例もこれに基づいています)

>>>>>>>>>>>>>>>>> > ;>>>>>>>>>>>>>>>>>> プログラム機能 - 学生のコース選択をシミュレートする機能

コースを選択する(コレクションにコースを追加する)
  1. 選択したコースを削除する(コレクション内の要素を削除する)
  2. 選択したコースを表示する
  3. 選択したコースを変更する
& gt; >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>

以下はプログラムのコードスニペットです。コレクションの使用を導入するためのテストなので、コードは段階的に改善されますので、詳細については心配しないでください。

1) 学生クラスとコースクラスを作成します

 1 /** 2  * 学生类 3  * @author hysum 4  * 5  */ 6 public class Student implements { 7     private String name;//学生姓名 8     private String id;//学生id 9     private Set courses;//所选课程的set集合10     11     public Student(){}12     public Student(String id,String name){13         this.id=id;14         this.name=name;15         this.courses=new HashSet();//初始化集合16     }17     public String getName() {18         return name;19     }20     public void setName(String name) {21         this.name = name;22     }23     public String getId() {24         return id;25     }26     public void setId(String id) {27         this.id = id;28     }29     public Set getCourses() {30         return courses;31     }32     public void setCourses(Set courses) {33         this.courses = courses;34     }

 1 /** 2  * 课程类 3  * @author hysum 4  * 5  */ 6 public class Course { 7 private String id;//课程id 8     private String name;//课程名称 9     10     public Course(){11         12     }13     public Course(String name){14         this.name=name;15     }16     public String getId() {17         return id;18     }19     public void setId(String id) {20         this.id = id;21     }22     public String getName() {23         return name;24     }25     public void setName(String name) {26         this.name = name;27     }28     public Course(String id,String name){29         this.id=id;30         this.name=name;31     }32 }
2) 代替コースクラスを作成します
 1 /** 2  * 备选课程类 3  * 
 4  * @author hysum 5  * 6  */ 7 public class ListCourse { 8 private List CoresesToSelect;// 备选课程 9     private Student stu;10     private static Scanner in;11     {12         in = new Scanner(System.in);13     }14     public ListCourse() {15         this.CoresesToSelect = new ArrayList();// 初始化List集合16     }17        public List getCoresesToSelect() {18         return CoresesToSelect;19     }20 21     public void setCoresesToSelect(List coresesToSelect) {22         CoresesToSelect = coresesToSelect;23     }   26 }

注:

List はインターフェイスであるため、コンストラクター メソッドで直接インスタンス化することはできません, そして ArrayList() を通じてインスタンス化されました! ! !

例: public List courseToSelect = new ArrayList();

Set と Map は似ており、直接インスタンス化することはできません。HashSet()、HashMap();

3 などの対応するインスタンス化クラスを使用する必要があります。代替コースにコースを追加します

(要素の追加) List の下の List に要素を挿入するには、合計 4 つのメソッドがあります:

1.add(element);

2.add(index,element);

3 .addAll(Arrays.asList(オブジェクト配列名));

4.addAll(index,Arrays.asList(オブジェクト配列名));

次のコード例:

 1 /* 2  * 添加备选课程 3  */ 4 public void AddCourse() { 5         Course cr1=new Course("1","数据结构");//创建课程对象 6     this.CoresesToSelect.add(cr1);//用add(element)添加  7         Course temp=(Course)this.CoresesToSelect.get(0);//用get方法取出,注意类型转换 8     System.out.println("添加了课程:"+temp.getId()+" "+temp.getName()); 9         10         Course cr2=new Course("2","C语言");//创建课程对象11     this.CoresesToSelect.add(0,cr2);//用add(index,element)添加 12     temp=(Course)this.CoresesToSelect.get(0);13         System.out.println("添加了课程:"+temp.getId()+" "+temp.getName());  
14 }

1 Course[] course = { new Course("1", "数据结构"), new Course("2", "C语言"), new Course("3", "汇编语言"),2                 new Course("4", "离散数学") };3         this.CoresesToSelect.addAll(Arrays.asList(course));//用addAll(Arrays.asList(对象数组名))添加
注:

1. オブジェクトがコレクションに格納されている場合、それらを取り出すときに型変換が必要になります。 (この問題は後でジェネリックを使用して解決します

)

例: Course temp = (Course)coursesToSelect.get(0);

2. リストに追加される位置 (インデックス) は [0, length]; 0 はキューの先頭に挿入することを意味し、length はキューの最後に挿入することを意味します。

3. リストに追加された長さが現在の長さよりも大きい場合、システムで例外が発生します。つまり、配列の下のテーブルで範囲外の例外が発生します。

4) 代替コースを取り出して、以下の
を印刷します。 3 つのメソッドはすべて、リストから要素を削除するために使用されます:

-----for ループ-----

1 Course cr2=new Course("2","C语言");//创建课程对象2 this.CoresesToSelect.add(2,cr2);//用add方法添加,超出集合现有长度 temp=(Course)

-- ---Iterator-----

Iterator は、コレクションの存在に依存するインターフェイスです。

1 public void testGet(){2 int size=CoursesToSelect.size();3 for(int i=0;i<size;i++){4 Course cr=(Course) CoursesToSelect.get(i);5 System.out.println("取出的课程:"+cr.getId()+":"+cr.getName());6 }7 }

-----それぞれ(使用推奨)-----

1 Iterator it=CourseToSelect.iterator();2 while(it.hasNext()){3 Course cr=(Course) it.next();4 System.out.println("课程:" + cr.id + ":" + cr.name);5 }

5) 代替コース変更 set (index, Object element) を使用して要素を変更します。インデックスの意味 インデックス位置、要素は新しいオブジェクトを表します。

1 for(Object obj:CoursesToSelect){//遍历集合中的每一个元素,作为每一个Object变量2 Course cr=(Course) obj;3 System.out.println("课程:" + cr.id + ":" + cr.name);4 }

6) 代替コース要素を削除します

List には、コンテナー内の要素の値 (使用法とadd も同様です)。

Course は id 属性と name 属性を持つ情報コース クラスであり、 courseToSelect はリストのシーケンス コンテナー オブジェクトです。

りー

注意:

1.remove(index);删除位置要大于0并且小于List(序列容器)的长度。如果要删除全部可以用for循环嵌套此方法。

2.remove(object);先要获得删除的值,用法是先定义一个信息变量通过get()来存放要删除的值,然后用remove(删除的对象值);

3.removeAll(Arrays.asList());要删除指定的多个位置 Arrays.asLIst(对象数组名);作用是把数组转换为集合。用法是先创建信息对象数组存放删除元素的值,然后再用removeAll(Arrays.asList(对象数组名))方法,删除集合数组的元素。


四、应用泛型管理课程

在上面的几个例子中,小伙伴是否发现对于集合的取出和遍历都要将Object对象进行强制转换后才能使用,每次这样做不仅增加了编程难度还使代码特别繁琐,这里我们可以利用泛型来帮助我们更加方便地使用java集合。

首先,我们要知道没有使用泛型的话集合中的元素,可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略他的类型把他当做Object处理。

那么我们就在刚才的例子里往备选课程类里的CoresesToSelect的List集合添加一些奇怪的东西会发什么有趣的事呢?

1    /*2      * 往List中添加一些奇怪的东西3      */4      public void testType(){5      System.out.println("能否往List中添加一些奇怪的东西呢?");6      this.CoresesToSelect.add("我不是课程,我是字符串!");7      }

当调用取出课程方法取出该元素时,运行时出错:

这是因为取出该元素时String类型不能强制转换为Course类型,那有什么办法来避免集合中被添加不希望添加的类型呢?

泛型则是规定了某个集合只可以存放特定类型的对象,会在编译期间进行类型检查,可以直接指定类型获取的集合元素。

泛型:指规定了某个集合只能存放特定类型的对象。

语法:ArrayList<String> array=new ArrayList<String>();  //规定array中只能存放String类型的对象

那么,了解了泛型之后,上面的例子里都可以加上泛型了,修改如下(只列出修改的部分):(自行对比)

1 private Set<Course> courses;//所选课程的set集合2 this.courses=new HashSet<Course>();//初始化集合3 public Set<Course> getCourses() {4         return courses;5     }6     public void setCourses(Set<Course> courses) {7         this.courses = courses;8     }
 1 private List<Course> CoresesToSelect;// 备选课程 2 public ListCourse() { 3         this.CoresesToSelect = new ArrayList<Course>();// 初始化List集合 4     } 5 public List<Course> getCoresesToSelect() { 6         return CoresesToSelect; 7     } 8  9     public void setCoresesToSelect(List<Course> coresesToSelect) {10         CoresesToSelect = coresesToSelect;11     }

foreach循环的修改:

1 for (Course obj : CoresesToSelect) {        
2     System.out.println("添加了课程:" + obj.getId() + " " + obj.getName());4 }
<br>

运用了泛型的话,用foreach语句时 存储变量应该为泛型的类型。for(Course a:courseToSelect),不必再用Object取出再强转,因为已经规定容器里装的都是Course类型。

使用泛型要注意

1.泛型集合中,不能添加泛型规定的类型和其子类以外的对象,否则会报错!

2.泛型中可以添加规定的类型的子类型的对象。如:

1 public void testChild() {2         ChildCourse ccr = new ChildCourse();3         ccr.id = "3";4         ccr.name = "我是子类型的课程对象实例~~";5         courses.add(ccr);6 }

3.不能直接添加基本类型(int,float等)的对象,如果要添加,需要使用其包装类。如:

1 public void testBasicType() {2 List<Integer> list = new ArrayList<Integer>();3 list.add(1);4 System.out.println("基本类型必须使用包装类作为泛型!" + list.get(0));5 }

五、通过Set集合管理课程

Set集合和List一样是Collection接口的子接口。它的方法跟List类似,但有稍许不同,因为Set集合是无序且不重复的。

1)添加学生选课的课程

add方法跟ArrayList一样

 1 li.stu=new Student("1","小明"); 2         System.out.println("欢迎"+li.stu.getName()+"同学选择课程"); 3         for(int i=0;i<3;i++){//循环三次添加选课 4             System.out.println("请选第"+(i+1)+"门课程:"); 5             String Id=in.next(); 6             for(Course c:li.getCoresesToSelect()){ 7                 if(c.getId().equals(Id)){ 8                     li.stu.getCourses().add(c); 9                 }10             }11             12         }

注意:Set 中添加某个对象,无论添加多少次,最终只会保留一个该对象(的引用)。同时,保留的是第一次添加的那一个。Set集合是无序的不可重复的。

2)打印输出学生选的课程

1 //输出学生选的课程2         for(Course c:li.stu.getCourses()){3             System.out.println(c.getId()+" "+c.getName());4 5         }

注: Set 内の各要素をループするには、foreach または iterator のみを使用できます。List のような get() メソッドは使用できません。 順序付けされていないため、出力結果は毎回若干異なります。

>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>> Set は、List の set() メソッドとは異なり、変更されません。これは、List は順序付けされており、位置を指定できるのに対し、Set は順序付けされておらず、ループ トラバーサルによって変更できるためです。 2. クエリとトラバースの場合、disorder にインデックス ID が指定されていないため、get() メソッドで Set を取得することはできませんが、foreach と iterator を使用してトラバースすることはできますが、そのたびに順序が異なる可能性があります。横断した、または障害が原因で発生した。

3. Set の size()、add()、addAll()、remove()、removeAll() は List と似ています。 4. Set は null を追加することもできます (ただし、null は繰り返されないため、追加できるのは 1 つだけです)。

以上がJava コレクション フレームワーク アーキテクチャの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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