分類
Javaコンテナクラスは、2種類のコレクションと地図に分かれています
コレクション:異なるニーズに応じて、コレクションの概念を説明し、異なる実装を提供します。オブジェクトのリストコレクションは、挿入の順に格納されている必要があり、コレクションセットは、要素を複製することはできません。キューの操作の規則に従って要素のキューのセット。
マップ:マップのセーブユーザーがオブジェクト(キー)を介してオブジェクト(値)を見つけることができますオブジェクト、「上キー」です。
コレクション
- 要素を追加します
Collection<Integer> collection = new ArrayList<>(); //传统创建方式
Collections.addAll(collection,1,2,3,4,5); //为collection对象添加元素,理论上要快一点
collection.addAll(Arrays.asList(6,7,8,9,10)); //为collection对象添加元素
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); //接受可变参数,然后返回一个AbstractList类型的对象
//list.add(6); //运行时会报错,因为AbstractList对底层数组没有提供扩展机制
例えば、優先格納されたオブジェクトの最適なタイプについての仮定を作るためには、Arrays.asList()メソッド、つまりは自分の型パラメータを渡すことを言及する価値があります:
Arrays.asList(1,2,3,4,5); //那保存的对象类型就是Integer
List<Fruit> fruits = Arrays.asList(new Orange(), new Apple()); //这时会保存为其父类的类型
//Arrays.<String>asList(1); //可以在asList方法前加<>指定容器的类型,此时在向容器中添加其他类型就会在编译时报错
//List<String> l = Arrays.asList(1, 2, 3, 4); //返回的容器类型为Integer类型,却把他保存在String类型容器声明的变量中会在编译时报错
- 一覧
リストは、Collectionインタフェースの操作よりも多く提供し、すべてのデータオブジェクトのセーブ提供します。彼の実装クラスArraysListとLinkedListのが含まれます。両者の違いは、ランダムアクセスのために、基板としてのアレイ(配列表)を使用して、そのArraysListあります。しかし、削除、および(最も可能性が高いモバイルデータを大量に含んでいるため)の操作を挿入することが助長されていません;および二重リンクリストのLinkedListを大幅に根本的ではなく、便利なランダムアクセスなどの挿入や削除の操作を容易に使用して(最初の要素から開始する必要があります私が)の要素を見つけるまで、一つ一つを比較します。
LinkedListのが
基本となる実装の違いのほかに、LinkedListのは、データ構造スタック、キュー、(もちろん、実際には、Javaのスタックとキューは別々の実装を持っている)のような両端キューを達成するために、ArrayListのより多くの方法を提供します。
ここでは、当社独自のスタック構造を実現するためにLinkedListのメソッドを使用します
class Stack<E> {
private LinkedList<E> storage = new LinkedList<>();
public void push(E e) {
storage.push(e);
}
public E top() {
return storage.getFirst();
}
public E pop() {
return storage.pop();
}
public boolean isEmpty() {
return storage.isEmpty();
}
}
LinkedListのスタックのスタックのJava提供の使用を達成し、避けることをお勧めします。基礎となるスタックがポップアップ要素または要素は、アレイを拡張または収縮を伴う押下アレイを使用して実装されているからです。
2.イテレータ
イテレータ
イテレータは、一方向にのみ移動することができる唯一の4つの方法:
。Aイテレータ()、イテレータオブジェクトは、リスト内の最初のデータ要素の準備ができて得る
BのhasNext()を解析。リストには、要素は削除されませんがない
Cを。)(次は、次の要素をとる
と、d。(私たちはremoveメソッドを使用する前に次のメソッドを使用する必要があり、この手段を)削除最後の要素を削除)(削除
反復子
反復子があります具体的にはその:.以外イテレータとイテレータリストコンテナ用
。反復子は、双方向モバイルサポート
bはnextIndex(使用されてもよい)と素子電流のインデックスと最後の要素のポインタを取得するpreviousIndex()メソッド。インデックス
C。あなたは1削除要素値法を置き換えるためにセットを()を使用することができます。
-
セットには、
私たちは、多くの場合、要素の所有権を決定するための設定を使用するように設定コレクションは、重複した要素を保存されませんいます。HashSetの、TreeSetのLinkedHashSetのとは3点セットを実現することが重要です。
HashSetのはハッシュを保存保存されたデータを使用して、データストレージはすぐに障害を見つけることは容易です。
レッド使っTreeSetの-ストアのデフォルトにブラックツリーデータ構造は、昇順にソート。
挿入のためにデータを保存しているときLinkedHashSetのは、クエリの効率をある程度保証します。 -
地図は
Mapオブジェクトは、私たちは、オブジェクトを見つけることは容易に使用するオブジェクトのためのオブジェクト間のオブジェクトのマッピングを作成することができ、キーと値のペアで保存します。 -
キュー
LinkedListのキューは、このように遷移がキューの方法を使用して上向きのLinkedListを向けることができ、インタフェースを実装します。
優先度つきキュー
PriortyQueueは、キューは誰でも最初の位置ではありません確立された規則に従って彼の優先順位を確立することであると、プライオリティキューです。デフォルトでは、あなたが他のためには、コンストラクタに必要なコンパレータ(コンパレータ)を渡したい場合は、自然な順序に従ってキューを作成することです。 -
foreachのイテレータと
するとき、我々は、オブジェクトおよびCollectioinのアレイを使用することは、各要素を反復処理するために(forループ増強)のforeachを使用しています。彼らはそれをforeachのステートメントを横断することができますなぜ彼らは(アレーが実装されていない)反復処理可能なインタフェースを実現しているのでしかし、あなたは?知っています。限りオブジェクトが実装などのIterableインタフェース我々はクラスを作成しても、横にforeach文を使用することができます。例えば:
package test;
import javax.swing.*;
import java.io.Serializable;
import java.util.*;
public class Test {
public static void main(String[] args) {
TestIterable t = new TestIterable();
for (String s : t) {
System.out.println(s);
}
}
static class TestIterable implements Iterable<String> {
private String[] s = "to be or not to be".split(" ");
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int i = 0;
@Override
public boolean hasNext() {
return i < s.length ? true : false;
}
@Override
public String next() {
return s[i ++];
}
};
}
}
}
この時点で、我々はすでにオブジェクトTestIterableクラスを横断するforeachステートメントを使用しますが、私たちは、このオブジェクトの先行順走査の外にあることに加えて、今している場合でも、それを行う方法を、トラバーサル順トラバーサルを逆にすることができますか?継承は我々がライン上で彼のiteratorメソッドをオーバーライドし、その後、このクラスのサブクラスを書くことができるということは完全に可能であることは間違いありません。しかし、加えて、それを行うには良い方法はありませんでしょうか?私たちはうまくリターン反復処理可能なインタフェースを達成するための方法を書くことができるようにということなので、長いライン上のインターフェイスとして、foreachのステートメントは、反復処理可能なインターフェイスでキー嘘を容易にすることができることを見出しました。これは、モードと呼ばれる追加のインターフェースの必要性だけでなく、インタフェースアダプタの状態となっています。インタフェースの新しい実装がアダプタです。
package test;
import javax.swing.*;
import java.io.Serializable;
import java.util.*;
public class Test {
public static void main(String[] args) {
TestIterable t = new TestIterable();
for (String s : t) {
System.out.println(s);
}
for(String s : t.reverse()) {
System.out.println(s);
}
for (String s : t.random()) {
System.out.println(s);
}
}
static class TestIterable implements Iterable<String> {
private String[] s = "to be or not to be".split(" ");
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int i = 0;
@Override
public boolean hasNext() {
return i < s.length ? true : false;
}
@Override
public String next() {
return s[i ++];
}
};
}
public Iterable<String> reverse() {
return new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int i = s.length - 1;
@Override
public boolean hasNext() {
return i >= 0 ? true : false;
}
@Override
public String next() {
return s[i --];
}
};
}
};
}
public Iterable<String> random() {
return new Iterable<String>() {
@Override
public Iterator<String> iterator() {
List<String> list = new ArrayList<>(Arrays.asList(s));//将Arrays.asList(s)的结果又创建了一个新的ArrayList对象保存,如果直接在返回结果上进行洗牌则会导致s数组的顺序也被打乱
Collections.shuffle(list,new Random(12));
return list.iterator();
}
};
}
}
}