Java集合面试题以答案

Java后端

大家都知道,HashMap是我们非常常用的数据结构,它是由数组和链表组合构成的数据结构的,接下直接进入正文吧!

前言

首先介绍Set、List以及Map接口。 List接口是继承collection父接口的,它是按照对象的进入顺序进行保存的,因此,它可以能对列表中的 每个元素进行存入和删除的位置,能够精确地控制。list保存的数据是可以重复的,list的子类有Linked List、Vrctor和ArrayList集合。

Set接口也是和List一样继承Collection接口。Set在数学上的意义就是集合的概念,他和List不一样的是 ,不允许集合中的元素重复。所以存入的元素都必须定义equals()方法来确保对象的唯一性,Set接口有两个实现来Hashset和TreeSet,其中TreeSet是实现了SortedSet接口的。

Map集合它提供了一个键映射到值的一个数据结构,记住map的值是个重复,但键是唯一的,Map的子类有很多比如是HashMap和LinkedHashMap。

面试官常问的面试题
1、Vector和Arraylist区?

区别就是synchronization的使用,ArrayList的方法没有一个是同步的,而vector大多数方法都是同步的 2、vector为什么说是线程安全 因为vector的大多数方法都是直接或者间接同步的比如添加、删除等方法 。 3、Vector和ArrayList在怎么场景下使用?

如果我们对数据的主要操作作为索引或者只在末端增加、删除时,可以选择使用ArrayList或者Vector ,如果对数据的操作主要是为了指定位置删除和插入那就选择使用LinkedList效率会高一下 。

4、collection和collections的区别? collection是一个集合接口,提供对集合进行一个操作。而collections如同是一个工具类,服务于Colle#### ction框架的,主要是对集合类的一个包装类。

5、如何实现HashMap的同步? 通过Map map = Collection.synchronizedMap(new Hash HashMap())来实现同步的,该方法会返回一个Map,然而该Map是封装底层的HashMap的所有方法。

6、HashMap是如何解决hash冲突的问题? hash冲突问题,在dk 1.8中对HashMap的实现做了很多的优化,jdk1.8采用数组+链表+红黑树来实现的,当链表长度大于阈值(默认是8),并数组长为64时就会转化为红黑树,如果数组长度小于64时他会首先进行一个扩容。 7、什么是哈希冲突呢? 哈希表当有两个不同的输入值时,会根据同一散列函数计算出相同的散列值的现象时,我们就叫哈希碰撞。

8、请问HashMap和Hashtable的区别是? hashMap它是非线程安全的,而HashTable 是线程安全的,HashTable线程安全是因为它的内部的方法基本都经过synchronized修饰的。(如果你要保证线程安全的话就使用 ConcurrentHashMap

在效率上HashMap是非线程安全的,效率要高于HashTable。还有HashMap的值可以为null,并且键只允许有一个null。然而HashTable不一样,只要键值有一个 为null,就会直接抛出NullPointerException的。

Hashtable初始容量大小在创建时默认的初始大小为11,之后每次扩充都是容量变为原来的2n+1的。然而HashMap 默认的初始化大小为16,之后每次扩充,容量变为原来的2倍。创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证。

9、HashSet是如何检查重复? 存入过程,HashSet是会先计算对象的HashCode值来判断该对象加入的位置在哪里,同时也会对其他存入的对象HashCode值作进行了比较,没有相符的hashcode或者HashSet他会假设该对象没有重复出现,一旦发现有相同HashCode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同,如果两者相同,HashSet就不会让加入操作成功。

10、hashmap的长度为什么是2的幂次方? 是为了能够让hashmap存取更加的高效,以及减少出现碰撞,尽量把数据分配均匀,hash的时前后加起来大概40亿的映射空间,只要我们把哈希函数映射得比较均匀,就很少出现碰撞现象的。

11, TreeMap如何进行删除操作的? 它是对于拉链式的散列算法,其数据结构是由数组+链表+红黑树组成一个数据结构。当在进行增删查等操作时,首先要定位到元素的所在桶的位置,之后再从链表中定位该元素。

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

猜你喜欢

转载自blog.csdn.net/realize_dream/article/details/105612148