java基础知识---java集合类知识点解说

  这篇文章主要是解说一下"我终于理解精通java的"精通"意思(一)"里面我提到的相关java知识点,在上一篇文章中我一共面试他有如下的知识点:设计模式(一般指GOF23种设计模式),java常用集合类. 关于GOF23种设计模式一篇恐怕写不完,暂且放在设计模式分类那边去讲解吧. 这里先讲解我们常用的java集合类以及他们的区别.

  我们软件开发过程中常用的集合接口主要有以下几个接口. Collection,List,Set,Map,Queue. 如下图:

 

java集合相关类图,看不清的请到我的相册上看,下面讲解一下这些类分别做什么用,以及有什么区别.

  我们先来看一下Collection接口,Collection接口有两个子接口,分别是List和Set.Collection接口主要是一些添加,删除,迭代,判断是否为空,判断是否包含某个元素,集合大小,清空,与其他集合的交集等操作. List主要特点是有序,也就是插入是什么顺序,取出来仍然是什么顺序,可以根据位置进行插入或删除或取元素. Set的主要特点是无序的,且元素不能重复插入(判断元是否重复是根据equals方法来决定.但带有Hash的如HashSet等还得判断hashcode是否相等),最多允许一个null元素.

  下面先介绍一下List接口下的类, ArrayList,LinkedList,Vector,Stack,ArrayList是用数组实现的,LinkededList是采用链表实现的.Vector和ArrayList一样是用数组实现,只不过Vector是多线程安全的.Stack就没什么好说,就适配一下Stack其他和Vector一样.数组与链表大家在数据结构里优缺点肯定知道,这里不多讲.

  再来看下Set,EnumSet主要是给枚举专用,HashSet与TreeSet,HashSet是基于HashMap来实现的,TreeSet是基于TreeMap来实现的,TreeSet与HashSet不同的是它是有序的.LinkedHashSet与HashSet又有什么不同呢,其实就一点,就是LinkedHashSet顺序是可预测的,元素的顺序是你放入容器的顺序.由于LinkHashSet是基于LinkHashMap实现的,同样也说明HashMap与LinkedHashMap的区别也是因为LinkedHashMap的key值顺序是可以预测的.HashMap与TreeMap的区别是TreeMap的key值是有序的.顺序由你实现的或传入的compare或comparator接口来决定.

  接下来讲一下Map接口, Map接口是用来储存键值对(那key,value).可以根据key获取value. 关于HashMap,TreeMap,LinkedHashMap上面已经讲过.现在主要讲一下IdentityHashMap.IdentityHashMap中的key值是不允许重复的,这里不允许重复不是用equals和hashcode来判断,而是直接用"=="来判断.WeakHashMap这个是个比较高级的话题,可能要开个话题专门讲一下,现在我们先简单介绍一下,我们知道java内存管理模型中有三种引用类型:强引用,软件引用,弱引用. 从线程的根开始强引用所指向的对象是不能被垃圾收集器回收.软件引用所指向的对象是当虚拟机内存接近不够用时会强制回收,弱引用所指的对象是垃圾收集器执行到时可以回收,如果没有执行到仍然是存在内存里.这里的WeakHashMap存key和value时,他把key作为弱引用来实现.也就是当你用key去取值时,如果垃圾回收器还没有执行回收操作,可以取到值,如果已经回收了,将会取到null.

  下面讲一下Queue接口,ConcurrentLinkedQueue是一个标准的先进先出队列实现,非线程安全,且不允许空元素.LinkedBlockingQueue与ArrayBlockingQueue,其中ArrayBlockingQueue必须指定队列大小,并且不能再改变.而LinkedBlockingQueue指定大小是可选的,如果没有设置就默认为Integer.MAX_VALUE,同样指定后不能再改变,当队列为空时,从队列取值便会阻塞,当队列满时,要向队列插入值时便会阻塞.PriorityQueue优先级队列关键取决定元元素实现的Comparable接口,或在构造时指定的Comparator接口.当构造时指这了Comparator,优先使用Comparator,而不用Comparable,来判断优先级.优先级高的先出队,当同样两个高优先级相等时出队是无序的.PriorityBlockingQueue的阻塞方式与LinkedBlockingQueue或ArrayBlockingQueue相同.又具备PriorityQueue的特点.DelayQueue队列是按放入元素最先过期的元素取出来,如果取的时候还没有过期的元素将返回null.SynchronousQueue这个队列比较特殊,他不能放入任何元素直到有其他线程来取元素.同样,不能取任何元素直到有其他线程放入元素.真正的在多线程环境中的先进先出.

  另外图里画错的有一个叫LinkedBlockingDeque,它是实现接口Deque,唯一不同的是Deque是双向的队列,就是可以在两头增加删除元素. 能实现后进先出.其他没有什么区别.

  最后讲一下包含Hash这个Hash(散列的原理),包含Hash的都是用散列方法来存放元素到容器当中,当判断是否相等时,首先是是获取对象的散列值来计算放在哪个散列桶.然后从桶里所有元素里取出来一个一个用equals来比较是否相等. 所以如果使用包含Hash的容器一定要注意,你重写了equals也要重写hascode. 不要认为equals相等就应该相等. 否则将得不到预期的结果.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值