填充容器可通过Collections.nCopies()和Collection.fill(),都采用单对象。fill()只能替换已有元素,不能添加新元素,可用Generator解决(利用泛型)。addAll方法是所有Collection子类的一部分。
LinkedHashSet维护的是保持了插入顺序的列表。用Generator填充,即覆盖了next()
调用iterator()一般返回一个匿名类的Iterator对象
每个java.util容器都有自己的Abstract类。若产生的容器是只读的,那需要提供的方法将减少到最少。
想检查Collection中的元素,必须使用迭代器。
执行各种不同的操作和移除的方法在Collection接口中都是可选操作,即实现类并不需要为这些方法提供功能定义(可定义,也可不定义)。若一个操作是可选的,编译器会要求只能调用该接口的方法。将方法定义成可选的原因:防止在设计中出现接口爆炸的情况。
Arrays.asList()会生成一个List,基于一个固定大小的数据,仅支持那些不会改变数组大小的操作。应把Arrays.asList()的结果作为构造器的参数传递给任何Collection或使用addAll/Collection.addAll静态方法。这样可生成允许使用所有方法的普通容器。
基本List大多数只调用add方法添加对象,使用get方法一次取出一个元素,以及条用iterator方法获取该序列的Iterator对象。
不同的Set实现不仅具有不同的行为,而且它们对于可以在特定的Set中放置的元素类型也有不同的要求。
具体:
Set(interface)
存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals方法以确保对象的唯一性。Set和Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet
为快速查找而设计的Set。加入HashSet的元素必须兴义hashCode方法
TreeSet
保持次序的Set,底层为树结构。元素必须实现Comparable接口
LinkedHashSet
具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入顺序),使用迭代器遍历时,远古三按插入顺序显示,元素必须定义hashCode方法
一般将HashSet作为默认选择,它对速度进行了优化。在覆盖equals方法使,最好总是同时覆盖hashCode方法。
对于SortedSet,TreeSet是其唯一实现。SortedSet是按对象比较函数对元素排序,而不是插入次序。要实现后者要求可用LinkedHashSet
除了并发应用,Queue仅用来实现LinkedList和PriorityQueue。
标准java类库中包含了Map的几种基本实现,包括HashMap,TreeMap,LinkedHashMap,WeakHashMap。ConcurrentHashMap,IdentityHashMap。
当在get方法中使用线性搜索时,执行速度回相当慢。HashMap中使用了散列码来取代对键的缓慢搜索。散列码是相对唯一的,用以代表对象的int值。它是通过对该对象某些信息进行转换而生成的。其中hashCode方法是根类Object中的方法。所以所有java对象都能产生散列码。
具体Map信息:
HashMap:
Map基于散列表的实现(它取代了HashTable)。插入和查询开销固定。可以通过构造器设置容量和负载因子调整性能。
LinkedHashMap
类似于HashMap,迭代遍历取得的顺序是插入顺序。只比HashMap慢一点,迭代访问更快
TreeSet
基于红黑树实现,实现Comparable或者Comparator接口。所得到的的结果是经过排序的。TreeMap是唯一带有subMap方法的Map,它返回一个子树
WeakHashMap
弱键(weak key)映射,允许释放映射所指向的对象。如果映射之外么有引用指向某个键,则此键可被GC回收
ConcurrentHashMap
线程安全的Map,它不涉及同步加锁
IdentityHashMap
使用==代替equals方法,对键进行比较的散列映射
1533

被折叠的 条评论
为什么被折叠?



