JAVA中集合总结

JAVA中的集合按照接口继承分为collection和Map两个分支,collection为数组结构,独有的特点是可以迭代。Map为键值对结构,往往是散列算法(hash),当然collection接口下的Set集合也是散列算法

散列算法(hash)

你可以这样来理解,就是计算机中的任何对象包括文件、字符串都是二进制组成,那么我给这些字节进行取模(除以某个数求余数,这样除以那个数不定并且很多数除以这个数值都可能相同如:10%3 ==1 ,9%2==1,3%2==1 非常多种可能),hash算法中还运用到异或(异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1)还运用到移位(<< : 左移运算符,num << 1,相当于num乘以2,>> :右移运算符,num >> 1,相当于num除以2
“>>> : 无符号右移,忽略符号位,空位都以0补齐)。

散列算法的目的:

1、表示计算机内存中的对象唯一性
2、这种唯一性是很难逆向,比如MD5算法其实就是一种hash算法,
3、生成的hash值碰撞几率很低几乎可以忽略(碰撞几率指相同的值类似UUID)
4、hash值根据对象的变化而变化,比如:我们人脸识别你可以暂时理解为hash算法,我们让计算机扫描我们的面部细节进数据库,如果正好有人脸被烧伤那么人脸识别是无法成功的,因为被烧伤的脸会对应一个不同的hash值。

常用的集合分支

这里写图片描述

collection分支,这个分支一般理解为数组结构,并不全部符合数组结构标准,比如SET其实是无序的。

1、数组结构为连续的分配存储空间,所以可以根据下标来获得数据,内存占用大小是数组元素存放大小的总和。
2、collection下面分支出List(有序集合)、Set(无序集合、元素不重复)、Queue(队列),所以是三个分支都拥有迭代器的功能

3、List下面分支为ArrayList,典型的数组结构是由一组连续分配的空间组成,下标表示元素的位置,下标之间的差为所在元素内存地址值之差。所以在查询方面表现优秀,获取任何一个位置的地址,可以很快计算出下一个元素的地址,由于是连续分配空间所以会造成空间碎片化。

List下面的分支LinkedList,一种链表数据结构,这种集合并不是连续分配的空间,而是每个独立的空间内保存着上一个或下一个空间的地址,所以查询方面表现的不足(因为要向警察审问犯人一样一层一层的深入获取线索),但是在删除修改上表现的非常高效(只需要修改局部上一个元素和下一个元素的值)

List下面的分支Vector,它和ArrayList结构一样,不同之处是在这个集合中处处用到同步,同步带来的后果是效率成量级的减少,当然在并发的时候更安全。

4、Set下面的分支HashSet,是非连续空间并无下标,保存不重复元素,无序,每个空间的标识转换为hash值存放于一个链表数据结构中,根据hash值寻找到具体的位置。

5、Set下面的分支TreeSet,该分支实现与sortedSet,在sortedSet中进行了排序处理,所以TreeSet拥有Set的所有功能还拥有sortedSet的功能

6、Queue下的分支BlockingQueue(阻塞式队列-线程安全),你可以理解为JAVA中典型的资源竞争案例——生产者消费者。BlockingQueue就是那个篮子(资源容器),如果资源没有了消费者就处于等待状态,等着生产者生产。如果资源容器已满,生产者就停止生产等待着消费者消费。
BlockingQueue下面两个分支ArrayBlockingQueue和LinkedBlockingQueue,它们都拥有BlockingQueue特征,但前者必须指定容器大小,而后者是链表形式所以可以无限扩展空间,当然我们也可以收到控制后者空间最大值。

Queue 下还有一个独立分支: ConcurrentLinkedQueue 他和LinkedBlockingQueue最大的区别是后者是暴利式的加锁,而前者是是无等待 (wait-free)”算法,值得注意JDK1.8做了很大的改版采用CAS算法。(这种算法你可以理解为数据库的乐观锁,hibernate的version,比如:运行所有人进行并发操作并不加锁在类或者方法,但是在进入方法的时候生成一个版本号1.0,当修改完成后,出方法时,对比这个版本是否还是1.0,如果不是代表其他人已经抢先修改所以回滚修改,显示失败,如果版本还是1.0修改成功)

这里写图片描述

Map集合是键值对形式,键值以hash值保存在entrySet实体中,entrySet是Set的扩展,所以拥有迭代功能。当然Key和Value 都可以转化为Set实体,从而拥有迭代功能。我们既然用Map其实就是想运用它高效的key获取Value ,如果要用迭代获取值我们完全可以考虑用Set集合。

1、Map下面的分支:HashMap拥有Map的所有功能但是非线程安全
2、Map下面的分支:HashTable拥有Map的所有功能,做了非常严格的同步处理所以线程安全,相对于HashMap效率变低。
3、Map下面的分支TreeMap拥有Map的所有功能,相对于HashMap做了排序处理
4、Map下面的分支ConcurrentMap拥有Map的所有功能,相对于HashMap做了同步处理,相对于HashTable同步处理方式不一样ConcurrentMap用wait-free或CAS算法且加锁并不在类而是在方法更松散,所有ConcurrentMap效率比HashMap低但是比HashTable高但线程安全。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值