List,map,set的区别和作用
1,什么是list,map,set?
对于新手来说这三者可以理解为数组的延伸。
方便理解可以这样:首先,list可以理解为按顺序排放的数组,顺序不可打乱;map可以理解为具有指针指向的数组;set可以理解为存储的元素不能为重复的值的数组;
类层次关系如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
总的说来,Java
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
2.List:其中的元素按一定顺序排序,元素可以重复。List有三种:Arraylist,Linkedlist和vector;
一
二
三
所以总的来说,在运行效率来说:Arraylist大于vector大于Linkedlist;Arraylist与vector的查询速度快但是插入速度却很慢,Linkedlist的查询速度慢但是插入速度快而方便;
map:通过“键”查找“值”,map中有HashMap,LinkedHashMap,Treemap,WeakHashMap和IdentifyHashMap,他有一个key和一个value,我们可以通过key找到value,map底层就是一个表(哈希表),每一个key都对应着一个value(你可以理解成一个为key的指针指向一个value,我们只要知道一个key的名字就可以通过这个key找到这个key对应的value);键和值的关联很简单,用put(Object
One,如果当新放入的Key,value,首先是比较求key的hashcode值,如果,在hash表中相应的hash值没有被别的元素占用(即没找到相同的hash值),则直接放入(所有的类都继承了Object类,Object类里面提供了两个关键的方法,hashCode()和equals())。
Two,如果当新放入的key,value,通过hashcode方法所求得key的hash值所映射的位置被别的元素占用了(也就是可能该位置有多个元素),则通过equals()方法(这个equals方法是key的而不是value的)依次比较该位置下所有的元素,如果找到相同的值,继equals方法返回的是true,则覆盖该key所对应的value,如果不相同,则把该新元素放到该位置所对应的链表的头部。所以纵观这个过程,都是Key起作用,value没有起作用;
这个可以作为map结构底层数据模型:
一
二
三
四
五
4.set:每个存入set的元素都必须是不重复的加入Set的元素必须定义equals()方法以确保对象的唯一性,有HashSet,TreeSet和LinkedHashSet;
HashSet:
TreeSet:
LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程修改了该Set,则它必须保持外部同步。