zoukankan      html  css  js  c++  java
  • java【集合】面试题

    一、实例化数组后,能不能改变数组的长度?

    不能,数组一旦实例化,他们的长度就是固定的。

    二、List、Set、Map的区别?

    List中的元素:有序,可重复、可为空

    set中的元素:无序、不可重复,只有一个可以为空

    Map中的元素:无序、键不重复,值可以重复,可一个空键,一个空值。

    三、ArrayList和LinkedList有什么区别?

    ArrayList:

    • 底层是动态数组。
    • Arraylist的默认初始值大小为10,默认扩容大小为1.5倍。
    • 查询快,增删慢

    LinkedList:

    • 底层是双向链表。
    • LinkedList将元素添加到链表的末尾,无需扩容。
    • 增删快,查询慢。

    四、如何对list集合进行去重?

    1.借助于set集合

    2.利用list集合的container方法进行循环遍历

    五、数组和链表分别适用于什么场景,为什么?

    数组:查询多,增删少,数组的特性

    链表:查询少,增删多,链表的特性。

    六、HashMap的底层结构?

    HashMap的底层数据结构为数组+链表,在jdk1.8中当链表的长度超过8时,链表会转化为红黑树。

    七、HashMap如何存储数据?

    • 如果数组还没有初始化,就创建一个数组,默认长度时16.
    • 将hashmap中的key值取出来,转化成hash值,然后对数组的长度进行取余操作,然后放在数组对应的位置上。
    • 如果这个链表为空,直接插入。
    • 如果链表时红黑树,而且元素是红黑树,则直接插入到其中。
    • 如果是链表,则遍历链表,如果有相同的数值,则进行替换,否则直接插入到尾部。
    • 如果链表的长度大于等于8,则直接转换为红黑树。

    八、hashMap在1.7中和在1.8中的区别?

    • 在1.7的时候,没有红黑树,1.8中引入新特性当链表的长度大于8的时候,会转换成红黑树。
    • 在1.7的时候,插入元素,直接插入到头部,而在1.8的时候,是在尾部进行插入的。
    • 扩容的时候,在1.7的时候,容易出现死循环,而1.8中就不会出现死循环。

    九、HashMap和HashTable的区别?

    HashMap:

    • 非线程安全
    • 允许由null值
    • HashMap默认初始化数组的大小为16,扩容时乘以2,使用位运算取得hash
    • hash特性等原因,所以效率比HashTable高。

    HashTable:

    • 线程安全
    • 不允许由null值
    • hashTable默认初始值为11,扩容机制是乘以2+1,然后进行取模计算。

    十、Java集合类框架的基本接口有那些?

    • Collection:代表了一组对象,每一个对象那个都是它的子元素。
    • Set不包含重复元素的Collection
    • List有顺序的Collection,并且可以包含重复元素
    • Map可以把键(key)映射到值(value)的对象,键不能重复。

    十一、为什么集合类没有实现Cloneable和Serializable接口?  

      克隆(Cloning)或者是序列化(Serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

    十二、什么是迭代器?

    Iterator接口库提供了很多对集合元素进行迭代的方法,每一个集合类都包含了可以返回迭代器实例的迭代方法,迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)方法删除,可以通过迭代器的remove()方法删除

    十三、Iterator和Iterator的区别是什么?

      Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历list

      Iterator对集合只能向前遍历,listIterator既可以向前,也可以向后。

      Iterator实现了Iterator接口,并包含其他的功能能,比如增加元素,替换元素,获取前一个和后一个元素索引等等。

    十四、hashcode和equals方法的重要性体现在什么地方?

      java中的hashMap使用hashcode和equals方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法,如果没有正确的实现这两个方法,两个不同的键可能会由相同的hash值,因此,可能会被集合认为是相等的,而且,这两个方法也用来发现重复元素,所以着两个方法的实现对hashmap的精确性和正确性是至关重要的。

    十五、Comparable和Comparator接口是干什么的?列出他们的区别?

      java提供了只包含一个compareTo()方法的Comparable接口,这个方法可以给两个对象排序,具体来说,它返回负数。0,正数,来表明输入对象小于,等于,大于已经存在的对象。

      java提供了包含compare()和equeals()两个方法的Comparator接口,compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数,equals()方法需要一个独享作为参数,它用来决定输入参数是否和comparator相等,只有输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

    十六、Enumeration接口和Iterator接口的区别有那些?

      Enumeration速度是Iterator的2倍,同时占用更少的内存。

      但是Iterator远远比Enumeration安全,因为其他线程不能够修改正在被Iterator遍历集合里面的对象同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

    十七、HashSet和TreeSet由什么区别?

    TreeSet中的数据是自动排好序的,不允许放入null值。

    HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashCode码作为标识的,而具有相同内容的String对象,hashcode是一样的,所以放入的对象不能重复,但是同一个类的对象可以放入不同的实例。

  • 相关阅读:
    vue学习之vuex的入门
    Vue的入门之安装
    JS之作用域链
    map去重value值
    增量部署和全量部署
    js跳转页面的方法
    Quartz定时任务时间设置
    @RequestParam和@PathVariable用法小结
    nginx负载均衡的5种策略(转载)
    使用Joda-Time优雅的处理日期时间
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/13750558.html
Copyright © 2011-2022 走看看