Java集合面试题

集合可分为两大类:
在这里插入图片描述

一、ArrayList和Vector的区别

共同点:
这两个类都实现了List接口,他们都是有序的集合(储存有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。
区别
同步性:ArrayList是非同步的,Vector是同步的
即便需要同步的时候,我们可以使用Collections工具类来构建出同步的ArrayList而不用Vector。
扩容大小:Vector正常原来的一倍,ArrayList增长原来的0.5倍

二、HashMap和Hashtable的区别

共同点
从储存结构和实现来讲基本上都是相同的,都是实现Map接口
区别

  • 同步性:HashMap是非同步的,HashTable是同步的
  • 是否允许为null:HashMap允许为null,Hashtable不允许为null
  • contains方法:Hashtable有contains方法,而HashMap吧contains方法去掉了,改成了containsValue和containsKey
  • 继承不同:

三、List和Map的区别

都是常用的容器,都是接口
不同点

  • 储存结构不同:List是储存单列的集合,Map储存的是key—value键值对的集合
  • 元素是否可以重复:List允许重复,Map不允许key重复
  • 是否有序:List集合是有序的,Map是无序的

四、set里的元素是不能重复的,那么用什么方法来区分重复与否呢?用==还是equals()?

set集合实际大都是使用的是Map集合的put方法来添加元素。
以HashSet为例,Hashset里的元素不能重复

    
    // 1. 如果key 相等  
    if (p.hash == hash &&
        ((k = p.key) == key || (key != null && key.equals(k))))
        e = p;
    // 2. 修改对应的value
       if (e != null) { // existing mapping for key
            V oldValue = e.value;
            if (!onlyIfAbsent || oldValue == null)
                e.value = value;
            afterNodeAccess(e);
            return oldValue;
       }

添加元素的时候,如果key相等,则修改value值。而在Set集合中,value值仅仅是一个Object对象罢了(该对象对Set本身而言是无用的)。
也就是说,Set集合如果添加的元素相同时,是根本没有插入的(仅修改了一个无用的value值 ),而在源码中可以看出,==和equals方法都有使用!

五、Collection和Collections的区别

1.Collection是集合的上级接口,继承它的有Set和List接口
2.Collections是集合的工具类,提供了一系列的静态方法对集合的搜索,查找,同步等操作

六、说出ArrayList,LinkedList的储存性能和特性

ArrayList的底层是数组,LinkedList的底层是双向链表

  • ArrayList它支持以角标位置进行索引出对应的元素(随机访问),二LinkedList则需要遍历整个链表来获取对应的元素,因此一般来说ArrayList的访问速度要快于LinkedList
  • ArrayList由于是数组,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的,因此一半来说LinkedList的增删速度更快。

6.1扩展: ArrayList的增删未必就是比LinkedList要慢。

如果增删都是在末尾来操作【每次调用的都是remove()和add()】,此时ArrayList就不需要移动和复制数组来进行操作了。如果数据量有百万级的时,速度是会比LinkedList要快的。(我测试过)
如果删除操作的位置是在中间。由于LinkedList的消耗主要是在遍历上,ArrayList的消耗主要是在移动和复制上(底层调用的是arraycopy()方法,是native方法)。

LinkedList的遍历速度是要慢于ArrayList的复制移动速度的 如果数据量有百万级的时,还是ArrayList要快。

七、Enumeration和Iterator接口的区别

与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,他会阻止其他线程去修改集合。
区别有三点:

  • Iterator的方法名比Enumeration更科学
  • Iterator有fail-fast机制,比Enumeration更安全
  • Iterator能够删除元素,ENumeration不能删除元素

八、ListIterator有什么特点

  • ListIterator继承了Iterator接口,它用于遍历List集合的元素
  • ListIterator可以实现双向遍历,添加元素,设置元素

九、并发集合类是什么?

包含线程安全集合类,允许在迭代时修改集合。

  • 迭代器被设计为fail—fast的,会抛出ConcurrentModificationException。
  • 一部分类为:
  • CopyOnWriteArrayList
  • ConcurrentHashMap
  • CopyOnWriteArraySet

十、Java中HashMap的key值要是为类对象则该类需要满足什么条件?

需要同时重写该类的hashCode方法和equals方法。

  • 在插入元素的时候是先算出该对象的hashCode。如果hashCode相等的话,那么表明该对象是存储在同一个位置上。
  • 如果调用equals方法,两个key相同,则替换元素
  • 如果调用equals方法,两个key不相同,则说明该hashCode仅仅是碰巧相同,此时是散列冲突,将新增的元素放在桶子上。

十一、ArrayList集合加入一万条数据,应该怎么提高效率

ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。所以,我们可以直接在初始化的时候就设置ArrayList的容量,这样就可以提高效率了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值