🗃️ コレクション#
いくつかの方法#
- add()
- addAll()
- remove()
- removeAll()
- clear()
- isEmpty()
- contains()
contains と remove は equals メソッドを呼び出します
コレクションに基本データ型を格納する場合、必ず基本型のラッパークラスにボクシングする必要があります
変更およびクエリのメソッドは提供されていません
🔍 イテレータ#
イテレータ
主に反復処理に使用され、イテレータを使用するとデータ構造の差異を隠すことができます
- hasNext()
- next()
- remove()
イテレータが作成されると、コレクションは変更できなくなります。変更する場合は、イテレータを再生成する必要があります
拡張 for ループ#
イテレータの省略形です。削除もできません
🐾 リスト#
順序があり、重複が可能です
ArrayList#
内部はオブジェクト配列で、クエリと変更の効率が高いです
- add(index,items)
- set(index,items)
- size()
LinkedList#
内部は双方向リンクリストで、ランダムな追加と削除の効率が高いです
- add(index,items)
- set(index,items)
- size()
🍊 セット#
順不同(データの追加と取り出しの順序は保証されません)
重複不可(重複した場合は追加されません)
TreeSet#
内部はTreeMap
です
TreeMap
の内部は赤黒木で、追加された要素は自動的に一定の形式でソートされます
TreeMap
に追加されるデータには比較器があります
したがって、比較器のないオブジェクトやカスタムオブジェクトを追加しようとするとエラーが発生します。また、比較には比較が必要なため、同じ型のデータしか追加できません
- 数字の場合、昇順
- 文字列の場合、各文字の ASCII コード
- 日付の場合、自然な日付
HashSet#
内部はHashMap
のK
部分です
HashMap
の内部はハッシュテーブルです
🤼♀️ Comparable#
比較器。追加されるTreeSet
の要素は Comparable インターフェースを実装し、インターフェースのcompareTo()
メソッドをオーバーライドする必要があります。
compareTo()
メソッドの戻り値はソートルールを表します。
要素を追加すると、コレクション内の要素が比較されるため、要素オブジェクトのcompareTo()
メソッドが呼び出されます。
==0
の場合、重複しているため追加されません。
<0
の場合、追加する要素が小さいため、前に配置されます。
>0
の場合、追加する要素が大きいため、後ろに配置されます。
import java.util.TreeSet;
public class Tree {
public static void main(String[] args) {
TreeSet<Object> tree = new TreeSet<>();
tree.add(new User("张三",18));
tree.add(new User("李四",13));
tree.add(new User("王五",32));
tree.add(new User("赵六",11));
System.out.println(tree);
}
}
class User implements Comparable {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
if (o instanceof User) {
User u = (User) o;
// this.getAge() - u.getAge() > 1で昇順ソート
return this.getAge() - u.getAge();
}
return 0;
}
}
🍭 Comparator#
比較器クラス。追加する要素はこのインターフェースを実装する必要はありません
Integer
クラスにはデフォルトの昇順比較メソッドがあります。降順にしたい場合は、Comparator
インターフェースを実装してソートルールを再定義するか、ソートできないObject
オブジェクト (Comparable
インターフェースを実装していない) をTreeSet
に保存する場合は、比較のためにComparator
が必要です。
保存する要素がソートできない(Comparable
インターフェースを実装していない)場合や、ソートルールが要件に合わない場合は、Comparator
インターフェースを実装し、compare()
メソッドをオーバーライドしてソートします。
Comparator
比較器とComparable
比較器が同時に存在する場合、Comparator
の優先度が高い
ここでは、変更には閉じ、拡張には開いています
匿名クラスと同時に使用する#
import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings("all")
public class UnNamed {
public static void main(String[] args) {
// TreeSet<Object> tree = new TreeSet<>(new MyComparator());
// 匿名クラスは比較器でよく使用されます
TreeSet<Object> tree = new TreeSet<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1は追加する要素です
// System.out.println(o1);
// o2はコレクション内の要素です
// System.out.println(o2);
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9で降順に並べ替え
return i2 - i1;
}
return 0;
}
});
tree.add(11);
tree.add(7611);
tree.add(1);
tree.add(100);
tree.add(660);
tree.add(98);
System.out.println(tree);
}
}
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1は追加する要素です
// System.out.println(o1);
// o2はコレクション内の要素です
// System.out.println(o2);
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9で降順に並べ替え
return i2 - i1;
}
return 0;
}
}
〽️ リストのソート#
Collections.sort(list)
ソートメソッド
void sort(Comparator<? super E> c)
にComparator
オブジェクトを渡してList
のソートメソッドを使用することもできます
🔗 ハッシュテーブル#
キーと値のマッピング関係を保存するために使用され、保存方法は配列にリンクリストを保存することです。ハッシュの衝突問題を解決するために使用されます
リンクリストのノードには 4 つの属性があります:
- ハッシュ値
- キー
- 値
- 次のポインタ
✔️ ジェネリック#
型チェック
ジェネリックを使用しない場合、コレクションには任意の型のデータを保存でき、データはすべてObject
型にキャストされます
欠点:取得するとObject
型のデータが得られ、オブジェクト固有の属性を使用する場合はダウンキャストが必要です
ジェネリックを使用すると、コレクションには単一の型のデータのみを保存できます
利点:データの型が一致しているため、ダウンキャストは必要ありません
欠点:単一のデータ型のみを保存できます。また、ジェネリック型には基本型を書くことはできません
public class Generic {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.method(1);
myClass.method("xx");
MyClass<String> mm = new MyClass<String>();
mm.m1("xxx");
// mm.m1(123);
}
}
// ジェネリックを設定した場合、データ型を渡さない場合はデフォルトでObject型になります
class MyClass<T> {
public void method(T obj) {
System.out.println(obj);
}
}