图片出自《Java编程思想》
上图清楚且完整的描述了集合包中的类以及接口之间关系
本篇文章只介绍常用的容器及其原理
首先Collection接口的常用三大子接口list,set,queue
List接口常用实现类
- ArrayList
//这是arraylist的源码
transient Object[] elementData;
//由这个构造函数可以看出ArrayList其实就是一个数组,
//所以arraylist的效率很好
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
由上述源码可知ArrayList由数组实现,数组大家都很熟,不做过多解释。
2.Linkedlist
由图片便可看出这是基于链表实现的
不过linkedlist有些有趣的方法
除了包含链表的增删改查
竟然将栈和队列的方法加进去了
peek方法就是返回容器头数据不删除
poll方法返回容器头数据并删除
链表的知识可以参考链表
提示 Java的stack类是基于Vector容器,这种老旧的容器是为了兼容。所以尽量不要使用。
SET接口其子类保持一个原则就是不予许重复
SET常用的子类
1 HashSet
显而易见hashset基于Hashmap实现的
有和不同。
HashSet<Integer> hashSet = new HashSet<>();
System.out.println(hashSet.add(55));
System.out.println(hashSet.add(55));
运行结果
true
false
所以hashset是不能重复的
treeSet基于treemap实现
treeSet不能重复属性
注意treeSet是有序的
treemap是基于红黑树实现的,
红黑树是一种平衡树有兴趣的同学可以去了解一下
Map 也就是图 属于集合包的另一方向。十分重要
常用类
1 hashmap
API中清楚的解释了hashmap的一些信息但是并没有说明其实现方法通过观察源代码发现其实现方法为分离链式法
不懂的同学可以参考分离链式法
注意 hashmap的put方法
将指定的值与此映射中的指定键相关联。
如果hashmap以前包含一个关键字的映射,那么旧的值被替换。
所以其并不是严格分离链式法解决hash冲突
水平有限,若有错误,欢迎指正