JAVA的集合类及其他们的线程安全、红黑树基本概念

在java.util中,集合一般分为三类Set、List、map。今天就简单描述一下三种集合相关的面试常问问题。

 

1.Set

   HashSet底层实现:底层为HashMap存储 无序性

保持唯一性:首先HashSet会将对象进行哈希再存储,说先会在hashMap里寻找是否有相拥的哈希code,没有则插入,有则使用eqauls()比较存储在同一个桶内的对象是否相同。

   TreeSet底层实现:TreeSet 有序性

  2.list

ArrayList:底层实现数组

Linklist:底层实现链表

3.HshMap:

    底层实现:如果一个hash值上面低于8个则为链表,多于8个则为红黑树

    初始容量 16; 

    负载因子:0.75   

     啥是负载因子:举例:当前容量大于最大容量*0.75,则开始扩容

     为啥是0.75: 太高查询效率过慢,太低空间开销过大

    扩容倍数:2

      为啥是2:hashmap计算key值时,将hash出来的code值将数组大小减1进行与运算,经检验,2的倍数时,key指的碰撞率会降低,从而避免查询链表或者红黑树已达到增大效率。

4.集合安全类:

   1.原始的安全集合类:HashTable、Vector  synchronized修饰的方法,效率非常低

  2.修饰的安全集合方法 例子:Collection.synchronizedMap()方法,返回Map类,  不推荐 效率低 

  3.JUC包中的集合类:

               CopyOnWrite类:修改时通过复制的形式保持的一致性,空间开销较大,常用于读操作较多写操作较少的情况

              ConCurrent类:通过cas(compare and swap)方式优化,达到高效的高并发。 但在多个线程进行同时读取和修改的同时,读取的结果可能会出现偏差,这就是Concurrent集合类的弱一致性。

ps:   

cas表示compare and swap,先比较再替换。

5.红黑树:

       几点特性要记住:1.根节点为黑色。2.父子节点不能同时为红色。3.从任意一个节点出发,到叶子节点经历的黑节点树一样多。

        1.默认插入色为红色。修复违规的代价比较小

        2.修复违规方式:

                 变色、旋转

        3.插入节点时:

                根节点时:自身变为黑色

               父节点为黑色时:直接插入红色节点

              父节点为红色时:要把父节点变为黑色,再插入红节点

              uncle为红色时:染红祖父节点,uncle变为黑色

 

  红黑树优势:的最长路径不大于两倍的最短路径的长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中常用的集合类包括 List、Set、Map、Queue 等,它们分别具有以下特点: 1. List:List 接口是有序的集合,可以根据索引位置访问元素。常用的实现类有 ArrayList 和 LinkedList。ArrayList 实现了可变大小的数组,查询效率高,修改效率较低;LinkedList 实现了链表,查询效率较低,插入和删除效率高。 2. Set:Set 接口是无序的集合,不允许有重复元素。常用的实现类有 HashSet 和 TreeSet。HashSet 通过哈希表实现,插入和查询效率较高;TreeSet 通过实现,可以按照元素的自然顺序或者自定义比较器进行排序。 3. Map:Map 接口是键值对的集合,每个键最多只能映射到一个值。常用的实现类有 HashMap 和 TreeMap。HashMap 通过哈希表实现,插入和查询效率较高;TreeMap 通过实现,可以按照键的自然顺序或者自定义比较器进行排序。 4. Queue:Queue 接口是一种先进先出(FIFO)的集合,常用的实现类有 LinkedList 和 PriorityQueue。LinkedList 实现了双端队列,可以在队头和队尾进行插入和删除操作;PriorityQueue 实现了优先队列,可以根据元素的自然顺序或者自定义比较器进行排序。 以上集合类都是线程不安全的,如果需要使用线程安全集合类,可以使用对应的线程安全类,如 Vector、Hashtable、ConcurrentHashMap、ConcurrentLinkedQueue 等。 总的来说,Java集合类丰富、易用,可以满足各种不同的需求,是 Java 编程中不可或缺的一部分。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值