JAVA面试题合集二(集合容器)

1.什么是集合?
存储数据的容器.
集合框架:表示和操作集合而规定的一种统一的标准体系结构
任何集合框架都包含3大块: 对外的接口,接口实现.操作集合的算法
2.集合的特点?—>对象封装数据.对象的个数不确定
3.集合和数组的区别?
集合可变长度,只能存放引用类型.集合存储对象可以是不同的数据类型
4.常用的集合类有哪些?
在这里插入图片描述
5.List,Set,Map三者的区别?List、Set、Map 是否继承自Collection 接口?
List、Map、Set 三个接口存取元素时,各有什么特点?
在这里插入图片描述
在这里插入图片描述
6.集合框架底层的数据结构?
在这里插入图片描述
TreeSet: TreeMap 有序唯一. 红黑树(自平衡的排序二叉树)
HashMap: JDK1.8之前数组+链表(拉链法),JDK1.8后,当链表长度大于阈值8时,将链表转化为红黑树,减少搜索时间
LinkedHashMap 基于拉链式散列结构,在HashMap基础上,增加了一条双向链表
7.哪些集合类是线程安全的?
vector(比ArrayList多了个同步化机制),stack,hashtable,enumeration:枚举,相当于迭代器。
8.Java集合的快速失败机制 “fail-fast”?
在这里插入图片描述
9.怎样确保一个集合不能被修改?
Collections.unmodifiableCollection(Collection c)创建一个只读集合,改变操作抛出异常Collections.unmodifiableCollection(list)
10.迭代器 Iterator 是什么?
Iterable()是提供遍历集合的接口,迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
11.Iterator怎么使用?有什么特点?
Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
12.如何边遍历边移除 Collection 中的元素?
用 迭代器遍历时 iterator.remove()
Java 一般不允许一个线程在遍历 Collection 时另一个线程修改它。
13.Iterator 和 ListIterator 有什么区别?
iterator遍历set,list,只能单项遍历. 另一个只能list,可以双向遍历,(向前,向后)
ListIterator 实现 Iterator 接口,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
14.遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中 List 遍历的最佳实践是什么?
在这里插入图片描述
15.说一下 ArrayList 的优缺点?
底层数组,支持随机访问,实现了RandomAccess接口,因此查找的非常快,
插入删除时,需要做一次元素复制操作,如果复制元素过多,非常耗性能.
ArrayList 比较适合顺序添加、随机访问的场景。
16.如何实现数组和 List 之间的转换?
数组转 List:使用 Arrays. asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。

17.ArrayList 和 LinkedList 的区别是什么?
数据结构实现: 动态数组.双向链表
随机访问效率: ArrayList查找块, LinkedList线性,移动指针,从前往后依次查找
增加和删除效率:ArrayList增删影响数组内其他数据的下标,数组元素移动等内存操作,删除开销大,因为需要重排数组中所有数据.
内存空间 LinkedList更占内存,除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素
线程安全 都不安全
Array获取数据的时间复杂度为O(1)

补充:数据结构基础之双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
18.ArrayList 和 Vector 的区别是什么?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
19.插入数据时,ArrayList、LinkedList、Vector谁速度较快?ArrayList、Vector、LinkedList 的存储性能和特性?
Vector比ArrayList慢
ArrayList初始容量是10
20.多线程场景下如何使用 ArrayList?
Collections.synchronizedList(list) 将其转换成线程安全的容器后再使用
21.为什么 ArrayList 的 elementData 加上 transient 修饰?
transient Object[] elementData;
可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现
在这里插入图片描述
每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。
22.List 和 Set 的区别
List 有序,(存入集合的顺序和取出集合的顺序一致)存放多个元素,允许重复,可以存放多个null,元素都有索引
Set 无序 ,只允许存放一个null.保证元素唯一性
List支持for循环,可以通过下标遍历,也可以迭代器,.
Set无序,无法通过下标遍历.
在这里插入图片描述
23.说一下 HashSet 的实现原理?
ashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
24.HashSet如何检查重复?HashSet是如何保证数据不可重复的?
向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。
HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。
所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals)
25.hashset添加时为什么是present?
首先add方法返回值是boolean,表明当前添加的元素是否出现了重复,里面直接调用的map.put(k,v),put方法返回的是,如果key出现了重复,则返回上次存放的的value,并且覆盖value。假如第一次存放,put返回是null,add返回是true;元素重复,则put返回一个present对象,add返回false

private static final Object PRESENT = new Object();
因为底层存储是基于hashmap,value需要一个固定值,所以局搞了个present写在那,应该就是个摆设、
PRESENT是一个至始至终都相同的虚值r
27.hashCode()与equals()的相关规定?
equals()方法被覆盖过,则hashCode()方法也一定被覆盖,
hashCode的默认行为为堆上的对象产生的独特值.如果没有重写hashCode方法,则两个对象无论如何都不会相等.
28.==与equals()方法的区别?

  1. ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
  2. ==是指对内存地址进行比较 equals()是对字符串的内容进行比较
  3. ==指引用是否相同 equals()指的是值是否相同
    29.hashset与hashmap的区别?
    hashmap,实现了map接口,存放键值对,调用put.方法向map中添加元素.hashmap使用键的hashCode方法计算存储位置,hashmap相对于hashset较快,因为它使用唯一键获取对象.
    hashset 实现了set接口,仅能存放对象,调用add方法向set中添加元素.hashset使用成员对象 来计算hashCode值,equals比较,不同的话返回false,hashset较慢
    30.BlockingQueue是什么?
    java.util.concurrent是一个队列,在进行检索或移出一个元素时,会等待队列变为非空,在添加一个元素时,会等待队列中可用空间
    Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,SynchronousQueue等
    31.在 Queue 中 poll()和 remove()有什么区别?
    相同点:都是返回第一个元素,并在队列中删除返回的对象。
    不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出NoSuchElementException 异常
    32.说一下hashmap的实现原理?
    hashmap基于哈希表的map接口的非同步实现,允许null值和null键.不保证映射的顺序,hashmap实际上是一个散列链表,即数组和链表的结合体.hashmap基于hash算法实现的
    在这里插入图片描述
    链表节点个数超过8个该链表会转换为红黑树,提高查询效率.从原来的O(n)到O(logn)
    33.HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现?
    在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。
    JDK1.8之前
    JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数
    组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
    在这里插入图片描述
    JDK1.8之后
    jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
    在这里插入图片描述
    34.HashMap的put方法的具体流程?
    在这里插入图片描述
    35.HashMap是怎么解决哈希冲突的?
    这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值)
    所有散列函数都有如下一个基本特性**:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同**。
    36.什么是hash冲突?
    当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)。
    37.hashmap的数据结构?
    在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做链地址法的方式可以解决哈希冲突:
    38.JDK1.8新增红黑树?
    在这里插入图片描述
    在这里插入图片描述
    39.能否使用任何类作为 Map 的 key?
    在这里插入图片描述
    40.为什么HashMap中String、Integer这样的包装类适合作为K?
    在这里插入图片描述
    41.如果使用Object作为HashMap的Key,应该怎么办呢?
    重写hashCode和equals方法
    重写hashCode方法,是为了计算存储数据的存储位置
    重写equals是为了保证key在hash表中的唯一性
    42.HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标?
    hashCode()计算出的哈希值可能不在数组大小范围内,进而无法匹配存储位置;
    43.HashMap 的长度为什么是2的幂次方?
    为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,每个链表/
    红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法
    44.HashMap 与 HashTable 有什么区别?
    线程安全 hashmap是非线程安全的.hashtable底层方法是synchronized修饰的
    效率,对null键和null值的支持.
    初始容量和扩容大小也不一样. hashmap16,扩容为2n+1, hashtable为11扩容为2N
    45.如何决定使用 HashMap 还是 TreeMap?
    插入,删除,定位元素hashmap, 对一个有序的集合Key遍历,treemap
    46.HashMap 和 ConcurrentHashMap 的区别?
    在这里插入图片描述
    47.ConcurrentHashMap 和 Hashtable 的区别?
    在这里插入图片描述
    底层数据结构:JDK1.7ConcurrentHashMap采用分段的数组+链表组成,JDK1.8时和hashmap底层一样,数组链表红黑树–分段锁
    hashtable和JDK1.7之前的hashmap一样,数组链表结构
    对比图:
    hashtable图
    在这里插入图片描述
    JDK1.8的concurrenthashmap
    在这里插入图片描述
    答:ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。HashMap 没
    有考虑同步,HashTable 考虑了同步的问题。但是 HashTable 在每次同步执行时都要锁
    住整个结构。 ConcurrentHashMap 锁的方式是稍微细粒度的
    在这里插入图片描述
    48.Array和ArrayList有什么区别?
    Array存储基本数据类型和对象.ArrayList只能存储对象
    Array大小固定,ArrayList大小自动扩展
    内置方法
    49.comparable 和 comparator的区别?
    在这里插入图片描述
    50.Collection 和 Collections 有什么区别?
    Collection 意义是为各种具体的集合提供了最大化的统一操作方式
    Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
    51.TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值