集合类:
一:什么是Bags ?
Bags就是实现了collection接口,可包含重复元素的无序的collection.
(在Collection中没有具体定义的类。)
二:Set 和 List 的区别:
1. Set:
(1).Set不含重复元素,即:不包含满足 e1.equals(e2) 的元素。
(2).Set 的 hashCode():返回set 的哈希码值。Set 的哈希码定义为此 set 中所有元素的哈希码和。其中 null 元素的哈希码定义为零。所以:任意两个 Set : set1 和set2,
s1.equals(s2) 就意味着 s1.hashCode() ==s2.hashCode();
(hashcode:比较的是内存地址。)
2. List:
(1). 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素
(2).列表通常允许重复的元素。更正式地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。
3. Map: (参考JAVA中文API)
(1). public interface Map<K,V>: 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值。
(2). public static interface Map.Entry<K,V>: 映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的惟一 方法是通过此 collection 视图的迭代器来实现。
(3). Set<Map.Entry<K,V>> entrySet(): 返回此映射中包含的映射关系的 set
视图。返回的 set 中的每个元素都是一个 Map.Entry
。
三: Iterator VS Enumeration:
1. Iterator: (参考JAVA中文API)
(1). Iterator:对集合进行迭代的迭代器。迭代器代替了Enumeration。迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
(2): Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口.
(3). 方法:
(I)boolean hasNext
()
: 如果仍有元素可以迭代,则返回 true。
(II) E next
()
: 返回迭代的下一个元素
(III) void remove
()
: 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
2. Enumeration: (参考JAVA中文API)
(1).实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement
方法将返回一系列的连续元素。
(2). Enumeration的两个方法:
(i) blooean hasMoreElements()
: 测试此枚举是否包含更多的元素。
(ii)Enumeration nextElement()
: 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
三:HashSet 和 TreeSet 的区别 :(参考JAVA中文API)
1. HashSet: (如果两个对象的hashCode相等,但不是同一个对象。则可以存入。)
(1). 由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
(2). 注意,此实现不是同步的。 如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须 保持外部同步。
(3). 此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出 ConcurrentModificationException。
(4). 如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
(5). HashSet按照hashcode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储。例如:
"abc" ---> 78,"def" ---> 62,"xyz" ---> 65在hashSet中的存储顺序不是62,65,78
2. TreeSet:
(1).此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行排序。此实现为基本操作(add、remove 和 contains)提供了可保证的 log(n) 时间开销.
(2). 注意,如果要正确实现 Set 接口,则 set 所维护的顺序(是否提供了显式比较器)必须为与等号一致(请参阅与等号一致 精确定义的 Comparable 或 Comparator)。这是因为 Set 接口根据 equals 操作进行定义,但 TreeSet 实例将使用其 compareTo(或 compare)方法执行所有的键比较,因此,从 set 的角度出发,该方法认为相等的两个键就是相等的。即使 set 的顺序与等号不一致,其行为也是 定义良好的;它只是违背了 Set 接口的常规协定。
(3). 注意,此实现不是同步的。如果多个线程同时访问一个 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步
四: Comparable VS Comparator : (参考JAVA中文API)
1. 此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法.
2. 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器(实际上,所有执行比较的 Java 核心类都具有 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序把值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)等同起来。)
3. intcompareTo(T o)
: 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回 -1、0 或 1
五:HashMap和Hashtable的区别:
(1).都属于Map接口的类,实现了将惟一键映射到特定的值上。
(2). HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
(3). Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
六: Collection 和 Collections的区别:
(1).Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
(2).Collection是个java.util下的接口,它是各种集合结构的父接口。
七:Vector:
同一个对象可以在Vector中加入多次。往集合里面加元素,相当于集合里用一根绳子连接到了目标对象。
八:ArrayList VS Vector :
(1). Vector效率低,是线程安全的,也就是说是同步的,当需要增长时,Vector默认增长为原来一培。
(2). ArrayList效率高,是线程序不安全的,不是同步的;当需要增长时, ArrayList是原来的一半。