基本的容器有四个,分别对应四个接口:
List
:按照插入的顺序保存元素,可以有重复的元素。
Set
:不可以有重复的元素,可以理解为哈希表。
Queue
:按照队列规则先进先出。
Map
:将两个元素相关联,可以用键来查找值。
其中List
、Set
、Queue
这三个接口继承了Collection
接口。
Map
则是自成一家,没有继承别人。
各接口的常用实现类
List
:ArrayList
、LinkedList
Set
:HashSet
、TreeSet
、LinkedHashSet
Map
:HashMap
、TreeMap
、LinkedHashMap
Queue
:PriorityQueue
、LinkedList
ArrayList
和LinkedList
这两个是实现类,实现了List
接口,这两个类可能会增加一些接口没有的新方法(刷题时一般用不到)。
同理,Set
、Queue
、Map
的实现类也一样。
接下来把这些关系用一副图表示出来
如果需要用到一个List
容器可以像下面这样子定义
ArrayList<Integer> list = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
有人也会定义成
List<Integer> list = new ArrayList<>();
有什么区别呢?
区别就是用
ArrayList<Integer> list = new ArrayList<>()
定义出来的list
可以使用的方法多一些。
而用
List<Integer> list = new ArrayList<>()
定义出来的list
可以用的方法少一些,因为类实现接口的时候可能会增加一些新的方法。
一般情况都可以定义成
List<Integer> list = new ArrayList<>()
就行了。因为我们原本就是想用List
这个容器,List
里的方法已经够我们用了。
除非你一定需要用到ArrayList
里面特有的方法你才定义成
ArrayList<Integer> list = new ArrayList<>()
其实使用哪个无所谓,只要不把自己困扰住就行了,知道为什么可以这样子定义就可以了。
Set
、Map
和Queue
的定义也和List
一样。
List
List
接口的实现类有ArrayList
、LinkedList
ArrayList:底层使用数组实现的,查找快,插入数据和删除数据慢(常用)
LinkedList:底层使用链表实现的,查找慢,插入数据和删除数据快(常用)
创建一个List
容器
List<Integer> list = new ArrayList<>();
List常用方法
list.add(int element) //添加元素(常用)
list.get(int index) //根据索引查找元素
list.size() //反回元素的数量(常用)
list.isEmpty() //判断是否为空(常用)
Set
Set
接口实现类有
HashSet:使用散列函数查找快速(也就是常说的哈希查找)(常用)
TreeSet:排序默认从小到大
LinkedHashSet:使用链表维护元素的插入顺序
创建一个Set
容器
Set<Integer> set = new HashSet<>();
Set常用方法
set.add()//添加元素
set.remove(Object o)//删除一个对象的引用
set.clear()//清空容器
set.isEmpty()//判断容器是否为空
set.contains(Object o)//判断容器是否包含o(常用)
set.size()//返回容器中元素的数目
Map
Map
接口实现类有
HashMap:用于快速访问,常用与哈希有关的(常用)
TreeMap:键处于排序状态
LinkedHashMap:保持元素插入的顺序
创建一个Map
容器
Map<String,Integer> map = new HashMap<>();
Map常用方法
map.put() //添加键值对
map.remove(Object key) //删除键值对
map.remove(Object key,Object value) //删除键值对
map.size() //返回元素的数量
map.clear() //清空容器
map.isEmpty() //判断容器是否为空
map.containsKey() //判断容器是否包含某键
map.containsValue() //判断容器是否包含某值
Queue
Queue
接口实现类有
PriorityQueue:优先队列(常用)
LinkedList:普通队列(常用)
有些人可能有疑问 怎么Queue
还和LinkedList
联系起来了,其实Queue
的添加队尾和删除队头不就是相等于插入链表的尾结点,和删除链表的头结点吗,所以说不需要在定义一个Queue
的实现类了。
Queue常用方法
offer()添加元素(常用)
peek()返回第一个元素(常用)
poll()返回第一个元素并删除(常用)
add()添加元素
element()返回第一个元素
remove()返回第一个元素并删除
put()添加元素
take()返回第一个元素并删除
以上常用是基于刷题而言的。
如果是以后学到框架之类的需要用到其他线程安全性的容器,那时常用和少用就又不一样了,不过理解了这些,到时学线程安全的容器的时候上手也很快,原理差不多只是名字不同罢了。