zoukankan      html  css  js  c++  java
  • Java面试专题-集合篇(2)

    开篇介绍

    大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java一些集合高频面试题进行分享。

    Q:

    集合的体系有哪些?

    单列集合:

    双列集合:

    Q1:

    Collection 和 Collections 异同区别是什么?

    Collection:

    java.util包下的接口,它是各类集合的父接口,继承它的接口主要有Set 和 List;

    Collections:

    java.util包下的类,是针对集合的工具类,提供一系列静态方法和对各种集合的搜索,排序,线程安全化等操作。

    Q2:

    ArrayList 和 Vector如何扩容?

    ArrayList 和 Vector都有一个初始容量大小。
    1. ArrayList是一个大小可改变的数组,当往ArrayList中添加更多的元素时,其大小会动态地增长。

    内部元素可以直接通过get和set方法进行访问,因为ArrayList本质上就是一个数组。

    2. Vector和ArrayList添加更多元素时都会请求更大的空间。

    3. Vector每次请求其大小的双倍空间,ArrayList的size每次增长50%。

    (Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍)

    Q3:

    List和Set的区别是什么?

    相同点:List 和 Set都继承Collection接口。都是用来存储一组相同类型的元素的集合。

    区别:

    List特点:元素有序放入,元素可以重复。

    即有顺序的存储,先存入的对象排在集合前面。因此可以通过下标来取的集合内的元素。

    Set特点:元素无序放入,元素不可重复。

    即无顺序的存储,先存入的对象不一定排在集合前面。且不可以重复,相同元素在Set集合中只会存在一份。因为上一篇文章解释了HashSet实现了HashCode的案例。所以,在一些场景下,可以用Set来去重。

    Q4:

    Set集合是如何保证元素不重复的?

    Java的Set集合体系中,实现Set的方式主要分为两大类:HashSet 和 TreeSet

    其中:

    1. HashSet是基于哈希表实现的,HashSet中数据是无序存放的,可以放入null值,但是有且只能放一个null,值都不可以重复,类似数据库中的唯一约束。

    2. TreeSet是二叉树实现的,TreeSet中的数据是自动排序好的,不允许存放null值。

    在HashSet中,基本的操作都是由HashMap底层实现的,因为HashSet底层使用HashMap存储数据的(key-value)。当HashSet中添加对象时,首先计算对象的hashCode值,然后通过扰动计算和按位与的方式计算出这个元素的存储位置,如果这个位置为空,表示还没有对应的内容,就将对象添加进去;如果不为空,则会用equals方法来比较对象是否相等,相等则不会添加,不相等则找一个空位添加。

    TreeSet底层是TreeMap的keySet()方法,而TreeMap是基于红黑树实现的,红黑树是一种平衡二叉查找树,它能保证任何一个节点的左右 子树的高度差不会超过较矮的那一棵的一倍。

    TreeMap是按key排序的,元素在插入TreeSet时compareTo()方法会被调用,所以TreeSet中的元素要实现Comparable接口。TreeSet作为一种Set,它不允许出现重复元素。TreeSet使用compareTo()方法来判断重复元素的。

    Q5:

    HashMap 和 HashTable有什么区别?

    1. HashMap允许键和值是null。而HashTable不允许键或值是null。

    2. HashTable是线程同步的,而HashMap不是线程同步的。所以,HashTable适合在多线程环境中使用,而HashMap更适合于单线程的环境中使用。

    3. HashMap提供了可供应用迭代的键的集合;因此,HashMap是快速失败的。另一方面,HashTable提供了对键对的列举(Enumeration)。

    4. 由于HashTable继承Dictionary类,但是这个类基本已经废弃了,所以一般认为HashTable是一个遗留的类,在项目中不怎么使用。


    点关注、不迷路

    如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

    如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。

    如果你还想更加深入的了解我,可以微信搜索「Java极客思维」进行关注。每天8:00准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!

  • 相关阅读:
    203. Remove Linked List Elements
    python练习小程序
    五十音练习小软件
    CocosCreator生命游戏
    一个swift下载程序
    用excel做一幅像素画
    翻译一篇SpiderMonkey GC的文章
    unity-3d拼图游戏
    NDK编译Python2.7.5
    git命令简图
  • 原文地址:https://www.cnblogs.com/xgx120413/p/14083216.html
Copyright © 2011-2022 走看看