1.コレクションインターフェイスの1つ(リストインターフェイス):
単一列のデータ、一連のオブジェクトにアクセスするためのメソッドを定義するコレクション
リスト:順序付けされた繰り返し可能なデータ-「動的配列」を格納し、元の配列を置き換えます
1. Listインターフェースの実装クラス:
ArrayList:Listインターフェースのメイン実装クラスとして、スレッドは安全でなく、非常に効率的です。最下層はObject [] elementDateを使用して
LinkedList を格納します:頻繁な挿入および削除操作の場合、このタイプの効率の使用はArrayListよりも効率的です。最下層は二重リンクリストストレージを使用します
ベクトル:jdk1.0バージョンに存在し、基本的に開発では使用されず、スレッドセーフ、低効率、下部はObject [] elementDateストレージを使用
2. ArrayListソースコード分析:オブジェクトを作成すると、最下層がインスタンス化されます(シングルケースモードの空腹の中国スタイル)。
2.1.jdk7:ArrayList list = new ArrayList(); //最下層は長さ10のObjectの配列を作成しますelementData
list.add(123); // elementData [0] = new Integer(123);
…
list.add( 11)//新しく追加された要素の数が10を超えると(容量が不十分)、容量は拡張されます。デフォルトでは、容量は元の1.5倍に拡張されます。
同時に、元の配列のデータを新しい配列にコピーする必要があります
結論:パラメーター付きのコンストラクターを使用することをお勧めします:ArrayList list = new ArrayList(int capacity)
2.2。jdk8でのArrayListの変更:オブジェクトは作成時に作成されませんでした:{}、追加が最初に呼び出されたときにインスタンス化されました(シングルモードレイジー)
ArrayList list = new ArrayList(); //基になるオブジェクト[ ]配列elementDataは{}に初期化され、長さ10の配列は作成されません
list.add(123); //最初にadd()を呼び出すと、最下層で長さ10の配列が作成され、データがelementData [0]
...
list.add(11)に追加されます//新しく追加されたとき要素の数が10を超える場合(容量が不十分)、容量は拡張されます。デフォルトでは、容量は元の1.5倍に拡張されます。
同時に、元の配列のデータを新しい配列にコピーする必要があります
結論:配列の作成を遅らせ、メモリを節約
3. LinkedListのソースコード分析
LinkedList list = new LinkedList(); // Nodeタイプの最初と最後の属性は内部的に作成され、デフォルト値はnull
list.add(123); // 123はNodeにカプセル化され、Nodeのオブジェクトが作成されます。
このコードは、 LinkedListの二重リンクリストの
プライベート静的クラスNode {
E item;
Node next;
Node prev;
Node(Node prev、E element、Node next){
this.item = element;
this.next = next;
this.prev = prev;
}
}
4.Vectorのソースコード分析:
jdk7および8のVector()コンストラクターを介してオブジェクトを作成するとき、最下層は長さ10の配列を作成しました。拡張する場合、デフォルトの拡張は元の配列の長さの2倍です
5.リストインターフェイスの一般的なメソッド
1.指定された要素をコレクション内の指定された位置に追加します。
public void add(intインデックス、E要素)
2. boolean addAll(int index、Collection <?Extends E> c)
コレクションcのすべての要素を指定された位置に挿入します。コレクションが変更された場合はtrueを返し、そうでない場合はfalseを返します。
3.コレクション内の指定された位置にある要素を返します。
public E get(intインデックス)
4.リストの指定された位置にある要素を削除し、削除された要素を返します。
パブリックE削除(intインデックス)
5.セット内の指定された位置にある要素を指定された要素に置き換え、更新前の要素を返します。
パブリックEセット(intインデックス、Eエレメント)
6、int indexOf(Object o)
は、リストコレクション内のoオブジェクトが最初に出現する位置を返します。リストコレクションにoオブジェクトがない場合は、-1を返します。
7.int lastIndexOf(Object o)
は、リストコレクション内の最後のoオブジェクトのインデックス位置を返します。
8.リストsubList(int fromIndex、int toIndex)
は、インデックスfromIndexからtoIndexまでの要素のセットを返します。
概要:一般的なメソッド
追加:追加(オブジェクトo):
削除:削除(intインデックス)/削除(オブジェクトo)
変更:セット(intインデックス、オブジェクトo)
チェック:取得(intインデックス)
挿入:追加(intインデックス、E要素)
長さ:サイズ()
トラバーサル:①イテレータイテレータ②forEach③for
インタビューの質問:リスト内の2つの削除方法を区別する
@Test
public void test2(){
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//[1, 2]
}
private static void updateList(List list){
// list.remove(2);
list.remove(new Integer(2));
}
@Test
public void test(){
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add(new String("Tom"));
list.add(false);
//详细可见Java集合框架(一)-----Collection接口中的Person类
list.add(new Person("Tom", 20));
list.add(456);
//默认调用toString方法
System.out.println(list);//[123, 456, Tom, false, Person{name='Tom', age=20}]
//1.public void add(int index, E element)
list.add(1,"BB");
System.out.println(list);
//2、boolean addAll(int index, Collection<? extends E> c)
List list1 = Arrays.asList(1,2,3);
list.addAll(list1);
System.out.println(list.size());//9
//3.public E get(int index)
System.out.println(list.get(0));//123
//4.int indexOf(Object o)
int i = list.indexOf(456);
System.out.println(i);//2(前面添加了一个BB),不存在-1
//5.int lastIndexOf(Object o)
System.out.println(list.lastIndexOf(456));
//6.public E remove(int index):可以按照索引和对象两种方法来进行删除
Object remove = list.remove(0);
System.out.println(remove);//返回被删除的元素
System.out.println(list);//[BB, 456, Tom, false, Person{name='Tom', age=20}]
//7.public E set(int index, E element)
list.set(1,"C");
System.out.println(list);
//8、List<E> subList(int fromIndex, int toIndex)
List list2 = list.subList(2, 4);//返回被指定的元素,原来的没有变化
System.out.println(list2);//[Tom, false]
}
6.インタビューの質問:ArrayList LinkedList Vector
類似点:3つのクラスはすべてListインターフェースを実装しており、データを格納する特性は同じです:順序付けされた繰り返し可能なデータを格納します。
違い:上記のポイント1、2、3、および4を参照してください