Java集合 高频面试题(一)

2022/2/24 20:52:29

本文主要是介绍Java集合 高频面试题(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

说说 ListSetQueueMap 四者的区别?

  • List(对付顺序的好帮手):存储的元素是有序的、可重复的
  • Set(注重独一无二的性质):存储的元素是无序的、不可重复的
  • Queue(实现排队功能的叫号机):按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的
  • Map(用 key 来搜索的专家):使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x"代表 key,"y"代表 value,key无序的、不可重复的,value无序的、可重复的,每个键最多映射到一个

如何选用集合?

主要根据集合的特点来选用,

比如我们需要根据键值获取到元素值时就选用 Map 接口下的集合

需要排序时选择 TreeMap, 不需要排序时就选择 HashMap,

需要保证线程安全就选用 ConcurrentHashMap

当我们只需要存放元素值时,就选择实现 Collection 接口的集合,

需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet,

不需要保证唯一就选择实现 List 接口的比如 ArrayList 或 LinkedList,

然后再根据实现这些接口的集合的特点来选用。

为什么要使用集合?

当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组

但是,使用数组存储对象具有一定的弊端,因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用来存储多个数据的。

数组的缺点是一旦声明之后,长度就不可变了:同时,声明数组时的数据类型也决定了该数组存储的数据的类型:而且,数组存储的数据是有序的、可重复的,特点单一。

但是集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。

Arraylist 和 Vector 的区别?

  1. ArrayList 是 List 的主要实现类,底层使用 Object[]存储,适用于频繁的查找工作,线程不安全;
  2. Vector 是 List 的古老实现类,底层使用 Object[]存储,线程安全的。

Arraylist 与 LinkedList 区别?

是否保证线程安全:

ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

底层数据结构:

Arraylist 底层使用的是 Object 数组:LinkedList 底层使用的是 双向链表数据结构

插入和删除是否受元素位置的影响:

  • a.ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。比如:执行 add(Ee)方法的时候,ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 1)。但是如果要在指定位置 i 插入和删除元素的话 addlint index.Eelement)时间复杂度就为**(n-i)**,因为在进行上述操作的时候集合中第 i 和第个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。
  • b.LinkedList 采用链表存储,所以,如果是在头尾插入或者删除元素不受元素位置的影响(add(Ee)、addFirst(Ee)、addLast(Ee)、removeFirst()、removeLast()),近似(1),如果是要在指定位置 i 插入和删除元素的话(add(int index,Eelement) remove(Obiecto))时间复杂度近似为 O(n),因为需要先移动到指定位置再插入。

是否支持快速随机访问:

LinkedList 不支持高效的随机元素访问,而ArrayList 支持

快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index)方法)。

内存空间占用:

ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间

而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。

Comparable 和 Comparator 的区别?

comparable 接口实际上是出自 java.lang 包它有一个compareTo(Object obj)方法用来排序

comparator 接口实际上是出自 java.util 包它有一个compare(Object obj1,Object obj2)方法用来排序

一般我们需要对一个集合使用自定义排序时,我们就要重写 compareTo(方法或 compare()方法,当我们需要对某一个集合实现两种排序方式,

比如一个 song 对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写 compareTo(方法和使用自制的 Comparator 方法或者以两个 Comparator 来实现歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的Collections.sort().

无序性和不可重复性的含义是什么

什么是无序性?

无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。

什么是不可重复性?

不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要 同时重写 equals()方法和 HashCode()方法

比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同

  • HashSet 是 Set 接口的主要实现类 ,HashSet 的底层是 HashMap线程不安全的,可以存储 null
  • LinkedHashSet 是 HashSet 的子类,能够按照添加的顺序遍历;
  • TreeSet 底层使用红黑树,元素是有序的,排序的方式有自然排序和定制排序。

公众号:浩说编程
面试题 | 安装包 | 大厂技术资料
欢迎扫码交流
在这里插入图片描述



这篇关于Java集合 高频面试题(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程