Java成神之路(七)集合类

java集合类

  1. ArrayList、LinkedList和Vector
    ArrayList vector基于数组实现。linkedList基于双向链表实现。
    ArrayList:线程不安全,查询数据的时间复杂度为O(1),add(e)插入末尾时间复杂度为O(1)add(int,e)插在指定插入的时间复杂度是O(n);容量不固定,有序,不使用索引查询时,需要遍历数组,使用equals()比较,
    Linkedlist:双向链表,插入、删除的时间复杂度啊都是1,增加和设置为N,每个链表节点,包含两个引用,一个时前驱,一个时后驱。
    Vector:动态数组存储,访问时间复杂度为1,插入时间复杂度为N,线程安全,支持序列化,支持克隆,性能比Arraylist略差。
  2. Synchronizedlist 、vector的区别。
    两者线程安全。两者Add时扩容机制不同,类如Vector 于Arraylist的扩容差异(要求快的使用vector),Synchronizedlist有比较好的扩容机制,可以将List子类转成线程安全的类,遍历时需要手动进行同步处理(迭代器无同步代码,需要在整个循环外加syncheonized(list)),可以指定需要锁定的对象。
  3. hashMap、hashtable、concurrenthashmap的区别
    hashtable:线程安全、数组与链表底层实现,key与value都不能为空,效率低(锁定整个hashtable),初始为11的长度,扩容机制只能为:new=old2+1,计算index方法:index = (hash & 0x7FFFFFFF) % tab.length。
    hashMap:线程不安全,数据与链表底层实现,可以空值,初始16,扩容为oid
    2,即都是2的N次幂。扩容时针对整个hash,需要重新计算所有的元素位置,当map中元素个数超过Entry数组的75%时,触发扩容,插入元素后方计算需不需要扩容(可产生无效值。)index=(hash&tab.length-1)。
    上面两个都是用hash算法来决定元素的存储,所有两者包含:容量、初始化容量、数量、负载因子(代表容量的多少)。最大的不同在于hashMapk可以在构造器中指定极限负载触发扩容值。越低越快,消耗越多。
    Concurrenthashmap:分段的数组与链表,线程安全。把整个map分为N个Segment,可以提供相同的线程安全。使用锁分离技术,可以进行并发的线程安全操作。Size()方法需要跨段。分段扩容。不允许空值。
  4. Set 与List的区别,Set如何实现不重复
    List(快速访问,有序插入):允许重复、允许空值、有序、继承conllection接口的接口,实现类常用为Arraylist 、LinkedList、Vector。
    Set(唯一值):不允许重复、只允许一个空值、无序,实现类:Hashset、linkedhashset(有序),treeset(有序)。
    Set 如何保证不重复:hashset其本质使用hashmap实现,在put时,会判断无法重复,将一个key-value对放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果两个key的hash值相同,那么它们的存储位置相同。如果这个两个key的equals比较返回true。那么新添加的Entry的value会覆盖原来的Entry的value,key不会覆盖。
  5. Collection与conllections的区别
    前者为接口,后者为工具类,静态类很多。
  6. Arrays.aslist获得list时需要注意什么:
    该方法是用于把数据转换为集合,但只体现在适配器层次上,只是转换接口,后台的数据仍然是数组,故而所获得的list不能使用集合的add、remove、clean等方法。其本质意义在数组的排序、搜索等。特别注意的是,int[] a={},lsit list=arrats.aslist(a)时,list.size()=1,该方法接受一个变长方法,可看作数组参数,所以需要注意不能使用基本类型的数组作为参数,应该使用其包装类。
  7. Enumeration与lterator的区别
    前者为枚举类、后者为迭代器。两者都为接口。
    前者只能读取,不能修改,后者可以删除
    前者不支持fail-fast机制,后者支持
    前者速度快,后者慢。
  8. Fail-fast 与fail-safe
    快速失败与安全失败
    Fail-fast:在遍历的同时,出现集合修改,抛ConcurrentModificationException异常,快速终止遍历.但并不是绝对的保证抛出。是一种错误检测方式。实现方法,在对象创建时生成体格不变的modcount ,在遍历时next时都会调用一个方法比较这个值,如果不同,就抛出异常。
    Fail-safe:在集合发生改变时,拷贝集合副本,在副本中进行遍历,需要额外的空间资源,同时也不能保证数据是最新值。
  9. Copyonwritearraylist 与concurrentskiplistmap
    Skiplist:跳表,实现key-value的第三中方式(hash、treemap),采用空间换时间的做法,效率比treemap快。插入和查找O(logn). Concurrentskiplistmap便是采用跳表。代替treemap。红黑树
    Copyonwritearraylist:cow容器,并发容器:开始共享,修改时才拷贝副本,延时懒惰策略。Copyonwriter容器写时复制容器,先复制,后修改,在覆盖引向,Copyonwritearraylist在添加元素时应该加锁,不如多线程时浪费大量内存(多个副本)。读的时候不用加锁,读的时候还是旧数据。适用于读多写少的场景(黑白名单)应该注意根据使用进行初始化。使用批量增加blackListMap.put(id,Boolean.TRUE);
  10. Apache 集合处理类
    Apache Commons集合类
  11. 不同版本hashmap的实现区别与原因
    1.8之前采用的是拉链法,存在负载因子和链长,会影响性能,1.8引入红黑树后,实现链长大于8后,采用红黑树,
  12. Stream在1.8中的使用。
    流,集合对象的增强,不是数据结构,而是一种方法,高级的ltertor,并行的遍历。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值