1.集合

参考文章:https://www.cnblogs.com/leeplogs/p/5891861.html

Java面试——集合以及常见的集合分析

Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和ListSet中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式

Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value

Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。

Java中的集合分为两类,一类是存value(collection接口),一类是存放key-value(Map);

存放value的主要分为三类,Set、List还有queue;

其中Set是无序,不可以重复的,根据equals和hashcode来判断,也就是如果一个对象要存储到Set中,需要重写equals和hashcode方法;

其中List是有序可重复的;

Map是键值对,键不能重复,值可以重复;

2、ArrayList和LinkedList的比较

①实现原理上:ArrayList底层实现的是数组(可扩展的动态数组),linkedlist底层实现的是链表;

(关于数组和链表的区别详见我其他的播客:https://blog.csdn.net/sinat_39587248/article/details/80515316)   

 数组具有查询特定元素比较快,而插入和删除、修改比较慢的特点(数组在内存上是一块连续的内存,如果插入或者删除是需要移动内存);

    链表不要求内存是连续的,在当前元素中存放下一个或者上一个元素的地址,查询时需要从头部开始遍历,所以查询效率低,插入时不需要整体移动内存,只需要改变引用指向即可,所以插入或者删除的效率高。

②:所以实际使用的时候,如果是查询较多,插入删除修改较少的时候,选择ArrayList,相反,如果是插入修改删除较多的时候,选择linkedlist;

3、HashMap和HashTable的区别?HashTable和ConcurrentHashMap的区别?

相同点:HashMap和HashTable都是存储Map类型的数据的;

区别:①HashMap是线程不安全的,效率较高,key和value可以存放最多一个null和多个null,父类是AbstractMap

②HashTable是线程安全的,效率叫低,key和value不能出现null,父类是Dictionary;


如果想要实现线程安全并且效率高就选择ConcurrentHashMap,ConcurrentHashMap实在HashMap的基础上,吧原先的Map分成很多个小segment,给每个小segment加锁(就是个小HashTable),解决了之前一个HashTable一个锁,一个Map直接锁住后面整个资源,导致效率低的问题。效率提高了N倍,默认提升了16倍。

相关文章: