概述
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
概要
Collection接口:Collection 层次结构 中的根接口.
Map接口:将键映射到值的对象。
一、Collection接口
子接口:List接口,Set接口。
List接口的常用的已知实现子类有:ArrayList,Linkedlist。
Set接口的常用的已知实现子类有:HashSet,TreeSet。
Collection接口是Collection层次结构的根接口,Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。包 (bag) 或多集合 (multiset)(可能包含重复元素的无序 collection)应该直接实现此接口。
Collection层次结构的共性方法:
添加元素:add(E e)和addAll(Collection<? extends E> c)
删除元素:boolean remove(Object o) 、boolean removeAll(Collection<?> c)和void clear()
判断:
集合判断:boolean contains(Object o) 、boolean containsAll(Collection<?> c)
元素判断:boolean equals(Object o) 、boolean isEmpty()
交集:boolean retainAll(Collection<?> c)
转换为数组:Object[] toArray() 和<T> T[]toArray(T[] a)
获取:
int hashCode() 返回此 collection 的哈希码值。
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
int size() 返回此 collection 中的元素数。
另外Collections类:完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。该类没有构造函数,里面的构造方法均是静态的方法,可以用类直接调用。里面的方法有排序、查找、逆转等类别。这是一个帮助类。
注意:集合的添加操作,说明集合中存储的元素是Object对象的地址(或引用)。
1、1List接口
List接口:有序的 collection(也称为序列)。
特点:
- 有序,根据元素的整数索引访问元素;
- 允许重复的元素 ,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2(若列表如果列表本身允许 null 元素的话,通常它们允许多个 null 元素);
- 列表(像 Java 数组一样)是基于 0 的,提供了 4 种对列表元素进行定位(索引)访问方法;
- 提供了两种搜索指定对象的方法,这两种方法缺点在于是高开销的线性搜索;
- 提供了两种在列表的任意位置高效插入和移除多个元素的方法;
- 提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器;
- 在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定。
注意:尽管列表允许把自身作为元素包含在内,在这样的列表上,equals 和 hashCode 方法不大适用。
1、1、1类 ArrayList
概述:List 接口的大小可变数组的实现。采用的结构是数组。特点:
- 实现了所有可选列表操作,并允许包括 null 在内的所有元素;
- 提供一些方法来操作内部用来存储列表的数组的大小;
- 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小,随着向 ArrayList 中不断添加元素,其容量也自动增长;
- 在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量;
注意:此类大致上等同于 Vector 类,除了此类是不同步的。也就是说如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:List list = Collections.synchronizedList(new ArrayList(...)); 。
1、1、2LinkList类
该类是:List 接口的链接列表实现。采用的结构是双重链接列表。
特点:
- 实现所有可选的列表操作,并且允许所有元素(包括 null)。
- LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法;(这些操作允许将链接列表用作堆栈、队列或双端队列)
- 实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
- 所有操作都是按照双重链接列表的需要执行的。
- 在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
注意:LinkList类与ArrayList类一样,他的实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:List list = Collections.synchronizedList(new LinkedList(...));
1、2 Set接口
- 不能重复,即set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素;
- 不允许某个 set 包含其自身作为元素;
- 所有构造方法以及 add、equals 和 hashCode 方法的协定上,Set 接口还加入了其他规定。
1、2、1 HashSet类
HashSet类:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持,采用的数据结构是哈希表。
特点:
- 它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变;
- 此类允许使用 null 元素;
- 基本操作性能稳定。(这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此 set 进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低))
注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:Set s = Collections.synchronizedSet(new HashSet(...));
1、2、2 TreeSet类
TreeSet类是:基于 TreeMap 的 NavigableSet 实现。采用的数据结构是二叉树。
特点:
- 使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
- 为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销
- TreeSet类实例使用它的compareTo(或 compare)方法对所有元素比较,即使 set 的顺序与 equals 不一致,相等的两个元素就是相等(这点与Set接口的常规协定不一样。)因此保证元素的唯一性是通过方法compareTo或者compare.
注意:此实现不是同步的。如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须 外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSortedSet 方法来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问:SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
总结:
1、List是有序的,可重复的。
2、Set中元素不能重复,需要确保元素的唯一性。那么由于HashSet的数据结构是哈希表,且实现方法是按照Set接口的协议规范来的(即比较是通过equals),故HashSet确保元素唯一性的方法是hashCode()和equals().而TreeSet采用的数据结构是二叉树,且没有完全按照Set接口的set协议规范来实现,故TreeSet确保元素唯一性的方法是:compareTo()或compare.3、ArrayList,LinkList TreeSet HashSet线程不安全,因为实现不能同步,但是Vector线程是安全的。
二、Map接口
Map接口:将键映射到值的对象,也就是键值对集合。
特点:
- 一个映射不能包含重复的键;
- 每个键最多只能映射到一个值,即键Key不能重复,但是值可以。
- Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。
- 不允许某个映射将自身作为一个键包含,但允许某个映射将自身作为值包含(注意:在这样的映射上 equals 和 hashCode 方法的定义将不再是明确的。)。
- 缺点在于此接口中包含的“破坏”方法可修改其操作的映射,如果此映射不支持该操作,这些方法将抛出 UnsupportedOperationException。如果是这样,那么在调用对映射无效时,这些方法可以(但不要求)抛出 UnsupportedOperationException。例如,如果某个不可修改的映射(其映射关系是“重叠”的)为空,则对该映射调用 putAll(Map) 方法时,可以(但不要求)抛出异常。
主要实现的类有:TreeMap , HashMap, HashTable。
实现类所拥有的共性方法:
增加映射关系:
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
移除映射关系:
void clear()从此映射中移除所有映射关系(可选操作)。
V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
判断映射关系:
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
boolean equals(Object o) 比较指定的对象与此映射是否相等。
boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。
获取映射的视图:
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
Collection<V> values()返回此映射中包含的值的 Collection 视图。
获取映射的相关值:
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode() 返回此映射的哈希码值。
int size() 返回此映射中的键-值映射关系数。
2、1HashMap类
- 此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
- 此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。
说明:容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示: Map m = Collections.synchronizedMap(new HashMap(...));
2、2Hashtable类
该类:实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。采用的数据结构是哈希表。
特点:
- 为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
- Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子。
- 线程安全
2、3TreeMap类
- 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
- 此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。
- 有序映射所保持的顺序(无论是否明确提供了比较器)都必须与 equals 一致
- 线程不同步,解决办法:使用 Collections.synchronizedSortedMap 方法来“包装”该映射,即SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
总结:
1、TreeMap有序,Hashtable、HashMap无序。
2、TreeMap、HashMap线程不安全,Hashtable线程安全。
3、Map接口采用的是映射的机制,TreeMap采用的数据结构是二叉树,而Hashtable和HashTable采用的是哈希表。
参考代码:
List al=new ArrayList(); al.add("zhangsan1"); al.add("zhangsan2"); al.add("zhangsan3"); al.add("zhangsan3"); al.add("zhangsan4"); al.add("zhangsan5"); System.out.println("ArrayList对象是:"+al); al.remove(2); System.out.println("删除zhangsan3后的ArrayList对象是:"+al); System.out.println("判断ArrayList对象是否包含对象zhangsan3的结果是:"+al.contains("zhangsan3")); /*ArrayList对象是:[zhangsan1, zhangsan2, zhangsan3, zhangsan3, zhangsan4, zhangsan5] 删除zhangsan3后的ArrayList对象是:[zhangsan1, zhangsan2, zhangsan3, zhangsan4, zhangsan5] 判断ArrayList对象是否包含对象zhangsan3的结果是:true */ HashSet hs=new HashSet(); hs.add("lishi1"); hs.add("lishi2"); hs.add("lishi3"); hs.add("lishi3"); hs.add("lishi4"); System.out.println("HashSet对象是:"+hs); /*HashSet对象是:[lishi1, lishi2, lishi3, lishi4] * 结果说明:Set中不允许元素重复*/ Hashtable ht=new Hashtable(); ht.put("one", 1); ht.put("two", 2); ht.put("two", 1); ht.put("three", 2); ht.put("four", 3); System.out.println("Hashtable对象是:"+ht); /*Hashtable对象是:{two=1, one=1, three=2, four=3} * 结果说明Map中,键不可重复,值可重复,如键重复,值是最近一次put操作的值 */
最后
以上就是欣慰小天鹅为你收集整理的黑马程序员——java语言基础部分——集合体系之Collection、Map一、Collection接口二、Map接口的全部内容,希望文章能够帮你解决黑马程序员——java语言基础部分——集合体系之Collection、Map一、Collection接口二、Map接口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复