zoukankan      html  css  js  c++  java
  • 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       HashtableConcurrentHashMap

    查询速度快   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();
                }
     }
  • 相关阅读:
    014-CallbackServlet代码
    PaymentServlet代码
    013-PaymentUtils工具类模板
    案例30-在线支付
    案例29-购物车提交订单
    案例28-清空购物车
    案例27-购物车删除单一商品
    案例26-购物车
    案例25-servlet的抽取
    在Eclipse或工作空间中 ,复制或修改项目后,把项目部署后发现还是原来的项目名称
  • 原文地址:https://www.cnblogs.com/ydymz/p/10063888.html
Copyright © 2011-2022 走看看