• Java集合中常见的面试题


    目录

    Collection 和 Collections的区别

    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

    List, Set, Map是否继承自Collection接口

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

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

    HashMap和Hashtable的区别

    ArrayList和Vector的区别

    你所知道的集合类都有哪些?主要方法?

    请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层 是什么?扩容机制?Vector和ArrayList的最大区别?

    以Eclipse/IDEA为例,在自定义类中可以调用工具自动重写equals和hashCode。 问题:为什么用Eclipse/IDEA复写hashCode方法,有31这个数字?

    说一说HashMap什么时候进行扩容呢?

    谈一谈HashMap1.8前后底层实现的区别?

    请谈一谈负载因子值的大小,对HashMap有什么影响

    Collection 和 Collections的区别

    答:Collection是集合类的上级接口,继承于他的接口主要有Set 和List.

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

    答:Set里的元素是不能重复的,用equals()方法判读两个Set是否相等

        equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值

    List, Set, Map是否继承自Collection接口

    答: List,Set是,Map不是

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

    答:不对,有相同的hash code

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

    答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

    HashMap和Hashtable的区别

    答:1.HashMap与Hashtable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

    2. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

    3.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

    4.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

    5.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

    ArrayList和Vector的区别

    答:就ArrayList与Vector主要从二方面来说.

    一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

    二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

    你所知道的集合类都有哪些?主要方法?

    答:最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

    Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

    请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层 是什么?扩容机制?Vector和ArrayList的最大区别?

     ArrayList和LinkedList的异同 二者都线程不安全,相对线程安全的Vector,执行效率高。 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于 随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增 和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

     ArrayList和Vector的区别 Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于 强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用 ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大 小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。

    以Eclipse/IDEA为例,在自定义类中可以调用工具自动重写equals和hashCode。 问题:为什么用Eclipse/IDEA复写hashCode方法,有31这个数字?

     选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大,所谓的 “冲突”就越少,查找起来效率也会提高。(减少冲突)

     并且31只占用5bits,相乘造成数据溢出的概率较小。

     31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化。(提高算法效 率)

     31是一个素数,素数作用就是如果我用一个数字来乘以这个素数,那么最终出来的结 果只能被素数本身和被乘数还有1来整除!(减少冲突)

    说一说HashMap什么时候进行扩容呢?

    当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数 size)*loadFactor 时 , 就 会 进 行 数 组 扩 容 , loadFactor 的默认 值 (DEFAULT_LOAD_FACTOR)为0.75,这是一个折中的取值。也就是说,默认情况 下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中元素个数 超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把 数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置, 而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数, 那么预设元素的个数能够有效的提高HashMap的性能!

    谈一谈HashMap1.8前后底层实现的区别?

    1.HashMap map = new HashMap();//默认情况下,先不创建长度为16的数组 2.当首次调用map.put()时,再创建长度为16的数组 3.数组为Node类型,在jdk7中称为Entry类型 4.形成链表结构时,新添加的key-value对在链表的尾部(七上八下) 5.当数组指定索引位置的链表长度>8时,且map中的数组的长度> 64时,此索引位置 上的所有key-value对使用红黑树进行存储。

    请谈一谈负载因子值的大小,对HashMap有什么影响

     负载因子的大小决定了HashMap的数据密度。

     负载因子越大密度越大,发生碰撞的几率越高,数组中的链表越容易长, 造成查询或插入时的比较次数增多,性能会下降。

     负载因子越小,就越容易触发扩容,数据密度也越小,意味着发生碰撞的 几率越小,数组中的链表也就越短,查询和插入时比较的次数也越小,性 能会更高。但是会浪费一定的内容空间。而且经常扩容也会影响性能,建 议初始化预设大一点的空间。

     按照其他语言的参考及研究经验,会考虑将负载因子设置为0.7~0.75,此 时平均检索长度接近于常数。

  • 相关阅读:
    第十八天笔记
    MySQL数据库
    Universal Robot (UR3)与USB摄像头和电磁夹持器结合的ROS拾取和放置硬件实施详细教程:从连接到实践
    亚马逊登山扣 安全带的要求标准ASTM1774 ASTM F1772办理
    上传 iOS App ipa安装包 【推荐使用mac】
    nginx中sent_timeout属性使用注意事项
    StringCoding字符串的编码问题
    DirectX11 With Windows SDK--38 级联阴影贴图(CSM)
    C#、C++、Java、Python选择哪个好?
    Vue根据屏幕分辨率计算div可以显示的数量,dom渲染在v-if之后造成的复杂处理
  • 原文地址:https://blog.csdn.net/qq_58029155/article/details/126223300