JAVA集合框架(二)------Set和Map学习

接着昨天研究的List集合,今天继续学习了Set和Map集合框架

虽然在这里一起学习,但Set和Map并不是并列的,Set是与List并列的Collection的子接口,而Map是一个独立的接口.

Set是一个不能包含重复元素的集合,也称集,主要实现有HashSet,LinkedHashSet,TreeSet三种实现,但实际上,它们的底层HashSet是由HashMap实现的,相应的,LinkedHashSet是基于LinkedHashMap实现的,TreeSet是基于HashMap实现的,那么你可能会问,Map不是是由键值对组成的吗?是的,Set只基于Map的key来包装自己,所以在研究Set前不如我们先研究Map

Map是由一系列键值对组成的集合,也可以说是双列结构,提供key和value之间的映射,一个key对应一个value,key是唯一的,value可以相同,但他们的key不能相同,在上面我们已经提到过,Map主要有HashMap,LinkedHashMap,TreeMap三种实现,下面我们就来一一进行研究.

1.HashMap

HashMap是以哈希表数据结构实现,具体一点是是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,哈希的作用主要是为快速查询而设计的,它的内部是由一个hash桶数组(Note[] table)(Node是Entry的实现)来维护的,HashMap利用key的hashcode()的hash值来对该对键值对(Node)进行归桶,里面涉及到桶的个数和装载因子,因为时间原因今晚不在此说明,在这里主要研究一下Put(加入键值对)过程:

image

上图采集自https://www.cnblogs.com/xawei/p/6747660.html

上图对Put过程已经显示得非常明了,但是这里要说一下的是在判断key是否存在操作时,不仅判断了key的hashcode值是否相等,在判断key的hashcode相等之后调用key的equals方法对key值是否存在进行判断,这里在JDK源码中的这一句:

if (e.hash == hash && 34 ((k = e.key) == key || (key != null && key.equals(k)))) break;

所以,当我们在使用Map集合的时候,我们就要注意复写自定义对象(例如自己写的Student类)的hashCode()和equals()方法,如果不进行复写的话默认使用的是Object的hashCode()和equals()方法,Object的hashCode()默认是对对象地址等数据进行hash,所以尽管两个自定义对象的内容一样两者的hashCode也不一样,而equals()方法不复写的话默认使用的是简单粗暴的==方式来判断两者是否是同一个引用,如果两个内容一模一样的对象自然也不能判断为true.

2.LinkedHashMap

LinkedHashMap是HashMap的一个子类,它维护了Map的插入顺序,也因为它维护了插入顺序,导致它的性能略低于HashMap的性能.

3.TreeMap是一个有序的key-value集合,是基于红黑树实现的,每一个节点作为红黑树的一个节点,TreeMap的特点是在存储是会根据key来进行排序,

排序方式分为两种,一种是自然排序,另一种是定制排序,自然排序的话key必须实现Comparable接口,定制排序的话自己创建一个comparator对象,不需要实现Comparable接口.

TreeMap判断元素相等的标准有些不同,通过compareTo()方法返回0和equals()返回true则认为两个key相等.

现在学习了三个Map实现类,那么三个Set实现类实际上是使用的三个Map实现类的key来维护的,value统一使用一个Object对象

好了这两天学习了JAVA常见的10个集合框架,队列平时用到的少在这里没有研究

还有同步与不同步问题,即线程安全与否问题,在已学习的集合框架中只有Vector与Stack,还有HashTable,但是它们三个都已经过时了,继续搜索了一下现在常用的并发安全的集合框架主要有:

ConcurrentHashMap:线程安全的HashMap的实现 
CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayList 
CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素 
ArrayBlockingQueue:基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量可以限制 
LinkedBlockingQueue:基于链表实现,读写各用一把锁,在高并发读写操作都多的情况下,性能优于ArrayBlockingQueue
所以在多线程的情况下应该选择以上的集合进行操作,今天的学习就到这里~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值