先附一图(自己画的又难看还说不全,就down个美观点的):
具体每个接口和实现类是什么意思就不说了,菜鸟一枚可能也说不太清,此篇主要说一些本人学习过程中印象深刻的问题。
1、 Vector、ArrayList、LinkedList的联系与区别:
Vector与ArrayList唯一区别就是Vector线程安全而ArrayList不是,所以在不考虑线程安全问题的情况下,当然是使用ArrayList,虽然方法都一样,但是Vector性能稍弱;
至于ArrayList与LinkedList,前者使用数组结构,而后者使用链表结构,那么两者的实际用途就显而易见了,快速随机访问必须是ArrayList好,而大量插入、删除操作就是LinkedList擅长的事情了。需要特别指出的是:每个ArrayList都有个容量,它当然可以自动增加,但是在做大量数据添加前调用个ensureCapacity可以提高效率,效率党们肯定不会忘记这一点。
另:LinkedList也非线程安全哦,也没有同步方法提供,不过可以在创建List时new个同步的出来,大概是这样
List list = Collections.synchronizedList (new LinkedList ( ) )
ArrayList…应该同理吧
2、 Stack与Vector
图中可见,Stack继承于Vector,也就是说基本的结构还是一样的,额外有五个方法让Stack成为了有别于Vector的一种数据结构:push、pop、peek(得到栈顶的元素)、empty(测试堆栈是否为空)、search(检测一个元素在堆栈中的位置)。
3、 HashMap
HashMap通过hash值对元素进行查找,在Map 中插入、删除和定位元素,无疑HashMap当作首选,那么问题来了,不排除两个元素的hash值一样啊,这时又该怎么存储呢,已有认知是:原本一个HashMap应当是个类似于数组的结构,当hash值相同时就会有冲突,那么再将hash值相同的元素以链表形式存储在所谓的桶(Bucket)中,这样理解比较模糊,于是开始一段上网搜的“不归路”,结果也分享给大家吧:
HashMap的冲突处理问题
1)、开放地址法
开放地址法是对那些发生冲突的记录,用hi=(h(key)+di)mod
n方法再次确定Hash地址。
n:为哈希表长;
di:为增量序列,其取法有以下三种:
1)线性探测再散列
di= c * i
2)二次探测再散列
di = 12, -12, 22, -22, …,
3) 随机探测再散列
di是一组伪随机数列 或者
di=i×H2(key) (又称双散列函数探测)
例如表长为11的哈希表中已填有关键字为17,60,29的记录,H(key)=key
MOD 11, 现有第4个记录,其关键字为38
H(38)=38 MOD 11=5 冲突
H1=(5+1)
MOD 11=6 冲突
H2=(5+2)
MOD 11=7 冲突
H3=(5+3)
MOD 11=8 不冲突
对于其他增量序列的方法也是如此计算。
2)、链地址法
将所有哈希地址相同的记录都链接在同一链表中。也就是说,当HashMap中的每一个 bucket里只有一个Entry,不发生冲突时,Hashmap是一个数组,根据索引可以迅速找到Entry,但是,当发生冲突时,单个的bucket里存储的是一个Entry链,系统必须按顺序遍历每个Entry,直到找到为止。为了减少数据的遍历,冲突的元素都是直接插入到第一个Entry后面的,所以,最早放入bucket中的Entry,位于Entry链中的最末端。这从put(K
key,V
value)中也可以看出,在同一个bucket存储Entry链的情况下,新放入的Entry总是位于bucket中。
注:以上两段为CV大法所得
其实还有很多处理冲突的方法就不列出来了(真相是还没看懂),事实证明最简单的还是最容易被人记住的…..
另外还想说一下一个WeakHashMap,其实不是weak了,应该说是Stronger了,以为这里边的key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收,哼,知道“垃圾回收机制”的厉害了吧。
4、 TreeMap
如果想按照自然或者自己的排序方式遍历Map的话,找TreeMap就对了,因为添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是SortedMap的唯一一份实现。此处用小段代码让大家随意感受下,就是这么个意思,细节可以忽略嘛
Map<User> sortByUserName =
new TreeMap<>(
new Comparator<User>(){//对象定义为匿名内部类的实例
@Override
public int compare(Item user1, user user2) {
//具体比较方法自定义返回值{-1,0,1}
}
});
如果有这种需求的话,酱紫用也很爽吧。
以上内容作为一次总结或者说记录吧,后期如果有其他发现还会继续往上添加,内容里肯定还会有些不妥当的地方,希望各位看官照顾一下一个java菜鸟的弱小心灵…