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菜鸟的弱小心灵…

时间: 2024-12-28 01:26:21

Java集合 学习小结:的相关文章

java集合学习一

1.Set存放的元素是无序的不可重复. 2.List存放的元素为有序可重复. 3.重写equals方法,一般最好重写hasCode方法,当对象作为key的时候及索引,会使用hasCode方法进行查找. 4.容器对象在调用remove,contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和 hashCode方法.对于自定义的类型,需要重写equals和hashCode方法以实现自定义的对象相等规则.相等的对象 应该具有相等的hashCode. 5.ArrayList底

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次

java集合框架小结(进阶版)之HashSet篇

建议先看下:java集合框架小结(进阶版)之HashMap篇 基本概念: hashSet: 根据java集合框架小结(初级版)图示,HashSet是AbstractSet的一个子类,是基于Hash算法的Set接口的实现,顾名思义.允许添加null. --------------------------------------↑ 以上都是扯淡 ↑,↓ HashSet完全是在挂羊头卖狗肉 ↓------------------------------------------- 何谓挂羊头卖狗肉?大家

深入Java集合学习系列:HashMap的实现原理

参考文献 引用文献:深入Java集合学习系列:HashMap的实现原理,大部分参考这篇博客,只对其中进行稍微修改 自己曾经写过的:Hashmap实现原理 1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2. HashMap的数据结构: 在ja

java集合框架小结(初级版)

今天大概的整理了一下java集合框架,在这里做一个小结,方便以后查阅,本博文主要参考资料为<java编程思想第四版>第11章——持有对象以及JAVA 1.6 API文档.并没有研究更深入的第17章<容器深入研究>.大概介绍了集合框架中几个比较常用的集合类. 以下为正文. 首先来看一张图,不太会用visio,画的可能不太好看 图中将接口.抽象类.实现类.淘汰类(圆角矩形)进行标注.有直线连接的类(或接口)表示是子类关系或者实现关系 由图示可以看出,集合类主要有两个集合接口: 1.Co

深入Java集合学习系列:LinkedHashMap的实现原理

1. LinkedHashMap概述: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变.   LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序.   注意,此实现不是同步的.如果多个线程同时访问链接的哈希映射,而其中至少一个线

转:深入Java集合学习系列:HashSet的实现原理

0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT

自动化测试Selenium Webdriver (JAVA)学习小结

自动化测试--Selenium学习小结 一.自动化测试的概念及意义: 1.什么是自动化测试: 一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件. 2.意义: 让测试更有效率,利用更多的空余时间,减少人力资源. 二.selenium工具 我用的是java语言,所以接下来的例子和方法都是基于java的. 1.环境配置 (1)Jdk的配置: 我用的是1.7的jdk,配置方法都一样,新建一个JAVA_HOME,把你装好的jdk的路径复制

Java集合学习(一)

什么是集合?Java官网API文档里这样定义和描述的: public interface Collection<E>extends Iterable<E> 集合表示一组对象,每一个对象称为元素.集合可以是包含重复元素的,也可以是各个元素互不相同.它既可以是无序的也可以是有序.JDK并没有提供它的直接实现,而是提供了更具体的子接口比如Set,List等实现.Collection接口通常在需要最高抽象性的集合传递和操作时被提及. Bag及MultiSet(无序且能包含重复元素)相关接口