コレクション (コレクション)
1. ジェネリック医薬品
1. コンセプト
ジェネリックス (Generics) は JDK1.5 の新機能です。実際には [構文シュガー] です。本質的には、可読性を向上させるためにコンパイラーによって提供される小さな手段です。ヒント、仮想マシン レベルではありません。一般概念と呼ばれます。
2.機能
- 汎用構文の定義により、コレクション要素のタイプが制限され、セキュリティ チェックが実行され、コンパイル時にエラーが表示されます。
- コードの汎用性が向上
- ジェネリックスはプログラム コードの可読性を向上させますが、それらは単なる構文上の砂糖であり (そのようなものはコンパイル後に削除され、最終的なソース コードには表示されません)、JVM ランタイムのパフォーマンスには影響しません。
3. 一般宣言(使用場所)
-
ジェネリックスはインターフェイス、クラス、メソッドの戻り値で使用できます
java.util.List 汎用インターフェイス/クラス
パブリック インターフェイス コレクション
<E>
{} -
ジェネリックメソッド宣言
public
<E>
void print(E e){}メソッドの戻り値の前に E を宣言すると、
<E>
後から現れる E が通常の Java 変数ではなくジェネリック型であることを示します。
4. 通称
- E - 要素 (コレクションには要素が格納されるため、コレクションで使用されます)
- T-Type (Java クラス)
- K-Key (キー)
- V -Value (値)
- N -数値 (数値型)
- ? - 未定義の Java 型を示します
5. 目的
- コンパイル時の型チェック
- コードの汎用性が向上
package cn.tonyoliver.generics;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 这个类用来测试泛型用途一:编译时做类型检查
*
* @author Tony
*
*/
public class Test01_Generics {
public static void main(String[] args) {
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
// int类型的数组,规定了数组里的数据类型,类型不对就报错
// a[2] = "hello";
// 1,泛型的标志<>
// 2,泛型的好处:规定了数据的类型,不能想放什么类型的数据就放什么类型的,要遵守泛型规定的类型
// 3,泛型的数据类型只能是引用类型,不能是基本类型
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
// 4,如果类型不对,把运行期才会报的错ClassCastException直接在编译时期就报出来
// list.add("a");//The method add(Integer) in the type List<Integer> is not applicable for the arguments (String)
// Iterator it = list.iterator();
// while(it.hasNext()) {
// Integer s = (Integer)it.next();
// System.out.println(s);
// }
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer s = it.next();
System.out.println(s);
}
}
}
package cn.tonyoliver.generics;
/**
* 这个类用来测试泛型用途一:代码通用性更强
*
* @author Tony
*
*/
public class Test02_Generics {
public static void main(String[] args) {
// traditon();// 传统方法
generics();// 泛型方法
}
// 传统方法:通过重载多态实现,方法同名,参数类型不同
private static void traditon() {
Integer[] scores = new Integer[] {
100, 98, 80 };
String[] names = new String[] {
"语文", "数学", "英语" };
Test02_Generics.print(scores);
Test02_Generics.print(names);
}
private static void print(Integer[] ss) {
for (Integer d : ss) {
System.out.println(d);
}
}
private static void print(String[] dd) {
for (String s : dd) {
System.out.println(s);
}
}
// 泛型方法
private static void generics() {
Integer[] scores = new Integer[] {
100, 98, 80 };
String[] names = new String[] {
"语文", "数学", "英语" };
Double[] moneys = new Double[] {
10.2, 20.2, 30.3 };
Test02_Generics.print(scores);
Test02_Generics.print(names);
Test02_Generics.print(moneys);
}
public static <E> void print(E[] arr) {
for (E e : arr) {
System.out.println(e);
}
}
}
6. タイプ消去
ジェネリックはコンパイル中のみ存続し、コンパイル後に強制終了され、実際に実行されると、ほとんどの場合オブジェクトに置き換えられます。
jdk が提供する強力なリフレクション機能を使用します。
package cn.tonyoliver.generics;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* 这个类用来测试类型擦除
*
* @author Tony
*
*/
public class Test03_GenericsRemove {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>();
// 1,编译器按泛型检查,类型报错,这是在编译时期
// list.add("chen");//The method add(Integer) in the type List<Integer> is not applicable for the arguments (String)
// 2,但在实际运行时,泛型的地方就被替代为通用类型Object
Class<?> clazz = list.getClass();
Method m = clazz.getDeclaredMethod("add", Object.class);
// 3,利用反射得到的对象是运行时对象,就可以设置非整型的数据
m.invoke(list, "chen");
System.out.println(list.get(0));
}
}
2. 収集
1。概要
- 現在のプログラムでは、複数のデータを配列に入れて格納することができますが、配列は複数のデータを格納するためのコンテナとして使用されます。
- 配列の長所と短所: データ型は単一型である必要がある + 配列の長さは一度作成されると不変である + 走査方法は単一である + 挿入と削除には適していない
- コレクションには多くの種類のツール クラスがあり、それらはすべて非常に厳密な継承構造を持ち、最上位の親クラスは Collection インターフェイスです。
2. コレクションの継承構造
上位層の形成では、主に下位層の共通特徴を抽出して抽象層を形成します。
下位層は主に、上位層が提供するさまざまなメソッドを使用します。
3. 収集インターフェース
1. 収集インターフェース
コレクション階層内のルート インターフェイス。コレクションはオブジェクトのセットを表し、コレクションの要素とも呼ばれます。一部のコレクションでは重複要素が許可されますが、他のコレクションでは許可されません。コレクションには、順序付けされているものと、順序付けされていないものがあります。
- リストインターフェイス: データは順序付けされており、繰り返すことができます。
- ArrayList サブクラス
- LinkedList サブクラス
- セットインターフェイス: データは順序付けされておらず、重複した値は保存できません
- ハッシュセット
- マップ インターフェイス: キーと値のペアのストレージ データ
- ハッシュマップ
- コレクションツールクラス
2. 一般的に使用される方法
- boolean add(E e): 要素を追加します。
- boolean addAll(Collection c): 小さなコレクションを大きなコレクションに追加します。
- boolean contains(Object o): このコレクションに指定された要素が含まれる場合は true を返します。
- boolean isEmpty(): このコレクションに要素がない場合は true を返します。
- イテレータ
<E>
iterator(): このコレクションの要素を反復するイテレータを返します。- boolean Remove(Object o): 指定された要素の単一インスタンスをこのコレクションから削除します。
- int size(): コレクション内の要素の数を返します。
- Object[] toArray(): オブジェクト要素を返します。
- Object[] toArray(): このコレクション内のすべての要素を含む配列を返します。
package cn.tonyoliver.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
/**
* 这个类用来测试Collection接口
*
* @author Tony
*
*/
public class Test04_Collection {
public static void main(String[] args) {
// 1,创建对象
// ArrayList is a raw type. References to generic type ArrayList<E> should be
// parameterized
// ArrayList是原始类型。对泛型类型ArrayList<E>的引用应参数化
// Collection c = new ArrayList();
Collection<String> c = new ArrayList<>();
// 2,调用方法
c.add("杨幂");
c.add("赵丽颖");
c.add("皮皮虾");
// c.add(123);//添加元素的类型,没有通过泛型的类型检查,会直接报错
System.out.println(c);
// c.clear();
System.out.println(c.contains("杨幂"));// true,判断集合中是否包含指定的元素
System.out.println(c.equals("杨幂"));// false,判断集合是否和指定元素相等
System.out.println(c.hashCode());// 获取集合在内存中的哈希码值
System.out.println(c.isEmpty());// 判断集合是否为空
System.out.println(c.size());// 获取集合中元素个数(集合的长度)
System.out.println(c.remove("赵丽颖"));// 移除集合中的指定元素
System.out.println("c" + c);
Object[] objs = c.toArray();// 把集合转成数组
System.out.println(Arrays.toString(objs));
// 集合间的操作
Collection<String> c2 = new ArrayList<>();
c2.add("周杰伦");
c2.add("杨幂");
c2.add("赵丽颖");
System.out.println(c.addAll(c2));// 向c集合中加入c2的数据
System.out.println("c" + c);
System.out.println(c.containsAll(c2));// 判断c中是否包含c2的所有元素
// System.out.println(c.removeAll(c2));//获取c和c2的差集
System.out.println("--c" + c);
System.out.println(c.retainAll(c2));
System.out.println("++c" + c);// 获取c和c2的交集
// 集合的迭代
// Iterator是一个接口,专门用来 迭代集合里的元素
Iterator<String> it = c.iterator();
while (it.hasNext()) {
System.out.println(it.next() + "===");
}
}
}
4. リストインターフェース
これはコレクション インターフェイスのサブインターフェイスであり、コレクション インターフェイスのすべての機能を継承します。
1. コンセプト
順序付けられたコレクション (シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リスト内の各要素が挿入される場所を正確に制御できます。ユーザーは、整数インデックス (リスト内の位置) に基づいて要素にアクセスし、リスト内の要素を検索できます。
2. 特長
- データは整然としています。
- 重複した要素の保存を許可します。
- 要素には整数のインデックスがあります。
- 複数の null を格納できます。
3. 一般的に使用される方法
Collection インターフェイスから継承されたメソッドもあれば、独自のメソッドも存在します。
- boolean add(E e): 要素を追加します。
- boolean addAll(Collection c): 小さなコレクションを大きなコレクションに追加します。
- boolean contains(Object o): このコレクションに指定された要素が含まれる場合は true を返します。
- boolean isEmpty(): このコレクションに要素がない場合は true を返します。
- イテレータ
<E>
iterator(): このコレクションの要素を反復するイテレータを返します。- boolean Remove(Object o): 指定された要素の単一インスタンスをこのコレクションから削除します。
- int size(): コレクション内の要素の数を返します。
- Object[] toArray(): オブジェクト要素を返します。
- Object[] toArray(): このコレクション内のすべての要素を含む配列を返します。
Listの独自メソッドは以下の通り
- void add(int index, E element) は、
指定された要素をリスト内の指定された位置に挿入します (オプションの操作)。- boolean addAll(int index, Collection<? extends E> c) は、
指定されたコレクション内のすべての要素をリスト内の指定された位置に挿入します (オプションの操作)。- E get(int index) は、
リスト内の指定された位置にある要素を返します。- int IndexOf(Object o) は、
このリスト内で指定された要素が最初に出現するインデックスを返します。このリストにその要素が含まれていない場合は、-1 を返します。- int lastIndexOf(Object o)
このリスト内で指定された要素が最後に出現するインデックスを返します。リストにこの要素が含まれていない場合は、-1 を返します。- ListIterator listIterator() は、
このリストの要素のリスト反復子を (適切な順序で) 返します。- ListIterator listIterator(int index)
リスト内の指定された位置から始まる、リスト内の要素のリスト反復子を (適切な順序で) 返します。- Eremove(intindex) は、
リスト内の指定された位置にある要素を削除します (オプションの操作)。- E set(int index, E element) は、
リスト内の指定された位置にある要素を指定された要素に置き換えます (オプションの操作)。- List subList(int fromIndex, int toIndex) は、
指定された fromIndex (包含) と toIndex (包含) の間のリストの部分ビューを返します。
ListIterator<E>接口是Iterator<E>的子接口,子接口丰富了遍历方式,除了可以顺序遍历,还可以逆向向前遍历。
リストトラバースメソッド
- イテレータのトラバース
- ListIterator のトラバーサル
- ループトラバースの場合
- for-each ループのトラバーサル
テスト
package cn.tonyoliver.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* 这个类用来测试List接口
*
* @author Tony
*
*/
public class Test05_List {
public static void main(String[] args) {
// 1,创建对象--泛型用来约束集合中的元素类型,但是只能写引用类型,不能写基本类型
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(2);
list.add(null);
// 2,特点:元素有序+允许重复元素,可以存放多个null
System.out.println(list);
// 3,调用方法
// --继承自Collection的方法们
List<Integer> list2 = new ArrayList<>();
list2.add(10);
System.out.println(list.addAll(list2));
System.out.println(list.contains(10));
System.out.println(list.isEmpty());
System.out.println(list.remove(1));
System.out.println(Arrays.toString(list.toArray()));
// List的特有方法们--是可以根据下标操作的方法们
list.add(2, 100);
System.out.println(list);// 在指定下标处插入指定的元素
System.out.println(list.get(5));// 获取下标为5的位置对应的元素
System.out.println(list.indexOf(2));// 获取数字2第一次出现的索引值
System.out.println(list.lastIndexOf(1));// 获取数字1最后一次出现的索引
System.out.println(list.remove(3));// 删除下标为3的元素
System.out.println(list);
System.out.println(list.set(3, 99));
System.out.println(list);
List<Integer> list3 = list.subList(2, 5);
System.out.println(list3);
// List的特有方法---迭代List集合
// Collection接口的方法:Iterator<E> iterator()
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
// List接口的特有方法:ListIterator<E> listIterator()
ListIterator<Integer> it2 = list.listIterator();
while (it.hasNext()) {
System.out.println(it2.next());
}
System.out.println();
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + "---");
}
// 增强for循环 --foreach循环--用来优化普通的for循环,可以用于遍历数组或者collection集合的,好处是高效且语法简洁
// 语法:for(遍历得到的数据类型 变量名:想要遍历的数组|Collection集合){循环体}
for (Integer in : list) {
System.out.println(in);
}
}
}
5. ArrayList実装クラス
1. コンセプト
ArrayList は List インターフェースの実装クラスであり、List または Collection の関数を利用できます。
2. 特長
- 最下層はクエリを容易にするための配列構造です。
List
可変サイズの配列のインターフェイスの実装。すべてのオプションのリスト操作が実装され、null
以下を含むすべての要素が許可されます。このクラスは、インターフェイスの実装に加えてList
、リストを格納するために内部で使用される配列のサイズを操作するメソッドも提供します。
3. オブジェクトの作成
- ArrayList() は、
初期容量 10 の空のリストを構築します。(jdk1.6)
- jdk1.6 は ArrayList オブジェクト作成時に容量 10 の配列を直接作成します;
- jdk1.8 は ArrayList オブジェクト作成時に空の配列を作成します。メモリを最適化するために、最初の要素が追加されたときに容量拡張が始まります。
テスト
package cn.tonyoliver.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* 测试ArrayList实现类
*
* @author Tony
*
*/
public class Test06_ArrayList {
public static void main(String[] args) {
// 1,创建对象
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(2);
list.add(null);
// 2,调用方法
// --继承自Collection接口的方法们
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(10);
System.out.println(list.addAll(list2));
System.out.println(list.contains(10));
System.out.println(list.isEmpty());
System.out.println(list.remove(1));
System.out.println(Arrays.toString(list.toArray()));
// --继承自List接口的方法们
list.add(2, 100);
System.out.println(list);
System.out.println(list.get(5));
System.out.println(list.indexOf(2));
System.out.println(list.lastIndexOf(1));
System.out.println(list.remove(3));
System.out.println(list);
System.out.println(list.set(3, 99));
System.out.println(list);
List<Integer> list3 = list.subList(2, 5);
System.out.println(list3);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
ListIterator<Integer> it2 = list.listIterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}
for (Integer it3 : list) {
System.out.println(it3);
}
}
}
6. LinkedList実装クラス
1. コンセプト
Listインターフェースの実装クラスであり、Listインターフェース、Collectionインターフェースのすべてのメソッドが利用でき、機能の拡張も可能です。
2. 特長
- 最下層はリンクリスト構造(追加・削除に適しています)
- List インターフェイスと同様に、繰り返し、順序付けができ、null を保存でき、添え字があります。
3. オブジェクトの作成
LinkedList() は
空のリストを構築します。
4. 一般的に使用される方法
- void addFirst(E e)
- void addLast(E e)
- E getFirst()
- E getLast()
- EremoveFirst()
- EremoveLast()
- ブール値 offerFirst(E e)
- ブール値オファーLast(E e)
- E ピークファースト()
- E ピークラスト()
- EpollFirst()
- EpollLast()
package cn.tedu.api;
import java.util.LinkedList;
/**
* 这个类用来测试LinkedList
*/
public class Test02_LinkedList {
public static void main(String[] args) {
//1,创建对象
LinkedList<Integer> list = new LinkedList<>();
//2,调用方法
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
//TODO特有方法 -- 对首尾元素的操作
list.addFirst(100);
list.addLast(200);
System.out.println(list.getFirst());//获取首元素
System.out.println(list.getLast());//获取尾元素
System.out.println(list.removeFirst());//移除首元素并返回首元素
System.out.println(list.removeLast());//移除尾元素并返回尾元素
}
}
7. インターフェースの設定
1。概要
Collection インターフェースから継承するため、親インターフェース Collection のすべてのメソッドを使用できます。
2. 特長
- 要素を繰り返すことはできず、NULL を 1 つだけ格納できます。
- 要素は順序付けされておらず、添え字もありません
- 主に重複排除に使用されます
3. 一般的に使用される方法
Set コレクションを反復処理する
package cn.tedu.api;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 这个类用来测试Set接口
*/
public class Test03_Set {
public static void main(String[] args) {
//1,创建对象
Set<Integer> set = new HashSet<>();
// 特点:Set无序 + 不能重复 + 没有下标 + 存null
set.add(90);
set.add(6);
set.add(56);
set.add(56);
set.add(33);
set.add(null);
// 迭代Set集合
Iterator<Integer> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
// for-each 迭代
for (Integer it2: set) {
System.out.println(it2);
}
}
}
8. HashSet実装クラス
1. コンセプト
これは Set インターフェイスの実装クラスであり、Set インターフェイスのメソッドを使用できます。
最下層は哈希表
構造体です。
このクラスは、ハッシュ関数が要素をバケット間で適切に分散すると仮定して、基本的な操作 (追加、削除、包含、サイズ変更) に対して一定時間のパフォーマンスを提供します。このセットの反復処理には、HashSet インスタンスのサイズ (要素の数) とバッキング HashMap インスタンスの「容量」(バケットの数) の合計に比例した時間がかかります。したがって、反復パフォーマンスが重要な場合は、初期容量を高く設定しすぎない (または負荷係数を低く設定しすぎない) ことが非常に重要です。
2. オブジェクトの作成
HashSet()
は新しい空のセットを構築します。サポートされている HashMap インスタンスにはデフォルトの初期容量 (16) と負荷係数 (0.75) があります。
package cn.tedu.api;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 这个类用来测试Set接口
*/
public class Test03_Set {
public static void main(String[] args) {
//1,创建对象
Set<Integer> set = new HashSet<>();
// 特点:Set无序 + 不能重复 + 没有下标 + 存null
set.add(90);
set.add(6);
set.add(56);
set.add(56);
set.add(33);
set.add(null);
// 迭代Set集合
Iterator<Integer> it = set.iterator();
while(it.hasNext()){
Integer in = it.next();//取数据 + 挪动指针
//TODO 如果取到null调用null.XXX一定会报空指针异常NullPointerException
//加一个判断条件可以有效的防止空指针异常
if(in != null) {
System.out.println(in.toString());
}
}
// for-each 迭代
for (Integer it2: set) {
System.out.println(it2);
}
}
}