java学习之旅(一)java基础知识(3)集合类

  1. 常用集合类的使用

    如果涉及到堆栈、队列等操作,应当考虑List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList
    哈希表的操作,作为Key的对象要正确复写equals和hashCode方法
    尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果将来要将ArrayList换成LinkedList时,客户端代码不用改变
    List可以有类似数组的下标操作,且允许有相同的元素存在;Map是以键值(KeyValue)的形式存在,不能存在相同的键

  2. ArrayList和linkedList以及vector的区别?

    ArrayList是使用数组的形式进行存储,所以进行随机访问的时候时间效率较低,然而对于插入删除等操作的时间复杂度则较高,与之相反LinkedList存储方式主要是链表的形式,所以对于他进行随机访问的话时间复杂度较高,而进行删除插入等操作则速度较快。vector 也是通过数组进行实现的,且相对于Arraylist来说,vector是同步的,所以他的速度较之ArrayList慢了些,而且他们都是继承自List集合,所以他们的集合是可重复的,且List能维护顺序。

  3. SynchronizedList和Vector的区别
    synchronizedList就是对ArrayList进行synchronized进行修饰所生成的类

1.SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
2.使用SynchronizedList的时候,进行遍历时要手动进行同步处理。
3.SynchronizedList可以指定锁定的对象。

  1. Hashmap 、Hashtable和ConcurrentHashmap的区别?

    Hashmap是使用键值对的形式存储数据的,Hashmap是通过数组与链表的形式实现的,但是在1.8之后加入了红黑树,他的默认大小为16 负载因子为0.75,扩容阈值为容量大小*负载因子,因为计算hash是为h&(length-1)如果大小不为2的指数的话会有空间资源剩余,而且0.75是通过计算得出的适用的负载因子大小,如果负载因子过大,那么索引速度就会变慢,而如果过小,就有许多空间资源浪费,相对于Hashtable,HashMap可以存储键值为null的数据,而Hashtable不行,Hashtable的默认大小为11,按照old2倍加1扩大,而且Hashtable是线程安全的。
    ConcurrentHashmap也是线程安全的,他将整个Hash桶进行分段segment也就是将这个大的数组分成了几个小的segment,而且对每一个segment进行加锁,所以在插入元素之前要确定插入哪一个segment片段,然后获取锁。所以当一个线程占用锁访问其中一段数据的时候,其他段的诗句也可以被访问。而且segment一般有16个。

  2. Set和List的区别?

    Set是没有顺序不能重复的集合,List是有序且能重复的集合。

  3. Set如何保证元素不重复?
    通过hashcode和equals方法进行比较如果重复的话是不允许进行添加到集合之中的。

  4. java8中stream的详细用法(具体请参照https://blog.csdn.net/justloveyou_/article/details/79562574
    在java8之中,stream提供了一种高效的且易于使用的处理数据的方式,
    相对而言,stream更像是一种高级的遍历器,隐式的对数据进行操作,单向不可往复,只能使用一次,像水流一样。而且stream是可以并行操作的。
    stream使用过程,创建stream,将stream转换成需要的stream,最后终止操作,得出所需要的结果
    filter:对满足条件的元素构成新的stream
    map:遍历形成新的stream
    distinct:去重操作
    排序操作:生成排序后的stream
    reducion操作:取结果操作。
    collect操作:对stream操作获取其中的值

  5. apache集合处理工具的使用

  6. 不同版本的jdk中Hashmap的实现的区别以及原因
    在jdk1.7之中是通过数组和链表的形式实现的,数组之中存储的是entry对象,默认长度为16,在向其中添加数据的时候,通过调用hashcode()方法算出相应数组的索引值,通过索引查找数组,如果数组之中没有对象,则直接插入进去。如果有对象,判断是否有对象,判断key值是否相等,相等则进行覆盖,否则发生碰撞,以前的元素下移。这时我们将equals和hashcode方法重写的严谨点,这种还是避免不了,因为数组的索引值是有限的,因此提供了负载因子默认为0.75防止碰撞,如果达到扩容阈值,那么就进行扩容。防止发生碰撞。
    在jdk1.8中的HashMap存储结构是由数组、链表、红黑树这三种数据结构形成,红黑树查询删除快新增慢。根据key的hash与table长度确定table位置,同一个位置的key以链表形式存储,超过一定限制链表转为树。
    表中数据超过8就进转换成树。

  7. collection和collections的区别
    collection是集合类的顶级接口类,它提供了集合的通用的接口方法,
    而collections是集合类的工具类/辅助类,为集合操作提供了一系列静态方法。

  8. Arrays.asLis获得的List使用时需要注意什么?
    该方法不适用于基本类型,
    该方法将数组和链表连接起来改变其中一个,另一个也跟着改变。
    不支持add和remove方法

  9. enumeration和iterator区别
    java中的集合类都提供了返回Iterator的方法,就是迭代器,它和Enumeration的主要区别其实就是Iterator可以删除元素,但是Enumration却不能。
    还有一点要注意的就是,使用Iterator来遍历集合时,应使用Iterator的remove()方法来删除集合中的元素,使用集合的remove()方法将抛出ConncurrentModificationException异常。
    Enumeration 与 iterator 都是迭代输出的方法,Enumeration先进后出,iterator先进先出。

  10. 快速失败和完全失败

    快速失败
    在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception
    完全失败
    采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历使用的。

copyonwritearrayList和concurrentskiplistmap
SkipList(跳表)
跳表具有如下性质:
(1) 由很多层结构组成
(2) 每一层都是一个有序的链表
(3) 最底层(Level 1)的链表包含所有元素
(4) 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

ConcurrentSkipListMap的底层是通过跳表来实现的。跳表是一个链表,但是通过使用“跳跃式”查找的方式使得插入、读取数据时复杂度变成了O(logn)。

跳表(SkipList):使用“空间换时间”的算法,令链表的每个结点不仅记录next结点位置,还可以按照level层级分别记录后继第level个结点。在查找时,首先按照层级查找,比如:当前跳表最高层级为3,即每个结点中不仅记录了next结点(层级1),还记录了next的next(层级2)、next的next的next(层级3)结点。现在查找一个结点,则从头结点开始先按高层级开始查:head->head的next的next的next->。。。直到找到结点或者当前结点q的值大于所查结点,则此时当前查找层级的q的前一节点p开始,在p~q之间进行下一层级(隔1个结点)的查找…直到最终迫近、找到结点。此法使用的就是“先大步查找确定范围,再逐渐缩小迫近”的思想进行的查找。

copyonwritearraylist

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值