【Java-一些常见单列集合面试问题】

目录

1.List,Set的区别?

2.ArrayList与Vector区别? 

3.Arraylist与LinkedList区别?

4.ArrayList的扩容机制?

5.HashSet、LinkedHashSet和TreeSet 区别?

6.HashSet如何过滤重复元素?


1.List,Set的区别?

List:集合中存储的元素是有序的,元素可以重复,可以进行排序操作。
Set:集合中存储的元素不可重复的

2.ArrayList与Vector区别? 

 ArrayList 与Vector 都是基于动态数组实现的 List 接口的集合实现类,它们的区别主要包括:
1.初始容量:
        ArrayList初始默认容量为0,添加第一个元素时,扩容为10
        Vector 初始默认容量为:10
2.扩容方式:
        ArrayList:在原有容量基础上,扩容0.5倍(新容量是原有容量的1.5倍);
        Vector:在原有容量基础上,扩容1倍(新容量是原有容量的2倍);
3.线程安全
        ArrayList:线程不安全(可使用 CopyOniriteArrayList 集合解决);
        Vector:线程安全,操作方法使用 synchronized(同步锁)实现线程同步:
4.执行效率:
        Vector的方法都有同步锁,在方法执行时需要加锁、解锁,所以性能会低于 ArrayList;

3.Arraylist与LinkedList区别?

ArrayList 与LinkedList都是 List 接口的集合实现类,它们的区别主要包括:
1.底层数据结构:
        Arraylist:底层使用的Object[]数组:
        LinkedList :底层使用的是双向链表
2.插入和删除元素:
        ArrayList:插入删除时需要复制数组内的元素,所以性能较差:查找和遍历元素:
        LinkedList:插入删除时,只影响相邻节点,所以性能较高:
        ArrayList:插入删除时需要复制数组内的元素,所以性能较差:
        LinkedList:插入删除时,只影响相邻节点,所以性能较高;
3.RandomAccess 接口:
        使用Collections.binarySearch()方法,基于二分查找法,进行元素查找时: 

        Arraylist:实现了 RandonAccess 接口,使用 indexedBinarySearch()(基于下标的二分查找),性能较好;
        LinkedList :没有实现 RandonAccess 接口,使用 iteratorBinarySearch()(基于迭代器的二分查找),迭代器会产生额外遍历操作,性能较差:

4.ArrayList的扩容机制?

1.构造函数初始化时
        使用无参数构造方法创建 Arraylist 时,内部的动态数组被初始化为一个空数组。当向数组中添加第一个元素时,数组容量扩为 10;
        使用有参数构造方法创建 ArrayList 时,内部的动态数组按照指定容量进行初始化创建
2.添加元素容量不足时
        当数组容量不足时,调用grow()方法进行扩容,每次扩容后容量都会变为原来的1.5倍(在原有容量基础上,扩容0.5倍);
        扩容后,数组的最大容量不会超过 Integer.MAX_VALUE; 

5.HashSet、LinkedHashSet和TreeSet 区别?

 它们都是Set接口的实现类,区别主要包括:
        HashSet:基于 HashMap实现,元素唯一,无序:
        LinkedlashSet:HashSet 的子类,基于LinkedHashMap实现,元素唯一且有序,同时保持了哈希衷的性能;
        Tree5et :基于 TreeMap实现,元素唯一,自动排序或按照自定文规赔排序;

6.HashSet如何过滤重复元素?

        HashSet 内部使用一个HashMap 作为数据结构,保存元素时,会使用这个HashMap 的key 来进行保存。key 是唯一的,所以重复元素会自动过滤。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值