美文网首页互联网科技Java 杂谈Java学习笔记
【优雅编程之道】之集合的8点建议

【优雅编程之道】之集合的8点建议

作者: 阿_毅 | 来源:发表于2017-06-22 20:41 被阅读241次

    开心一笑

    【一带孩的妈说,她最喜欢的状态是:
    枯藤老树昏鸦,空调WiFi西瓜。
    葛优同款沙发、夕阳西下,我就往那一趴!一趴!一趴!谁也别叫我!
    最不想听到有人叫我“妈……”】


    视频教程

    大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

    视频地址:http://edu.csdn.net/lecturer/994


    兰花.png

    提出问题

    项目开发过程中集合应该注意的几点???


    解决问题

    前言

    集合作为java开发工作中一个非常重要的组成部分,基本和java字符串使用频率一样高。

    我看过很多的代码,但对于集合来说,大部分都没有使用的很好。因此,我根据我们公司的项目,总结了以下几点建议,希望可以帮助各位学员彻底掌握如何使用集合。

    1.集合的简单回顾

    • List 集合的元素是有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。
    • LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
    • Vector线程同步,ArrayList、LinkedList线程不同步。
    • Map 中需要输入两个值:KEY 和 Value,其中 Key 值是唯一的,不能重复,Value 值是可以重复的,Key和Value 都可以当作泛型自由传递引用数据类型,运用比较灵活。

    2.Java集合与null需要注意的几点

    • List.add(null):将向集合新增一个null元素,允许存在多个null元素

    • Set.add(null):将向集合新增一个null元素,但只允许存在一个null元素

    • Map.put(null, Object):将向集合新增一个Key为null的元素,但只允许存在一个Key为null元素

    • List.addAll(null):将抛NullPointerException异常。

    • Set.addAll(null):将抛NullPointerException异常。

    • Map.putAll(null):将抛NullPointerException异常。

    **3.谨慎使用原生态集合类型 **

    这一点,之前在讲解数组的时候,就已经提过了。

    例如:

    public static void main(String[] args) {
      int[] nums = new int[] { 1, 2, 3, 4, 5 };
      List list = Arrays.asList(nums);
      System.out.println(list.size());
      // 此时输出的size为1
    }
    

    例如:

    @Test
    public void test(){
       //禁止写原生集合
       List list = new ArrayList();
       Set set = new HashSet<>();
       Map map = new HashMap<>();
    }
    

    4.设置集合的容量参数提高性能

    //不设置容量参数
    List<String> list = new ArrayList<>();
    

    如果像上面这样使用默认的构造方法,初始容量被设置为10。当ArrayList中的元素超过10个以后,会重新分配内存空间,使数组的大小增长到16。可以通过调试看到动态增长的数量变化:10->16->25->38->58->88->...

    也可以使用下面的方式进行声明:

    List arrayList = new ArrayList(4);
    

    将ArrayList的默认容量设置为4。当ArrayList中的元素超过4个以后,会重新分配内存空间,使数组的大小增长到7。可以通过调试看到动态增长的数量变化:4->7->11->17->26->...

    那么容量变化的规则是什么呢?请看下面的公式:

    ((旧容量 * 3) / 2) + 1
    

    一旦容量发生变化,就要带来额外的内存开销,和时间上的开销。所以,在已经知道容量大小的情况下,推荐使用下面方式进行声明:

    List arrayList = new ArrayList(CAPACITY_SIZE);
    

    即指定默认容量大小的方式。

    5.集合判空的优雅方式

     @Test
    public void test(){
    
        List<String> list = new ArrayList<>();
        //第一种方法
        if(null != list && list.size() > 0){
    
        }
    
        //第二种方法:简洁和优雅
        if(CollectionUtils.isNotEmpty(list)){
    
        }
    }
    

    结论:推荐大家使用第二种方法。

    CollectionUtils工具类

    出自 import org.apache.commons.collections.CollectionUtils;

    CollectionUtils在真实项目中,是一个非常好用的工具类,使用非常频繁。它可以使代码更加简洁和安全。

    6.空集合的优雅获取方式

    错误的方式:

    @Test
    public List<String> test(){
        //处理相关的业务
        //......
        //最后返回空的集合
        return new ArrayList<>();
    }   
    

    正确的方式:

    @Test
    public List<String> test(){
        //处理相关的业务
        //......
        //最后返回空的集合
        return Collections.EMPTY_LIST;
    }
    

    对于Set:

    Collections.EMPTY_SET
    

    对于Map:

    Collections.EMPTY_MAP
    

    7.java常用集合性能比拼

    ArrayList,LinkedList,或者Map在真实项目中要学会选择,不要清一色的使用ArrayList。根据具体的业务来使用集合,才可以体现一个程序员的高超处理水平。

    8.其他类型Map的熟悉和使用

    • 线程安全的map:ConcurrentMap,是线程安全的。更多的例子可以百度。
    • 双向map:DualHashBidiMap:DualHashBidiMap可以通过key找到value,也可以通过value找到key
    • 一对多map:MultiMap 一个key不在是简单的指向一个对象,而是一组对象

    固定大小map:LRUMap大小固定。它不是同步的,也不是线程安全的,新增的元素个数大于允许的最大集合个数时,则会执行LRU淘汰算法。 所有的元素在LRUMap中会根据最近使用情况进行排序。最近使用的会放在元素的最前面(LRUMap是通过链表来存储元素内容). 所以LRUMap进行淘汰时只需要删除链表最后一个即可(即header.after所指的元素对象)

    影响元素的使用情况的操作:

    1.put 当新增加一个集合元素对象,则表示该对象是最近被访问的
    2.get 操作会把当前访问的元素对象作为最近被访问的,会被移到链接表头
    注:当执行containsKey和containsValue操作时,不会影响元素的访问情况。

    • 多个关键字经过组合映射map:MultiKeyedMap

    • 允许Key重复的Map:IdentityHashMap

    我们应该根据具体的业务场景使用相应的Map,而不是清一色的使用HashMap等等。这些都是一些真实的工作经验总结,希望大家以后在使用Map的时候可以多考虑,多现在合适的Map类型。

    结束语

    今天讲了很多关于集合的问题,由于时间问题,有一些知识点没办法深入下去,希望各位学员课下可以自己去研究学习。


    读书感悟

    来自鬼脚七《没事别随便思考人生》

    • 一千万次前思后想,也赶不上一次说干就干。
    • 我们最容易犯的错误是以己养鸟,用自己最喜欢的方式来对待别人。出发点是好的,但对方不一定会接受,有时候反而是种伤害。
    • 快乐只存在于当下,一切的追求,都是对当下的否定,也是对快乐的抹杀。
    • 懦夫为自己的失败找到了100个借口,但他还是个懦夫。
    • 人生只有两件事情是公平的,一件是死亡,因为每个人都会死亡;另一件是时间,因为每个人每天都只有24小时。每个人时间分配不同,就会有不同的收获,也会有不同的人生道路。
    • 所有的成功,只存在于别人的评价里。所有的失败,只存在于自己的眼光里。

    经典故事

    【有三个人要被关进监狱三年,监狱长给他们三个一人一个要求。
      美国人爱抽雪茄,要了三箱雪茄。
      法国人最浪漫,要一个美丽的女子相伴。
      而犹太人说,他要一部与外界沟通的电话。
      三年过后,第一个冲出来的是美国人,嘴里鼻孔里塞满了雪茄,大喊道:“给我火,给我火!原来他忘了要火了。
      接着出来的是法国人。只见他手里抱着一个小孩子,美丽女子手里牵着一个小孩子,肚子里还怀着第三个。
      最后出来的是犹太人,他紧紧握住监狱长的手说:“这三年来我每天与外界联系,我的生意不但没有停顿,反而增长了200%,为了表示感谢,我送你一辆劳施莱斯!”
    【学习啦】心得:什么样的选择决定什么样的生活。今天的生活是由三年前我们的选择决定的,而今天我们的抉择将决定我们三年后的生活。我们要选择接触最新的信息,了解最新的趋势,从而更好的创造自己的将来。 】


    大神文章


    其他

    如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

    相关文章

      网友评论

        本文标题:【优雅编程之道】之集合的8点建议

        本文链接:https://www.haomeiwen.com/subject/skxqcxtx.html