Java集合 (list,set,map)

List,Set,Map是集合体系最主要的三个接口.
list (有序、可重复)
List里存放的对象是有序的,同时也是重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随后面数据的移动,所有插入删除数据速度慢
ArrayList:
ArrayList是基于数组的,在初始化ArrayList时,会构建数组(Object[] elementData={}) 。ArrayList是一个无序的,它是按照添加的先后顺序排列,当然,他也提供了short方法,如果需要对Arraylist进行排序,只需要走这个方法,提供Comparator比较器即可。
LinkedList
LinkedList是基于链表的,它是一个双向链表,每个节点维护了一个prev和next指针。同时对于这个链表,维护了first和last指针,last指向第一个元素。LinkedList是一个无序的链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。
1.List接口的三个
Add元素:
LinkedList提供了几个添加元素的方法:addFirst、addLast、addAll、add等,时间复杂度为O(1)。
Remove元素:
LinkedList提供了几个移除元素的方法:removeFirst、removeLast、removeFirstOccurrence、remove等,时间复杂度为O(1)。
Get元素:
根据给定的下一个目标index,判断它first节点、last直接距离,如果index<size (数组元素个数)/2,就从first开始。如果大于,就从last开始。这个和我们平常思维不太一样,也许按照我们的习惯,从first开始。这也算是一点小心的优化吧。
Set (无序、不能重复)
Set里存放的对象是无序, 不能重复的,集合中的对象不按特定的方式排序,只是简单的把对象加入集合中。
HashSet
无序,允许为null,底层是HashMap,非线程同步
LinKedHashSet
有序,不允许为null,底层是HashMap+双向链接,非线程同步
TreeSet
有序,不允许为null,底层是TreeMap,非线程同步
Map (键值对、键唯一、值不唯一)
Map集合中存储的是键值对,键不能重复,字可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
HashMap
数组方式储存key/value,线程非安全,允许null作为key和value, key不可以重复, value允许重复,不保证元素迭代顺序顺序是按照插入时的顺序,key的hash值是先机算key的hashcode值,然后在进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要 求key必须重写equals和hashtable方法
默认初始值容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value, 就是一个Key后面有多个value;
Hashtable
Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable, 因此也导致了Hashtable写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null, 同时效率较低。
LinkedHashMap
LinkedHashMap保存了记录的插入顺序,在用lteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。
TreeMap
基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null, key不可以重复,Value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
遍历
总结:
Vertor和ArrayList
1、 verytor是考虑线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的如果不考虑到线程的安全因素,一般用arraylist效率比较高。
2、 如果集合中的元素的数目大于目前集合数组的长度时,vertor增长率为目前的数组长度为的100%,而arrylist增长率为目前数组的50%。如果在集合中的使用的数据比较大的数据,用的vector有一定的优势。
3、 如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,如果频繁的访问数据,这个时候使用vector和array list都可以。而如果移动的一个指定位置会导致后面的元素都发生移动,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据时其他元素不移动。
4、 ArrayList和 Vector是采用数组方式储存数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快,插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快。
HashMap与TreeMap
   1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
  2、 在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。两个map中的元素一样,但顺序不一样,导致hashCode()不一样。
同样做测试:
    在HashMap中,同样的值的map,顺序不同,equals时,false;
    而在treeMap中,同样的值的map,顺序不同,equals时,true,说 明,treeMap在equals()时是整理了顺序了的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值