List,map,set的区别和作用

来源:互联网 发布:js获取图片原始尺寸 编辑:程序博客网 时间:2024/05/29 08:34

 Listmapset的区别和作用

1,什么是listmapset?

 

对于新手来说这三者可以理解为数组的延伸。

方便理解可以这样:首先,list可以理解为按顺序排放的数组,顺序不可打乱;map可以理解为具有指针指向的数组;set可以理解为存储的元素不能为重复的值的数组;

 

类层次关系如下:

Collection

List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
Hashtable
HashMap

WeakHashMap

 

总的说来,Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下: 

Collection<--List<--Vector 

Collection<--List<--ArrayList 

Collection<--List<--LinkedList 

Collection<--Set<--HashSet 

Collection<--Set<--HashSet<--LinkedHashSet 

Collection<--Set<--SortedSet<--TreeSet

 

 

2.List:其中的元素按一定顺序排序,元素可以重复。List有三种:ArraylistLinkedlistvector

 

一 Arraylist:其底层其实就是数组,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦;

二 Linkedlist:所有元素都以对象的形式存放在空间中,这些元素都是用指针连在一起(就比如一条锁链,所有的数据都连在这条锁链上,数据都是在锁链下一个接一个),但是寻找一个元素十分的麻烦,必须从第一个开始沿着指针一直向后寻找(如果学过数据结构的“链表”就非常好理解了);

三 vector:他的底层其实也是数组,只不过他多了一个线程安全锁;

所以总的来说,在运行效率来说:Arraylist大于vector大于LinkedlistArraylistvector的查询速度快但是插入速度却很慢,Linkedlist的查询速度慢但是插入速度快而方便;

 

 

 

map:通过“键”查找“值”,map中有HashMapLinkedHashMapTreemap,WeakHashMapIdentifyHashMap,他有一个key和一个value,我们可以通过key找到valuemap底层就是一个表(哈希表),每一个key都对应着一个value(你可以理解成一个为key的指针指向一个value,我们只要知道一个key的名字就可以通过这个key找到这个key对应的value);键和值的关联很简单,用put(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。Map(HashMap)可以理解为数组的数组,即通过hashCode()计算出相应的值,然后再在这个位置上查下一个数组,即用equals()方法查找到相应的对象(key),下面主要讲一下mapHashMap)中put()方法的实现。

 

One,如果当新放入的Key,value,首先是比较求keyhashcode值,如果,在hash表中相应的hash值没有被别的元素占用(即没找到相同的hash),则直接放入(所有的类都继承了Object类,Object类里面提供了两个关键的方法,hashCode()和equals())。

Two,如果当新放入的key,value,通过hashcode方法所求得keyhash值所映射的位置被别的元素占用了(也就是可能该位置有多个元素),则通过equals()方法(这个equals方法是key的而不是value)依次比较该位置下所有的元素,如果找到相同的值,继equals方法返回的是true,则覆盖该key所对应的value,如果不相同,则把该新元素放到该位置所对应的链表的头部。所以纵观这个过程,都是Key起作用,value没有起作用;

这个可以作为map结构底层数据模型:

List,map,set的区别和作用

 

一 HashMap Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。

二 LinkedHashMap 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

三 TreeMap 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由ComparabelComparator决定)TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

四 WeakHashMao 弱键(weak key)MapMap中使用的对象也被允许释放这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

五 IdentifyHashMap 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。

 

 

 

4.set:每个存入set的元素都必须是不重复的加入Set的元素必须定义equals()方法以确保对象的唯一性,有HashSetTreeSetLinkedHashSet

HashSet 它是基于 HashMap 实现的,使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的

TreeSet 集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用 了一个TreeMap.

LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程修改了该Set,则它必须保持外部同步。

 

0 0
原创粉丝点击