コレクションインターフェイスの概要

コレクションインタフェース

コレクションは、基本クラスインターフェイスのコレクションは、それが具体的な実装を提供しないで、コレクションクラスは、コレクションに代わって、Collectionインタフェースから継承されている要素が、このような繰り返しを許可していない他のいくつかのように一定のルールを遵守しなければならない含まれているルールですいくつかは、それらが二つのサブクラスのインターフェイスを誘導されるように、ソート、およびセット・リスト、最初の図で設定されたリストの下の差と参照されていないが、いくつかの並べ替えを繰り返すことを可能にします。

A、リストのインターフェイス

コレクションリストは、要素、すなわち、それが要素の順序を維持するために特定の順序を使用して挿入され、特定の位置に大きくなり、反復収集要素を順序付けを表す直接インターフェイスは、正確要素の位置を制御することが可能であり、使用することができますListインタフェースを実現するための要素にアクセスするための整数の方法のセットの主な指標は、ArrayListを、LinkedListは、ベクタ、スタックされています。

2.1、ArrayListの
ArrayListには動的配列でなく、私たちの最も人気のあるコレクションです。その基本的な操作は、サイズ、のisEmpty、取得、セット、持って追加し、イテレータやルール、さらにはnullを持つラインに任意の要素を可能にする反復子操作を。各ArrayListのアレイ容量の大きさを表す初期容量(10)を有します。コンテナの大型化でコンテナ要素でも増加します。ファストは、拡張操作のためにオーバフローしたとき、同時に容器に各要素に増える容量を確認してください。私たちが挿入されているどのように多くの要素をクリアするのであれば、それは時間と効率の廃棄物の過度な容量拡張と操作を避けるため、初期容量値を指定するのが最善の方法です。
ランダムアクセスでのArrayList良いです。一方、非同期のArrayListに。
2.2。LinkedListの

LinkedListのは、二重にリンクされたリストであるリストが原因ではなく、LinkedListのランダムアクセスであるので、あなたは、この要素を見つけますが、LinkedListのも簡単に挿入し、削除要素にすることができるという利点があるまで、最初から最後まで横断しなければならない要素にアクセスしたい場合は、その操作の基本的な方法に加えて、ArrayListにはまた、例えばgetFirstと/ GetLastのための追加取得、削除、LinkedListの最初または尾部にaddメソッドを、提供されてい
同じとArrayListをLinkedListのが同期されていない
複数のスレッドがリストにアクセスする場合は、あなたがしなければなりません独自のアクセスの同期を実現します。一つの解決策は、同期リストを構築するときにリストを作成することです:
リスト一覧= Collections.synchronizedList(新しい新しいLinkedListの(...));
2.3ベクター
およびArrayListの、のような、ベクトルは動的配列で、その差がベクトルの、ありますしたがってベクターは、その動作とArrayListのように、スレッドセーフの動的配列であることを同期。
スタック2.4
スタックは、最後のアウトスタック後に達成された、ベクトルから継承されました。スタックは、5つの追加的なアプローチは、ベクトルをスタックとして使用することができます提供しています。プッシュと基本的な方法をPOPは、スタックは、スタック内の要素の位置を検出する方法を検索し、空であるかどうかをテストする方法要素が覗くZhanding、空の方法が得られます。スタックした後、スタックは、作成したばかりの空です。

第二に、ハッシュセット

セットインタフェースレッツを言及する前に、私は、ストレージ・メソッドのセットを理解することは容易で、ハッシュセットについて話しています。セットが故障している、そして繰り返すことができないので、その後、順序付けられていないオブジェクトを確保するために使用されると、答えはハッシュコードを介して、ハッシュコードハッシュコード方式に基づいていることを繰り返していないどのような方法で設定され
、整数を計算する各オブジェクトのハッシュテーブルハッシュコードはオブジェクトの整数インスタンスによって生成され、ハッシュコードと呼ばれる、より正確には、異なるデータ・フィールドを有するオブジェクトは、異なるハッシュコードをもたらします。一般的に、ハッシュコードは、hashCodeメソッドによって生成されるので、あなたが見つけることができること、それは直接格納し、我々はコレクションに要素を追加するとき、コレクションが最初のhashCodeメソッドを呼び出しますあり、他の要素が存在しない場合は、直接保存。既に要素が存在する場合、これら2つの要素は、デポジットは、別のハッシュの異なる位置に同一でないと一致するようにequalsメソッドと呼ばれています。このプロセスでは、我々は多数の要素を堆積させるときに大幅に大幅に効率を向上させるコールの等号の数()メソッドを、低減することができます。ジャワの実装では、常にのhashCodeが等しく、独自のデザインは、メソッドに等しい場合は、だけでなく、比較的hashCodeを伴う要素を比較するときa.equals場合は、真である(B)。、、等しく、bが同じを持っている必要がありますハッシュコード。

ロールプレイング内のhashCodeので、ドメイン(コレクション内の位置を探して、対象領域)を見つけるために上。ハッシュコードセットがいくつかの領域に分割することができ、各オブジェクトは、それらのハッシュコード、ハッシュコードパケットにより算出することができる、オブジェクトのオブジェクト・ハッシュ・コードに格納された記憶領域に対応することができる各パケットは、に従って決定することができます面積が大幅クエリの効率を改善するための要素と一致するクエリの数低減
処理フローである
1に等しい場合、2つのオブジェクトは、次に、仕上げに、同じハッシュコードでない場合、2つのオブジェクトが等しくないと見なされるようにするかどうかを決定します等しいです。
2.2つの場合のオブジェクトは、それらは等しいと見なさ、又は考慮することができる二つのオブジェクトに至るまで、不均等に等しいです。
彼らはこの比較秩序と再現性、ない方法ではないので、アレイのリストとハッシュセットには、重要な、あるいは負担はありませんが、HashMapの、HashSetの、ハッシュテーブルのために、それは非常に重要になります。そのため、使用HashMapの、HashSetの、HashTableには注意を払う必要がありますのhashCode

三、インターフェイスの設定

  Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。

3.1、EnumSetの

  是枚举的专用Set。所有的元素都是枚举类型。

3.2、HashSetの

  HashSet堪称查询速度最快的集合,可以用add方法添加元素,因为其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。

3.3、TreeSetの

  基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现。它是使用元素的自然顺序对元素进行排序(红黑树),或者根据创建Set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

マップインターフェイス

4.1、HashMapの

  以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。

4.2、TreeMapの

  键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口

4.3、ハッシュテーブル

  也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低,现在基本上都是使用HashMap

類似点とコレクションの違い

6.1、ベクトル和のArrayList

  1,vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
  2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。
  3,如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。
    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

6.2、Aarraylist和のLinkedList

  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
  这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

6.3、HashMapの与TreeMapの

  1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。
  2、  HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。
  3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态。

6.4、ハッシュテーブル与ハッシュマップ

  1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。
  2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。
  3、值:只有HashMap可以让你将空值作为一个表的条目的key或value 。

コレクションの選択

7.1、のリストを選択

  1、对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用ArrayList
  2、LinkedList使用双向链表对元素的增加和删除提供了非常好的支持,而ArrayList执行增加和删除元素需要进行元素位移。
  3、对于Vector而已,我们一般都是避免使用。
  4、将ArrayList当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为List的频繁插入和删除而降低时,再考虑LinkedList。

7.2、セットの選択

  1、HashSet由于使用HashCode实现,所以在某种程度上来说它的性能永远比TreeSet要好,尤其是进行增加和查找操作。
  3、虽然TreeSet没有HashSet性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。

7.3マップの選択

おすすめ

転載: www.cnblogs.com/blackmlik/p/12077318.html