Javaコレクションフレームワーク(1)
集合はオブジェクトを格納する最も一般的な方法であり、配列はオブジェクトを格納することもできるが、長さは固定されている.集合長は可変です.データには基本データ型が格納され、セットにはオブジェクトのみが格納されます.コレクションはオブジェクトを格納するためにのみ使用され、コレクションの長さは可変であり、コレクションは異なるタイプのオブジェクトを格納することができます.(実は、集合に格納できるのはオブジェクトの参照やアドレスです.)なぜ集合クラスが現れるのでしょうか.データが多くなるとオブジェクトにカプセル化され、オブジェクトが多くなると格納され、集合クラスが現れます.集合フレームワーク:
Collection(ルートノード)
|--List:要素は秩序化されており、要素は繰り返し可能である.この集合アーキテクチャにはインデックスがあるからです.
|--ArrayList:下位層のデータ構造は配列構造を用いている.特徴:クエリー、修正操作が簡単、挿入、削除操作が複雑
|--LinkedList:下位層のデータ構造はチェーンテーブル構造を用いている.特徴:挿入、削除操作が簡単、クエリー、修正操作が複雑
|--Vector:下位層は配列データ構造であり、Vectorは同期であり、ArrayListは非同期である.ArrayListに置き換えられました.
|--Set:要素は無秩序で、要素は繰り返してはいけません.
まずCollectionクラスを見てみましょう.add(Object o)メソッドがあります.パラメータはObjectなので、任意のオブジェクトを受け入れることができます.add()以外にもいくつかの方法がありますが、ここでは省略しますが、一般的な容器は添削改査の特性を備えています.反復器の概念を見てみましょう.
反復器とは?実は集合の要素の取り出し方です.反復器の特徴:各コンテナの下位層のデータ構造が異なるため、アクセス動作の実現方法が異なる可能性があります.この動作を1つの関数で記述するのに十分ではない場合、メモリ(add()メソッド)とは異なり、複数の機能が必要である.複数の機能を1つのオブジェクトにカプセル化します.このオブジェクトはコンテナの内部にあります.実は取り出し方式を集合の内部に定義し、取り出し方式は集合の内部の要素に直接アクセスすることができる.すなわち,この取り出し方式は内部クラスとして定義される.各コンテナのデータ構造が異なるため、取り出す動作の詳細も異なるが、判断と取り出すと、書く共性を抽出する共通の内容がある.これらの内部クラスはルールに合致しています.このルールはIteratorです.コレクションの反復オブジェクトを取得するにはどうすればいいですか?対外的に提供される方法:iterator()
次にCollectionのサブインタフェース--List:いくつかの特有の方法があり、下付きの方法を操作できるのはシステム特有の方法です.
増:add(index,element);addAll(int index, Collection collection);
削除:remove(index);
変更:set(index,element);
検索:get(index);subList(fromIndex, toIndex); listIterator();
また、indexOf()を使用して、コレクション内のオブジェクトの位置を取得することもできます.
ListIterator extends Iterator
List集合特有の反復器.ListIteratorは、Iteratorのサブインタフェースです.反復時に、集合オブジェクトのメソッドで集合内の要素を操作することはできません.ConcurrentModificationException異常が発生するためです.したがって反復時には反復器の方法でしか要素を操作できないが,Iteratorの方法は限られている(hasNext(),Next(),remove(),要素を判断,取り出し,削除する操作しかできず,追加,修正など他の操作をしたい場合はそのサブインタフェース,ListIteratorを使用する必要がある.このインタフェースはリストセットのlistIterator()メソッドとのみ取得できます.
リスト集合は,要素が同一であるか否か(例えば,集合にある要素が含まれているか否かを判断するか,あるいは集合中のある要素を除去するか,その関数があるか否かを先に判断する)を判断し,要素のequals()メソッドに基づいて,本明細書の最後尾にインスタンスが証明できる.
LinkedList特有の方法:
addFirst(); addLast();
getFirst(); getLast(); 要素を取得しますが、削除しません.集合に要素がない場合、NoSuchElementExceptionが表示されます.
removeFirst();removeLast();要素を取得しますが、要素は削除されます.集合に要素がない場合、NoSuchElementExceptionが表示されます.
JDK 1.6で代替方法が現れた:
offerFirst();offerLast();
peekFirst();peekLast();要素を取得しますが、削除しません.コレクションに要素がない場合nullが返されます
pollFirst();pollLast();要素を取得しますが、要素は削除されます.コレクションに要素がない場合nullが返されます
また、リストには、Vector:Vectorが比較的無駄な空間であり、列挙(Enumerationインターフェース、その機能とIteratorの機能が重複している)がVector特有の取り出し方である.VectorはすでにArrayListに取って代わられており、前述した.
Collection(ルートノード)
|--List:要素は秩序化されており、要素は繰り返し可能である.この集合アーキテクチャにはインデックスがあるからです.
|--ArrayList:下位層のデータ構造は配列構造を用いている.特徴:クエリー、修正操作が簡単、挿入、削除操作が複雑
|--LinkedList:下位層のデータ構造はチェーンテーブル構造を用いている.特徴:挿入、削除操作が簡単、クエリー、修正操作が複雑
|--Vector:下位層は配列データ構造であり、Vectorは同期であり、ArrayListは非同期である.ArrayListに置き換えられました.
|--Set:要素は無秩序で、要素は繰り返してはいけません.
まずCollectionクラスを見てみましょう.add(Object o)メソッドがあります.パラメータはObjectなので、任意のオブジェクトを受け入れることができます.add()以外にもいくつかの方法がありますが、ここでは省略しますが、一般的な容器は添削改査の特性を備えています.反復器の概念を見てみましょう.
反復器とは?実は集合の要素の取り出し方です.反復器の特徴:各コンテナの下位層のデータ構造が異なるため、アクセス動作の実現方法が異なる可能性があります.この動作を1つの関数で記述するのに十分ではない場合、メモリ(add()メソッド)とは異なり、複数の機能が必要である.複数の機能を1つのオブジェクトにカプセル化します.このオブジェクトはコンテナの内部にあります.実は取り出し方式を集合の内部に定義し、取り出し方式は集合の内部の要素に直接アクセスすることができる.すなわち,この取り出し方式は内部クラスとして定義される.各コンテナのデータ構造が異なるため、取り出す動作の詳細も異なるが、判断と取り出すと、書く共性を抽出する共通の内容がある.これらの内部クラスはルールに合致しています.このルールはIteratorです.コレクションの反復オブジェクトを取得するにはどうすればいいですか?対外的に提供される方法:iterator()
// foreach
for (Iterator it = .iterator(); it.hasNext(); ) {
// do something with it
}
次にCollectionのサブインタフェース--List:いくつかの特有の方法があり、下付きの方法を操作できるのはシステム特有の方法です.
増:add(index,element);addAll(int index, Collection collection);
削除:remove(index);
変更:set(index,element);
検索:get(index);subList(fromIndex, toIndex); listIterator();
また、indexOf()を使用して、コレクション内のオブジェクトの位置を取得することもできます.
ListIterator
List集合特有の反復器.ListIteratorは、Iteratorのサブインタフェースです.反復時に、集合オブジェクトのメソッドで集合内の要素を操作することはできません.ConcurrentModificationException異常が発生するためです.したがって反復時には反復器の方法でしか要素を操作できないが,Iteratorの方法は限られている(hasNext(),Next(),remove(),要素を判断,取り出し,削除する操作しかできず,追加,修正など他の操作をしたい場合はそのサブインタフェース,ListIteratorを使用する必要がある.このインタフェースはリストセットのlistIterator()メソッドとのみ取得できます.
リスト集合は,要素が同一であるか否か(例えば,集合にある要素が含まれているか否かを判断するか,あるいは集合中のある要素を除去するか,その関数があるか否かを先に判断する)を判断し,要素のequals()メソッドに基づいて,本明細書の最後尾にインスタンスが証明できる.
LinkedList特有の方法:
addFirst(); addLast();
getFirst(); getLast(); 要素を取得しますが、削除しません.集合に要素がない場合、NoSuchElementExceptionが表示されます.
removeFirst();removeLast();要素を取得しますが、要素は削除されます.集合に要素がない場合、NoSuchElementExceptionが表示されます.
JDK 1.6で代替方法が現れた:
offerFirst();offerLast();
peekFirst();peekLast();要素を取得しますが、削除しません.コレクションに要素がない場合nullが返されます
pollFirst();pollLast();要素を取得しますが、要素は削除されます.コレクションに要素がない場合nullが返されます
また、リストには、Vector:Vectorが比較的無駄な空間であり、列挙(Enumerationインターフェース、その機能とIteratorの機能が重複している)がVector特有の取り出し方である.VectorはすでにArrayListに取って代わられており、前述した.
import java.util.ArrayList;
import java.util.Iterator;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return "name: " + getName() + " age: " + getAge();
}
// , , , remove() contains() 。
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (this.getClass() != obj.getClass()) return false;
Person that = (Person) obj;
return (this.age == that.age) && (this.name.equals(that.name));
}
}
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<Person> test = new ArrayList<Person>();
for (int i=0; i<5; i++)
test.add(new Person("name" + i, i));
for (int i=0; i<5; i++)
test.add(new Person("name" + i, i));
System.out.println("remove(): " + test.remove(new Person("name1", 1))); // remove() equals()
System.out.println(" :");
for (Person p: test)
System.out.println(p);
test = singleElement(test);
System.out.println(" :");
for (Person p: test) {
System.out.println(p);
}
}
public static <E> ArrayList<E> singleElement(ArrayList<E> arrayList) {
ArrayList<E> temp = new ArrayList<E>();
for (Iterator it = arrayList.iterator(); it.hasNext(); ) {
// next() , hasNext()
E element = (E) it.next();
if (!temp.contains(element)) { // contains() equals() ,remove() equals()
temp.add(element);
}
}
/*
for (E element: arrayList) {
if (!temp.contains(element)) {
temp.add(element);
}
}
*/
return temp;
}
}