Java容器里有很多写好的容器API,这使我们很方便的可以存储、操作我们的数据。
下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理
一、常用的容器目录
上图可以看出,java容器分为两种:Collection和Map
Collection:主要是单个元素的集合,由List、Queue、Set三个接口区分不同的集合特征,然后由下面的具体的类来实现对应功能,然后Collection还继承了Iterable(为集合提供了for-each循环的支持,是一个可以为不同的集合类提供遍历的最佳方式)迭代器
Map:有一组键值对的存储形式来保存,可以用键对象来查找值.
Map里的K-key(密钥类型),v-value(映射值的类型)
简介:
1.Map是java集合框架的根接口,另一个是Collection的接口
2.一个Map中,不能包含重复的Key,一个Key只能映射到一个value
Map本身并不是一种集合,但是Map可以提供三种集合视图:
1.Key——value映射Set视图
2.Key的Set视图
3.value的Collection视图
注意!!: 如果一个可变(Mutable)对象作为Map的key,需要特别注意,如果这个对象的修改影响到了equals比较,那Map的行为是不明确的。针对此种情况有一个很好的示例,Map不允许将自身作为key,因 为这种情况下,equals()和hashcode()不能被很好地定义。
一般用于的Map应该提供两个构造函数:
1.无参构造函数,创建一个空的Map
2.有一个形参为Map的构造函数,既复制一个Map
Map的实现类对所包含的元素会有不同的限制,HashTable的键和值都不允许为null,HashMap的键和值都允许为null
二、List
从此图看出List继承的是Collection集合接口,List最大特点就是所有的元素是可重复的,List接口在Collection的基础上增加了很多的方法.List主要分为ArrayList和LinkedList,前者的底层是使用数组实现的
List,后者是使用链表实现的List,还有一个Vector,它是一个被弃用的类,因为它是线程同步的,而我们平常使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数
据导致数据不同步.这样会导致访问速度变慢
Stack是满足"后进先出"规则的容器,注意LinkedList可以实现所有栈的功能
1).ArrayList
1.ArrayList是一个可以动态增长的数组
2.我们都知道Java中的数组一旦指定了长度就不可变了,如果我们在业务中需要使用动态的数组,就可以使用ArrayList(默认长度是10,如果插入的数据超过了10,ArrayList会不断的自我增长)
3.ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除慢
我们可以看到在ArrayList里的底层有EMPTY_ELEMENTDATA 这一段源码,它的作用是为了优化创建ArrayList空实例时产生不必要的空数组,使得所有ArrayList空实例都指向同一个空数组。 DEFAULTCAPACITY_EMPTY_ELEMENTDATA是为了确保无参构成函数创建的实例在添加第一个元素时,最小的容量是默认大小10。
2.)LinkedList
LinkedList是使用链表实现的容器。
在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢
使用LinkedList可以实现很多队列、栈的数据结构,并且有很多方法很类似,但是有细小的差别
3.)Queue
队列是一个满足“先进先出”的数据结构。
LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue
4.)Set
(LinkedHashSet
集合框架提供LinkedHashSet类作为Set接口的另一个实现类
HashSet不保证顺序元素.LinkedHashSet在插入元素时保持元素顺序
(文章有待补充,哪里没有解释到位,请指出)