Java集合 学习小结:

先附一图(自己画的又难看还说不全,就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菜鸟的弱小心灵…

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。