Java構文の高度なセット、12

セット

コレクション:コンテナ、オブジェクトを保持するコンテナである、基本的なデータ型はインストールできません。

容器のアレイは、基本データ型を保持するために使用される、オブジェクトを保持するために使用することができます。

本質的には、データ構造の対応するセット、インタフェースクラスが実装する複数の達成する必要コレクションと地図シリーズ総称インタフェースを

コレクション

コレクションは、コレクションの要素と呼ばれるオブジェクトのグループを表します。他の人がいない間、いくつかのコレクションは、重複要素を可能にします。他の人が順序付けられていながら、いくつかのコレクションは、発注されます。

コレクション<E>はこのような方法(とリストセット)コレクション内の単一の共通セットを定義するインタフェースのすべての単一のセットの親、である、これらの方法は、すべての分別収集を動作させるために使用することができます。

コレクションのメソッド:

いいえ。 分類 署名方法 方法について説明します
1 加えます (E eを)追加 現在のコレクションに要素オブジェクトを追加します。
2 加えます addAll(コレクション<?Eが伸びる>その他) 複数の要素を追加すること、すべての要素が現在のコレクションの他のセットに追加され、これは、この∪他=。
3 [削除] クリア() 空のコレクション
4 [削除] 削除(オブジェクトobj) 等号のルールに従って、その後、何のオーバーライド型要素は、メソッドに等しくない場合、要素は、削除されるべきかどうかを決定する要素、等号の要素を()を削除リライト等しい場合、それは、==と等価です比較は、より多くのコンテンツになる傾向があります。
5 [削除] removeAll(コレクション<?>高専) 、複数の要素を削除して共通の要素と現在のセットを削除C、すなわち、これはこの= - この∩コル。サブセット
6 [削除] retainAll(コレクション<?>高専) 削除複数の要素、保持及びCがこの∩コルを=ことは、現在のコレクションに共通の要素であり、交差点
7 検索 int型のサイズ() 要素の数を取得します
8 検索 ブール値が含まれています(オブジェクトobj) これは、要素が含まれています。要素にはオーバーライド型要素がメソッドに等しくない場合エレメントは、削除されるべきかどうかを決定するために)(等しく、次いで一般的に、規則に従って比較すると等しい書き換え等しい場合、==と等価ですコンテンツ。
9 検索 ブールのcontainsAll(コレクション<?>高専) これは、複数の要素が含まれています。それは本のサブセットであるかどうかコルすなわち、現在のセットが設定コルのすべての要素を含むかどうかを決定します。
10 検索 ブールのisEmpty() コレクションは空です
11 トラバーサル オブジェクト[]のtoArray() コレクションの要素は、配列を返します
12 トラバーサル イテレータイテレータ() これは、イテレータオブジェクト、トラバースに設計されたコレクションを返します。

イテレータイテレータ

取得モード共通の要素のコレクションコレクションという。内部コレクションのIterableインタフェースのすべての実装では、内部クラスが実装インタフェースが存在しますイテレータ

  • public boolean hasNext()   繰り返し処理でさらに要素を持っている場合は[、それはtrueを返します。]

  • public E next()                    [次の要素の反復を返します。]
  • 無効 削除()                           [Iteratorを使用して、削除要素を]

イテレータの最初の要素は、次の方法の最初の呼び出しはイテレータが最初の要素を返し、その後、反復子のインデックスの意志を指し、最初の要素の前に次の方法で、反復子のインデックスを、呼び出す前に移動後、第二の要素を指し、等々、のhasNextメソッドの戻りの偽まで、コレクションの最後に到達し、要素のトラバーサルを終了することを示しています。

セットが要素を持っていない、とイテレータのnextメソッドを使用し続けた場合の要素のコレクション中に削除、java.util.NoSuchElementExceptionエラーは何の要素が発生しません

注意:不要在使用Iterator迭代器进行迭代时,调用Collection的remove(xx)方法,否则会报异常java.util.ConcurrentModificationException,或出现不确定行为。

增强for

增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的,或者说实现了Iterable接口的其他容器名。

for(元素的数据类型  变量 : Collection集合or数组){
  //写操作代码
}

Iterable接口

java.lang.Iterable接口,实现这个接口允许对象成为 "foreach" 语句的目标。

java.lang.Iterable接口的抽象方法:

  • public Iterator iterator():                        【获取对应的迭代器】

foreach本质上就是使用Iterator迭代器进行遍历的。

所以也不要在foreach遍历的过程使用Collection的remove()方法。

modCount

如果在Iterator、ListIterator迭代器创建后的任意时间从结构上修改了集合(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。这就是Iterator迭代器的快速失败(fail-fast)机制。

结构性修改是指:改变list的size大小,或者,以其他方式改变他导致正在进行迭代时出现错误的结果。

那么如何实现快速失败(fail-fast)机制的呢?

  • 在ArrayList等集合类中都有一个modCount变量。它用来记录集合的结构被修改的次数。

  • 当我们给集合添加和删除操作时,会导致modCount++。

  • 然后当我们用Iterator迭代器遍历集合时,创建集合迭代器的对象时,用一个变量记录当前集合的modCount。例如:int expectedModCount = modCount;,并且在迭代器每次next()迭代元素时,都要检查 expectedModCount != modCount

注意,迭代器的快速失败行为不能得到保证,因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测 bug。

自定义类时如果一个实现类不希望提供fail-fast迭代器,则可以忽略这个字段。

List

List接口特点:

  1. 它是一个元素存取有序的集合。即元素的存入顺序和取出顺序有保证。

  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List集合关心元素是否有序,而不关心是否重复

List接口的实现类有很多,常见的有:

ArrayList:动态数组  Vector:动态数组  LinkedList:双向链表  Stack:栈

List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法。

1、添加元素

  • void add(int index, E ele)                                                    【在[index]位置添加一个元素】 

  • boolean addAll(int index, Collection<? extends E> eles)    【在[index]位置添加多个元素】

2、获取元素

  • E get(int index)                                                                      【返回[index]位置的元素】

  • List subList(int fromIndex, int toIndex)                                  【截取[fromIndex,toIndex)部分的元素】

3、获取元素索引

  • int indexOf(Object obj)                                                          【返回obj在当前集合中第一次出现的下标】

  • int lastIndexOf(Object obj)                                                    【返回obj在当前集合中最后一次出现的下标】

4、删除和替换元素

  • E remove(int index)                                                               【删除[index]位置的元素,返回被删除的元素】

  • E set(int index, E ele)                                                            【替换[index]位置的元素,返回被替换的元素】 

5、遍历

在原来Iterator和foreach遍历的基础上增加了:

ListIterator listIterator()                                                                   【默认游标在[0]开始】

ListIterator listIterator(int index)                                                      【默认游标在[index]位置】

ListIterator

List 集合额外提供了一个 listIterator() 方法,该方法返回一个 ListIterator 对象, ListIterator 接口继承了 Iterator 接口,提供了专门操作 List 的方法:

  • void add():                                                                         【通过迭代器添加元素到对应集合】

  • void set(E e):                                                                     【用指定元素替换 nextprevious 返回的最后一个元素】

  • void remove():                                                                   【从列表中移除由 nextprevious 返回的最后一个元素】

  • boolean hasPrevious():                                                     【如果以逆向遍历列表,往前是否还有元素。则返回 true

  • E  previous():                                                                    【返回列表中的前一个元素。】

  • int previousIndex():                                                           【返回列表中的前一个元素的索引】

  • boolean hasNext()                                                               【以正向遍历列表时,如果列表迭代器有多个元素,则返回 true

  • E  next()                                                                               【返回列表中的下一个元素。】

  • int nextIndex()                                                                      【返回对 next 的后续调用所返回元素的索引。】

Set

set接口没有提供额外的方法。但是比Collection接口更加严格了。

Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。

Set集合支持的遍历方式和Collection集合一样:foreach和Iterator。

Set集合的实现类:TreeSet:按大小顺序,LinkedHashSet:按照添加的顺序,HashSet:无序

HashSet

HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。

java.util.HashSet底层的实现其实是一个java.util.HashMap支持,然后HashMap的底层物理实现是一个Hash表。

HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。因此,存储到HashSet的元素要重写hashCode和equals方法。

LinkedHashSet

LinkedHashSet是HashSet的子类,它在HashSet的基础上,在结点中增加两个属性before和after维护了结点的前后添加顺序。java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。

HashSet/LinkedHashSet:如何区别元素的不可重复。依赖于元素的hashCode和equals方法

TreeSet

底层结构:里面维护了一个TreeMap,都是基于红黑树实现的!

特点: 1、不允许重复        2、实现排序, 自然排序或定制排序

如果使用的是自然排序(Comparable),则通过调用实现的compareTo方法

自然排序:它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(T o) 方法比较返回值为0。

如果使用的是定制排序(Comparator),则通过调用比较器的compare方法

定制排序:使用定制排序判断两个元素相等的标准是:通过compare(T o1,T o2)比较两个元素返回了0。

如果希望保持一致性,在重写compareTo时,一般也会重写equals方法。不是语法要求,而且逻辑意义问题。

Collection系列的集合框架图

Map

Collection中的集合称为单列集合,Map中的集合称为双列集合。java.util.Map<K,V>

1、存储键值对(key,value),也称为映射关系,键值对是Map.Entry接口的实现类对象。

2、所有存储到Map中的key不能重复, 每个键只能对应一个值(这个值可以是单个值,也可以是个数组或集合值)。

3、所有存储到Map中的value可以重复

Map接口的API

1、添加

V put(K key, V value):                                    【将一对键值对添加到当前map中,同一个key如果put两次,第二次会覆盖上次的value】

void putAll(Map m):                                        【将另一个map中的所有键值对添加到当前map中】

2、删除

void clear():                                                    【清空所有映射关系】

V remove(Object key):                                   【根据key删除一整对键值对(key,value)】

3、查询

int size():                                                         【返回键值对的数量】

boolean containsKey(Object key):                 【是否包含某个key】

boolean containsValue(Object value):            【是否包含某个value】

V get(Object key):                                          【根据key获取value值,如果此映射不包含该键的映射关系,则返回 null。】

boolean isEmpty()                                       【如果此映射未包含键-值映射关系,则返回 true。】

4、遍历

Set<Entry<K,V>>  entrySet()                            【遍历所有的键值对,映射关系的 Set 视图 】

Set<K>  keySet()                                              【遍历所有的key,键的 Set 视图】

Collection<V>  values()                                    【遍历所有的value,值的 Collection 视图】

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

Map集合的遍历

 Map的遍历,不能支持foreach

(1)分开遍历:

  • 单独遍历所有key

  • 单独遍历所有value

(2)成对遍历:

  • 遍历的是映射关系Map.Entry类型的对象,Map.Entry是Map接口的内部接口。每一种Map内部有自己的Map.Entry的实现类。在Map中存储数据,实际上是将Key---->value的数据存储在Map.Entry接口的实例中,再在Map集合中插入Map.Entry的实例化对象

 Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。其中HashMap是 Map 接口使用频率最高的实现类。

HashMap和Hashtable的区别与联系

  • HashMap和Hashtable都是哈希表。

  • HashMap和Hashtable判断两个 key 相等的标准是:两个 key 的hashCode 值相等,并且 equals() 方法也返回 true。因此,为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

  • Hashtable是线程安全的,任何非 null 对象都可以用作键或值。不允许null键

  • HashMap是线程不安全的,并允许使用 null 值和 null 键。

LinkedHashMap

LinkedHashMap 是 HashMap 的子类。LinkedHashMap实现与 HashMap 的不同之处在于,LinkedHashMap维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。

TreeMap

基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

Properties

Properties 类是 Hashtable 的子类,Properties 可保存在中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

データにアクセスするとき、私たちはのsetProperty(String型のキー、文字列値)とメソッドのgetProperty(String key)メソッドをお勧めします。

APIドキュメントを参照するにはより多くの方法

セットとセットの間の地図セットの関係

設定された内部実装は、実際に地図です。HashSetの実装はHashMapのある内部、すなわち、TreeSetの内部実装はTreeMapのある、LinkedHashSetの内部実装でのLinkedHashMapあります。

レッツは、セットに一つだけの要素を保存するだけでなく、それを(キー、値)になる方法?

本来、キーの内部実装としてマップに追加要素の集合は、値として定数存在する物体オブジェクトが続きます。

図セットフレーム

コレクションツール

おすすめ

転載: www.cnblogs.com/Open-ing/p/11991461.html