Java初级工程师面试题-容器(集合和数组部分)

Java初级工程师面试题-容器(集合和数组部分)

1.java 容器都有哪些?

	集合和数组

2.Collection 和 Collections 有什么区别?

Conllection:是集合接口,它提供了对集合操作的通用方法,实现该接口的类有Set和List
Conllections:是集合类的一个包装类,其中包含很多操作集合的静态方法,可以实现集合的搜索,排序,安全等,该类不能被实例化,是集合的工具类

3.List、Set、Map 之间的区别是什么?

list和set都是单列集合,其中list是有序的,可存放相同对象的集合
Set为无序的,不能存在相同对象的集合,且list和set都是实现了Conllection接口
Map:双列的集合,键值对的形式存在,且不能存储相同key的对象,map是无序的

4.HashMap 和 Hashtable 有什么区别?

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,主要区别在于HashMap可存在
key值为”null”的情况,由于HashMap是非线程安全的,在只有一个线程访问的情况下效率要高于HashTable

5.如何决定使用 HashMap 还是 TreeMap?

HashMap:查询(基于散列表的实现)
TreeMap:插入,快速创建(基于红黑树)

6.说一下 HashMap 的实现原理?

HashMap基于hahsing原理,通过put()和get()方法储存获取对象,我们将键值传输给put方法时,它调用的是HashCode()来计算hashcode,然后找到buctet位置来存储值对象,当获取对象时,通过键对象的equals方法找到正确的键值对,然后返回键值对对象。HashMap使用链表来解决键碰撞问题,当发生碰撞,对象会储存在链表的下一节点中HashMap在每个链表节点中储存键值对对象
1.HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。
JDK1.8版本中对数据结构做了进一步优化,引入红黑树,当链表长度太长(默认超过8时),链表就转为红黑树,利用红黑树快速增删改查的特点提高hashMap的性能
2、HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。
1.如果超过阈值(8),会自动扩容两倍,然后重新计算Hashmap中各个Entry的位置
2.计算索引位置变成了hasCode&(数组长度-1)来计算,如果扩容量不等于2的n次方那么就会出现有的索引位置永远不会被使用。而且不同的hash值碰撞的概率会增大,这样也会使得数据在table数组中的分布不均匀,查询速度变得慢

7.HashMap,HashTable,ConcurrentHashMap的区别。

(1.hashMap:
(1)底层实现是数组+链表,可以储存null键null值,不过null键只能出现一次,线程不安全
(2)初始大小8:扩容newSize=orderSize*2(size肯定是2的n次方)
(3)扩容针对整个map,每次扩容时,所有元素都会重新计算插入位置,并重新插入
(4)插入元素才判断该不该扩容,有可能无效扩容
(5)计算索引index的方法:index=hashcode&(数组长度-1)
(6)JDK1.8后加入了阈值(8)如果超过这个大小那么链表转化成红黑树,并且新插入的元素都插入到链表的尾部
(7)若想把HashMap变成线程安全的那么需要使用Collections.SynchronizeMap方法
(8)Hashmap初始值要考虑加载因子
①Hash冲突:
	若干个Key的哈希值按照数组大小取模后,如果落在同一个下标上,将组成一个entry链,对key的查找需要遍历
	entry链上每一个元素执行equlas()比较
②加载因子:
	为了降低hash冲突,默认当hashmap的键值对达到总长度的0.75就开始扩容
③空间换时间:
	如果希望加快key的查找时间,还可以进一步降低加载因子,加大初大小
(2.Hashtable:
(1)底层实现是数组+链表,不能存在null键null值,线程安全,实现线程安全的方式是修改hashtable的值得时候
锁住整个hashtable,效率低,ConcurrentHashmap做了相关优化
(2)初始值为11,扩容newSize=orderSize*2+1
(3)计算index的方法:index=(hash&(数组长度-1))
(3.Hashmap和Hashtable的负载因子
(1)负载因子等于size/capacity,负载极限是一个0-1的数字,负载极限决定了hash表的填充程度,hashtable
和hashmap的负载极限为0.75
(2)负载极限的默认值为0.75是时间和空间成本上的一种折中
①较高的负载极限可以充分使用hash表中空间,但是查询数据时间会得到增加,而查询是最频繁的操作
②较低的负载极限会提高查询数据的效率但是会增加Hash表的内存开销
(4.ConcurrentMap
(1)底层采用分段的数组+链表实现,线程安全
(2)通过把整个map分成N个Segament,可以提供线程安全,但是效率提升N倍。默认提高16倍(读操作不加锁,由于
HashEntry的value变量是volitie,也能保证读取到最新的值)
(3)Hash Table的synchronize是针对整张hash表,即每次锁住整张表让线程独占,Concurrent允许多个修改并
发进行,其关键在于锁分离技术
(4)有些方法需要跨段,比如size()和containValue()他可能需要锁住整张表而不仅仅是某个段,这里按顺序锁定
所有段,操作完毕后又按照顺序释放所有段
(5)扩容:段内扩容(段内元素超过该段对应的Entry数组长度的75%触发扩容,不对整个MAp扩容),插入前检测
需不需要扩容,有效避免无效扩容 
4、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
ConcurrentHashMap更好,因为ConcurrentHashMap是分段锁而Hashtable是锁住整个table
5、HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。
1.put方法是会检查Map的容量是否足足够后,不够则扩容,扩容后会把数组从老Hash表移到扩容后的Hash表,多线
程操作可能会形成环链表,所以get方法可能出现死循环
2.造成迭代的fail-fast,快速失败机制,是java集合的一种错误检测机制,当迭代集合的过程中,就可能会发生
该错误

8.说一下 HashSet 的实现原理?

HashSet的底层是HashMap
HashSet得值存放于HashMap的key上
HashMap的values统一为PRESENT

9.ArrayList 和 LinkedList 的区别是什么?

ArrayList:底层为数组,查询速度快,插入速度慢
LinedList:底层为链表插入删除速度快查询速度慢

10.一个ArrayList在循环过程中删除,会不会出问题,为什么。

如果是正向循环删除程序会遗漏重复元素
反向循环删除不会出错
使用Iterator循环调用的是集合自己的remove方法会报错
使用Iterator循环调用用的是Iterator自己的remove方法就不会报错,

11.如何实现数组和 List 之间的转换?

数组转List:Arrays的asList(a)方法
List转数组:toArray(list.size())方法

12.ArrayList 和 Vector 的区别是什么?

ArrayList:线程不安全的,Vector是线程安全的
ArrayList容量不够的时候默认增加原本的50%,而vector默认增加100%

13.Array 和 ArrayList 有何区别?

Array数组包含包括基本类型和对象类型,但其大小设定好后就不能再改变了
ArrayList:只能包含对象类型,但是其大小是可变的
Array包含肯定是想同类型,而ArrayList可以包含不同类型比如Object

14.在 Queue 中 poll()和 remove()有什么区别?

Poll()和remove()方法一样都是移除并返回队头,但是poll在队列为空的时候返回null,而remove在队列为空
的时候抛出NoSuchElementException异常。

15.哪些集合类是线程安全的?

(1.vector:比ArrayList多了一个线程安全。
(2.Statck:堆栈类,先进后出
(3.Hashtable:比HashMap多了一个线程安全
(4.Enumeration:枚举类型

16.迭代器 Iterator 是什么?

为了方便处理集合的元素,java出现了一个对象Iterator,该对象提供了一些方法专门处理集合中的元素,例如删
除和获取集合的元素,这种对象就叫迭代器

17.Iterator 怎么使用?有什么特点?

方法:
使用Boolean hashNext()判断迭代器下一个元素还有没有,有则返回true
Object next()返回迭代器下一元素
Void remove()删除上一个返回的元素
特点:
Iterator在遍历集合元素的时候不能修改集合否则会抛出异常
Iterator在遍历集合的过程中可以用remove方法移除集合内元素
Iterator必须依附一个Collection存在,因为Iterator本身不存在数	据装载功能
Iterator.remove()是移除上一个Iterator.next()方法返回的对象

18.Iterator 和 ListIterator 有什么区别?

List和Set都拥有Iterator迭代器,而List也拥有ListIterator,两者有时候不能通用主要差别有:
(1.ListIterator有add方法,可以向List添加对象而Iterator不能
(2.ListiIterator和Iterator都拥有hashnext方法和next方法,可以实现顺序向后遍历,但是ListIterator
拥有hashprevious()和previous()方法,可以实现逆向(顺序向前)遍历Iterator就不行
(3.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现Iterator没有这功能
(4.都可以实现删除对象,但是ListIterator可以实现修改功能(set())而Iterator不能

. 19.怎么确保一个集合不能被修改?

我们可以采用Collections包下的unmodifiableMap方法,通过这个方法返回的map,是不可以修改的。他会
报java.lang.UnsupportedOperationException错。
同理:Collections包也提供了对list和set集合方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你相信光吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值