Java集合中常见的面试题 (收藏+保存+offer拿到手软)

Posted 陕西五花肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合中常见的面试题 (收藏+保存+offer拿到手软)相关的知识,希望对你有一定的参考价值。

* collection和collections之间的区别

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。

  • Set和List子接口(数据结构叫做ADT)

* List和数组比较

相似点:都有角标
不同点:
* 数组一定是物理连续的,List根据实现可以分成物理或逻辑连续的
* List是动态容量,数组是静态容量
* List也是放置相似的元素,但是由于JAVA语言的规定,List只能放置类型对象,数组可以放置基础数据类型
* List申明元素类型使用的是泛型,数组直接使用类型[]
* List如果要放置基础数据类型,必须使用包装类
* ArrayList查询速度快,LinkedList插入和删除速度快

* List的实现类

  • ArrayList:底层使用数组实现

ArrayaList扩容机制

  > 源码里面调用add方法,确保里面能放下最小值,放置第一个元素时,容量变成10,当放置第11的元素,调用 grow方法,将会扩容1.5倍 源码里面是这么讲的newCapacity = oldCapacity + (oldCapacity >> 1), 所以他是 1.5倍,放完以后判断,有没有超过他的最大值,没有超过,用arrayscopy 将其扩容,原来的值复制过去

* capacity大小,默认,每次扩容条件,扩容后capacity大小,capacity和size区别

  > capacity是容器的大小   size是存放元素的大小
  • LinkedList:底层使用双向链表实现

    • 没有扩容机制
    • 如果查找的内容在后半段,从后往前查找
  • CopyOnWriteArrayList:线程安全的ArrayList

    • 所有对数据有修改的操作都在副本中进行

    • 完成后使用CAS替换到原本中

    • 底层使用了可重入锁来实现

      缺点:内存占用问题,由于他的写 复制机制,会在内存中驻扎俩个对象的内存

      ​ CopyOnWrite容器不能保证数据的一致性,可能读取到旧数据

  • Collections.synchronizedList();

    • 这个方法也可以创建一个线程安全的List,他创建的方式方法是通过对List中的所有方法进行Synchronized的操作
  • List常用方法

    • 定位、求长、替换
  • Set和List之间的比较

    • 相同点:都是动态容量
    • 不同点:
      • Set没有角标
      • Set不能放置重复内容
      • Set的遍历过程只能使用迭代器
      • 大部分Set是有顺序的,但是部分Set是没有顺序的(规律比较难找)
  • Set实现:

    • HashSet:底层使用一个HashMap,通俗的讲,我们说HashSet是没有顺序的,但是其实只是顺序比较难找而已(和元素的hashCode值有关系)
    • TreeSet:升序排序,要求元素必须实现comparable接口
    • LinkedHashSet:放入顺序
  • 额外:Vector向量 线程安全的ArrayList,所有的方法加了锁

  • Map:顶层接口

    • 存的是K-V对
    • 五个实现类:Hashtable、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap

* HashMap底层原理

* DEFAULT_CAPCITY=1<<4 //aka16
* DEFAULT_LOAD_FACTORY = 0.75f
* 树化因子:8
* 塌缩因子:6
* 最大树化容量:64
* 底层实现:数组+链表+红黑树 -->拉链法
* 扩容规则:先算hashcode,确定桶角标,如果头有内容,则继续向下查找后续内容,如果是空,则放置。完成以后,判断两个条件,满足任何一个就需要扩容:第一个条件:元素个数超过容量*加载因子,需要扩容,第二个条件,单链长度大于等于8,同时容量不够64则需要扩容,扩容过程有一个点需要注意:rehash过程。如果单链长度大于等于8但是容量已经到64,则将表中元素转换成树节点,并进化成红黑树
* HashMap的节点使用尾插法,1.7使用头插法,但是多线程操作可能引起环
* 为什么扩容是2倍==  :方便计算 与 (16 .  32) ,hashmap效率就会提高(放置rehash和放置的效率提高,rehash的速率也会快)**,查找桶的速度提高

* ConcurrentHashMap底层原理

* 线程并同时兼顾效率的HashMap,在JUC包中
* 底层实现基本和HashMap一致,但是引入sync和CAS来保证了线程并发时的数据安全性。
* sync在头节点有值的使用sync,头节点没有值的时候,使用CAS
* 1.7使用的是分段锁,1.8使用sync和CAS

以上是关于Java集合中常见的面试题 (收藏+保存+offer拿到手软)的主要内容,如果未能解决你的问题,请参考以下文章

Java大数据工程师最常见的25道面试题,建议收藏

50道Java集合经典面试题(收藏版)

50道Java集合经典面试题(收藏版)

Java 集合容器篇面试题(上)-王者笔记《收藏版》

金九银十冲刺Java岗面试题核心每日知识点——集合框架(绝对硬核,建议收藏)

Java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)