当前位置:   article > 正文

java集合中十大常问面试题_java集合高频10大面试题

java集合高频10大面试题

目录

1.java有哪些常用的容器(集合)

2.List 和 Map、Set 的区别

3.ArrayList与Linklist的区别

4.ArrayList和Vector的联系与区别

5.迭代器Iterator是什么

7.说一下HashMap的底层原理

8.说一下HashSet的实现原理

9.哪些集合类是线程安全

10. 如何实现数组与List之间转换

1.java有哪些常用的容器(集合)

Java集合容器分为Collection 和 Map 两大类,他们各自都有很多子类。

2.List 和 Map、Set 的区别

List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;

  • List中存储的数据是有顺序的,并且值允许重复;
  • Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
  • Set中存储的数据是无顺序的,并且不允许重复。

3.ArrayList与Linklist的区别

ArrayList:基于动态数组非线程安全的集合,可以连续内存存储,适合下标访问(随机访问),但是增删元素慢。扩容机制:使用数组实现,无参构造函数默认初始化长度为10,数组扩容是会将原数组中的元素重新拷贝到新数组中,长度为原来的1.5倍(扩容代价高)。

Linklist:基于链表实现的非线程安全的集合,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询。扩容机制::LinkedList不存在扩容问题,新增元素放到集合尾部,修改相应的指针节点即可。

LinkedList比ArrayList更占内存。因为LinkedList为每一个节点存储了两个引用节点。一个指向前一个元素,一个指向下一个元素。

4.ArrayList和Vector的联系与区别

相同点:

底层都使用数组实现。
功能相同,实现增删改查等操作的方法相似。

长度可变的数组结构。 

不同点:

Vector是早期JDK版本提供,ArrayList是新版本替代Vector的。
Vector的方法都是同步的,线程安全:ArrayList非线程安全,但性能比Vector好。
默认初始化容量都是10,Vector扩容默认会翻倍,可指定扩容的大小:ArrayList只增加50%。

5.迭代器Iterator是什么

  • 首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
  • Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
  • 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

6.HashMap与Hashtable有什么区别

1.区别 :

  1. HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;
  2. HashMap允许keyvaluenull,而HashTable不允许
  3. 父类不同:HashMap继承自AbstractMap; Hashtable 继承自 Dictionary。
  4. 扩容机制:它们两个默认初始大小和扩容方式不同。HashMap默认初始大小16.容量必须是2的整数次幂,扩容时将容量变为原来的2倍:Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1
2.HashMapjdk1.7时底层实现:数组+ 链表实现
jdk8 开始链表高度到 8 、数组长度超过 64 ,链表转变为红黑树,元素以内部类 Node 节点存在。
  • 计算keyhash值,二次hash然后对数组长度取模,对应到数组下标;
  • 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组,
  • 如果产生hash冲突,先进行equal比较,相同则取代该元素,不同,则判断链表高度插入链表;
  • 链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表。

7.说一下HashMap的底层原理

  • HashMap是Java程序员使用频率最高的用于映射键值对(key和value)处理的数据类型,它是基于Hash算法实现,通过put(key,value)存储,get(key)来获取value;
  • 当传入 key时,HashMap会根据key,调用 hash(Object key)方法,计算出hash值,根据 hash 值将value保存在Node对象里,Node对象保存在数组里;
  • 当计算出的 hash 值相同时,称之为 hash 冲突,HashMap的做法是用链表和红黑树存储相同hash 值的value;
  • 当hash冲突的个数:小于等于8使用链表:大于8且tablength大于等于64时,使用红黑树解决链表查询慢的问题。

8.说一下HashSet的实现原理

  • HashSet是基于HashMap实现的查询速度特别快。
  • HashMap是支持key为null值的,所以 HashSet支持添加null值。
  • HashSet存放自定义类时,自定义类需要重写 hashCode()和equals()方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMapput()方法,简单概括就是key进行哈希。判断元素hash值是否相等、key是否为同个对象、key是否equals。第1个条件为 true,2、3有一个为true,HashMap即认为 key相同)。
  • 无序、不可重复。

9.哪些集合类是线程安全

1、Vector:就比arraylist多了个同步化机制(线程安全),性能低

2、Statck:堆栈类,先进后出。

3、Hashtable:就比hashmap多了个线程安全。

4、enumeration:枚举,相当于迭代器。

10. 如何实现数组与List之间转换

数组转 List:使用 Arrays. asList(array) 进行转换

List 转数组:使用 List 自带的 toArray() 方法。无参toArray方法返回Object数组,传入初始化长度的数组的对象,返回该对象数组。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/425214
推荐阅读
相关标签
  

闽ICP备14008679号