专栏首页lgp20151222JAVA 集合类小结

JAVA 集合类小结

一 集合和数组

因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的。

说到集合,必须了解数组和集合。

Java的数组长度固定,集合长度不定。集合是特定的数据结构的集合。

而go里面并没有集合,而是叫数组,切片和键值对。数组同样长度固定,切片键值对长度不固定,键值对是k-v结构。

go和Java的不同就是,切片和键值对要自己写方法成为特定的数据结构,才能合Java的集合类差不多。

也就是说Java的集合其实是Java开发者为了开发方便,定义的一系列数据结构的。那么只要理解java几个数据结构的特性那么就很好理解了。

二 基本接口 map,Iterable,collection

最上层的接口

map和Iterable。

map是键值对,Iterable是集合的迭代子。迭代子理解起来,就是集合每个元素的一个包装

次顶层的接口

collection实现Iterable接口,提供了按索引取值的方法。

这里可以看出collection对应go的切片,map和map对应。

三 数据类型接口 map,list,set

list,set实现collection接口。

list是有序,可重复的数据。

set是无序、不能重复数据。

map是键值对、键不可重复、值可重复。

四 数据功能区分

在上面说的三大类型下,根据线程安全,查询速度快,插入速度快,排序又有四个功能分类。

红色为面试常问结构

排序           TreeSet,LinkedHashSet   TreeMap,LinkedHashMap

线程安全  vector     synchronizedSet       Hashtable,ConcurrentHashMap

查询速度快   ArrayList    HashSet          HashMap

插入速度快   LinkedList  HashSet HashMap  

list本来就是有序的,所以排序为空。

HashSet,HashMap为什么插入查询快的原因则是,因为用了hash算法。

LinkedHashSet和LinkedHashMap虽然本质上只是HashSet,HashMap实现了排序接口,但是插入的时候就排序,所以较慢。

TreeSet,TreeMap本身是按红黑树结构排序,但也能重写排序接口。

synchronizedSet是Colletions这个工具类里,算是冷门知识点。

五 数据结构的使用

第一,1.8引入了Stream之后,排序基本可以不用了,因为排序的使用次数低,我们不必保证数据插入或者查询一定有序。只需要我们取出来的时候有序即可,而Stream特性则大大的简化了我们自己写排序的代码量。

第二,分布式下考虑单机的线程安全,再用线程安全类简直杀鸡用牛刀。基本上synchronized,lock,原子类,Volidate之类的就能保证分布式下单机的线程安全就行了。

第三,插入速度的考量,降低io操作硬盘操作写操作,基本是每个系统到了后期性能提升一定要考虑的事情,而此时基本使用数组而非集合。

综上,我们基本使用查询快的类就好了。

六 遍历

1.遍历迭代子Iterator,而不直接遍历对象

2.for循环结束,立马回收Iterator

   for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println("键" + e.getKey() + "的值为" + e.getValue());
   }

3.对数据的删除修改操作,要用迭代子实现(否则可能出现线程安全问题)

 for (Iterator<Entry<Long, String>> iterator = map.entrySet().iterator(); iterator.hasNext();) {
            Entry<Long, String> entry = iterator.next();
            long key = entry.getKey();
            if (key < 10) {
                iterator.remove();
            }
 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 技术无关 自己写的项目 一些数据库的想法

    +----------+--------------+------+-----+---------+----------------+ | Field    |...

    ydymz
  • java 获得当前时间前指定几个小时的时间?

    ydymz
  • select动态绑定vue.js

    ydymz
  • Java Collection知识总结

    首先说说java中常用的集合容器:ArrayList,LinkedList,Vector,HashMap,Hashtable,HashSet,TreeSet。【...

    赵小忠
  • 什么是Apache Zeppelin?

    多用途笔记本 笔记本是满足您所有需求的地方 ? ...

    片刻
  • 第三章--第五节:集合

    由于集合是无序的,所以索引没有任何意义,所以我们无法利用索引获取和更新元素,但是我们可通过循环的方式获取元素,代码如下:

    喵叔
  • 白板类应用的业务事件分发模式

    在画板上延伸业务的事件,可以通过画板本身,利用路由事件分发,此时能解决依赖事件业务对具体业务对象的依赖

    林德熙
  • 我们可以教机器学习隐私吗?

    机器学习需要使用大量数据来对模型进行训练,而我们一般都会将这些训练数据上传到亚马逊和Google等运营商所托管的机器学习云服务上,但这样将有可能把数据暴露给恶意...

    FB客服
  • 东哥陪你学PowerBI——如何在柱状图里自定义排序

    无论你是不是门外汉(鼠标左右键不分,单双击不分的,不在此列),相信做到这一步应该都没什么问题

    公众号PowerBI大师
  • 浅析Android录屏 MediaRecorder

    MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息。

    砸漏

扫码关注云+社区

领取腾讯云代金券