1.List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合。
2.List,Set和Map的区别:
List:中存储的数据是有顺序的,并且值是允许重复的。
Set:中存储的数据是无序的,并且值是不允许重复的,但是元素在集合中的位置是由hashcode 决定的,即存进去的位置是固定的。
Map:中存储的数据是无序的,它的键是不允许 重复的,它的值允许重复。
3.List的接口有三个实现类:
(1).LinkedList:基于链表实现的,链表内存是散列的,增删快,查询慢。
(2).ArrayList:基于数组实现的,非线程安全的,效率高,增删慢,查询快。
(3).Vector:基于数组实现 的,线程安全的,效率低,增删慢,查找快。
4.Set接口有两个实现类:
(1).hashSet:底层是由HashMap实现的,不允许集合中有重复的值,使用该集合时需要重
写equals()和hashcode()方法。
(2).LinkedHashSet:继承与HashSet,同时又基于LinkedHashMap来进行实现,底层使用的
是LinkedHashMap。
5.Map接口有四个实现类:
(1).HashMap:基于hash表的Map接口实现,非线程安全,高效,支持null值和null键。
(2).HashTable:线程安全,低效,不支持null值和null键。
(3).LinkedHashMap:是Hash的一个子类,保存了记录的插入顺序。
(4).TreeMap:基于二叉树实现,能够把它保存的记录根据键排序,默认是键值的升序排序。
6.ArrayList和LinkedList的区别:
ArrayList:
(1).底层是由数组实现的,非线程安全的,建议单线程时使用,多线程中可以选择Vector。
(2)..对于随机访问get和set,ArrayList通过数组下标快速查找,效率高。
(3). 对于增加和删除时,因为是数组的数据结构,要移动数组里的元素,效率低;查询修改效率高。
LinkedList:
(1).底层是由双向链表实现的,线程安全的。
(2)..对于随机访问get和set,LinkedList要移动指针,从前往后找,效率低。
(3).对于增加和删除时,效率高,查询修改效率低。
7.hashMap的底层理解:
(1). 存储结构为:数组+链表+红黑树(jdk1.8以后有的),添加红黑树的目的是提高效率。
(2).hashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
(3).HashMap的特性: 存储方式是键值对,实现快速存取数据;允许null键/值;非同步;不保证有序(比如插入的顺序)。实现map接口