java 数据结构常见面试题

1、Collection 和 Collections 有什么区别?

java 容器分为两大类,集合序列 和 键值对。其中 Collection 是所有集合继承的最顶层接口,其中声明的方法有对集合的操作的 增删改查等,所有具体的集合类都继承这个接口。例如 ArrayList, HashSet 等。
Collections 是包装类,,其中包含很多静态方法,理解为操作集合的工具类。例如:add() sort() 等。

2、List、Set、Map 之间的区别是什么?

java 容器分为两大类,集合序列 和 键值对,其中 List 、Set 属于集合序列.
List 存储有序的、可重复的数据
Set 存储无序的(TreeSet 除外),不可重复的数据
Map 存储无序的(TreeMap除外),key 必须唯一不可重复,value 可以重复。

3、ArrayList 和 LinkedList 的区别是什么?

ArrayList 和 LinkedList 是 List 类的子类,因此 List 接口 和 Collection 接口共同支持的是 2者的

相同点:

  1. 元素有序,可重复
  2. 可以存储元素 null
  3. 都是线程不安全的
    不同点:
    LinkedList 除了实现 List 接口还实现了 Queue 接口,可以用来当做队列使用。

内部实现的不同点:

ArrayListLinkedList
底层数据结构动态数组双向链表
按照下标随机访问支持不支持
末尾处插入数据时间复杂度O(1)O(1)
指定index处插入数据时间复杂度O(n)O(n)
是否需要扩容需要动态扩容不需要,每次只是新建 Node 节点

插入和删除LinkedList 会比 ArrayList 快一些,即使都是 O(n),但是ArrayList 还涉及到扩容:

  • ArrayList O(n) = 查找O(1) + 移动O(n)
  • LinkedList O(n) = 查找O(n/2) +移动O(1),因为是双端队列查找时直接确定是前一半还是后一半,插入也只是新建 node 节点修改指向。

4、HasMap 的了解 学习总结

  1. 数组+链表(红黑树)的结构,具有数据和链表的优点,查找和插入都相对比较快,但是涉及到扩容
  2. 如何插入元素:
    1、是否需要初始化数组大小,默认16。
    2、构建(k,v) node,根据 k 计算出 哈希值 hash。% 上数组长度,得到数组下标。
    3、下标处没有元素则直接放置
    4、下标处有元素,则按照链表继续找,有相同key 则替换,无则添加在链表末尾。
    5、下标处 node 节点数量 > 8 ,会将链表转为红黑树结构
    6、下标处 node 节点数量/数组长度 >= 加载因子(默认为0.75),数组扩容至2倍,重新分配 node.
  3. 如何查找元素:
    1、根据 k 计算出 哈希值 hash。% 上数组长度,得到数组下标
    2、下标处没有元素,返回 null
    3、下标处有元素,顺着链表或者红黑树去查找,找的则返回value,否则返回 null
  4. 可以存储 (null, null) ,线程不安全的(hashTable 是线程安全的)
  5. 为什么扩容至 2 倍,其实在判断下标时时采用 (n-1)& hash,其中 n 是数组长度。当数组长度为 2的x次幂时,刚好 n - 1 的二进制表示每一位都是1, 执行 & 运算时能更好的均匀分布。

5、TreeMap 的了解 学习总结

  1. 底层结构为红黑二叉树,增删改查的效率都比较高
  2. 存放的元素是无序的(指的是元素顺序与插入顺序不一致,LinkedHashMap 有序)
  3. 默认会对键进行排序
    所以键必须实现自然排序和定制排序中的一种
    key 不可以为null(需要排序)
    key 重复进行覆盖指,比较器按照键中具体的排序规则返回 0,与key.equals() 无关
  4. 有两种排序方法
    自然排序算法,需要类实现 Comparable 接口,重写 compareTo()方法。
    定制排序 Comparator,一般采用匿名内部类的方式

6、LinkedHashMap 的了解 学习总结

  1. 底层是 HashMap + 双向列表
  2. 实现了元素有序
  3. 可以存储 null

7、HashMap 和 TreeMap 和 LinkedHashMap 的使用场景

强调:使用map接口的实现类时,切记不要修改key的属性值,否则就会找不到key 所对应的 value值

HashMap 效率最高
需要针对 key 进行排序时使用 TreeMap
需要保证插入的元素有序时使用 LinkedHashMap

8、HashSet 和 TreeSet 和 LinkedHashSet 的使用场景 学习总结

因为 Set 的底层结构是 Map ,所以三者的特点和使用场景可以参考HashMap 和 TreeMap 和 LinkedHashMap ,需要注意的是,Set 中元素是不允许重复的(Set 的值是底层时存储在 Map 的 Key 中的,key 是不能重复的)。

9、HashMap 和 HashSet 的区别是什么?

HashSet 底层也是实现了一个 HashMap
HashMap 存储了 key, value,HashSet 只存储了 key , value 是一个空对象,
HashMap 和 HashSet 都是可以存储 null 的。
HashMap 的 value 是可以重复的,但是 HashSet 因为只存储 key 是不可以重复的。

10、那些容器是线程安全的

我们常用的容器都是线程不安全的,线程安全的容器按照分类如下
List :Vector、Stack
Map: Hashtable
Set:

JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值