话不多说,上图片
Collection 可以主要分为 set、List 、Queue 三种类型。这里 Map 是不属于 Collection 的,Map 是一个独立的数据结构。但是 Collention 又和 Map 的实现上又互相依赖。
List 有序 按进入的顺序存储,元素可以重复
List:次序是list最重要的特点,它保证了元素特定的顺序。List为Collection添加了很多方法,让List可以从中间添加或者移出元素(只推荐LinkedList)使用,一个List可以生成ListIerator(迭代器)。使它可以从两个方向遍历。
实现类:
1.LinkedList(双向链表,查找慢,会遍历大量元素,插入快,不安全)
对顺序访问进行了优化,向List中间插入与删除开销并不大,随机访问则相对较慢。它是基于双向链表的数据结构,有一个内部类作为存放元素的单元,用来存放元素本身及前后引用。
2.ArrayList(基于数组,查找快,插入慢,线程不安全)
由数组实现的List,允许对元素进行快速随机访问,但是向List中间插入与移出元素的速度很慢。ListIerator如果用来插入和移出元素,开销会非常大。
3.Stack类:Stack类继承自Vector,实现一个后进先出的堆栈(基于数组,安全,效率略低于ArrayList)
总结:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花费的开销,都是固定的。
2.对ArrayList而言,主要是在内部数组中增加一项,指向所添加的内容,偶尔可能会导致对数组中心进行分配;对LinkedList而言,这个开销是统一的,分配一个内部Entry对象就可以了。
3.ArrayList的空间浪费主要体现在List列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在每一个元素都要消耗相当的空间。
Set最简单的一种集合,无序,不重复
Set:一种最简单的集合,集合中对象不按特定的方式排序,并且不重复。
实现类:
1.HashSet:底层实现为哈希表(链表+数组)是Set接口中的一个子类,无需集合,采用hash存储,所以没有顺序,依赖于HashMap来实现,可null;HashSet的数据存储在HashMap的map中,对应于map中的key。使用hashCode的equals确保了对象一致性。
2.TreeSet:底层实现为二叉树。实现的是SortedSet接口,有序集合,依赖于TreeMap来实现/插入一个子集,默认升序,不可null;可以用compareTo方法返回0
3.LinkedHashSet:底层实现为链表和哈希表,线程不安全,存储的元素时有序的、唯一的,通过元素的hashCode和equels方法保证了元素的唯一性。
Quene:队列,先进先出
Map
方法put(Object key,Object value)添加一个"值"(想要得东西)和与"值”相关联的“键"(key)(使用它来查找)。方法get(Object key)返回与给定"健”相关联的“值,可以用containsKey()和containsValue()测试Map中是否包含某个"健"或"值".标准的Java类库中包合了几种不同的Map: HashMap, TreeMap. LinkedHashMap, WeakHashMap,ldentityHashMap。它们都有同样的基本接口Map。但是行为,效率、排序策略、保存对象的生命周期和判定"健"等价的策略等各不相同。
执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayLisl中搜索"键"是相当慢的。 而这正是HashMap提高速度的地方,HashMap便用 了特殊的值,称为"散列码"(hash code),来取代对键的缓慢搜索。“散列码"是“相对唯一“用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类0bject中的方法。
- HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显看提高性能。
- Map:维护"键值对"的关联性,便你可以通过"键"查找"值"
- HashMap:
Map基于散列表的实现,插入和查询键值对的开销是国定的。可以通过构造器设置容量capacity和负载因子loadfactor,以调整容器的性能。 - TreeMap:基于红黑树数据结构的实现。查看"键"或“键值对"时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap0方法的Map,它可以返回一个子树。
- WeakHashMap :弱键(weak key)Map.
Map中便用的对象也被允许释放;这是为解决特殊问题设计的。如果没有map之外的引用指向某个键",则此键可以被垃圾收集器回收。 - IdentifyHashMap: : 便用==代替equals(对键作比较的hash map.专为解决特殊问题而设计。
hashCode方法的作用:
(1)前言,想要明白hashCode的作用,你必须要先知道Java中的集合。
Java中的集合(Collection) 有两类,一类是List, 再有一类是Set。
前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
那么我们怎么判断两个元素是否重复呢?这就是0bject.equals方法了。
通常想查找一个集合中是否包含某个对象, 就是逐一取出每个元素与要查找的元素进行比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息,如果一个集合中有很多元素譬如成干,上万的元素,并且没有包含要查找的对象时,则意味着你的程序需要从该集合中取出成干上万个元素进行逐一比较才能得到结论,于是,有人就发明了一种哈希算法来提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。 这样一来, 当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了:如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了, 几乎只需要一两次。
全是你对