码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java编程常见问题汇总六


    系列文章目录


    文章目录

    • 系列文章目录
    • 前言
    • 一、反射使用不当
    • 二、不必要的同步
    • 三、错误的选择List类型
    • 四、HashMap size陷阱
    • 五、对Hashtable, HashMap 和 HashSet了解不够


    前言

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
    在这里插入图片描述


    一、反射使用不当

    错误的写法:

    Class beanClass = ...   
    if (beanClass.newInstance() instanceof TestBean) ...
    

    这里的本意是检查beanClass是否是TestBean或是其子类, 但是创建一个类实例可能没那么简单, 首先实例化一个对象会带来一定的消耗, 另外有可能类没有定义默认构造函数. 正确的做法是用Class.isAssignableFrom(Class) 方法。

    正确的写法:

    Class beanClass = …
    if (TestBean.class.isAssignableFrom(beanClass)) …

    二、不必要的同步

    错误的写法:

    Collection l = new Vector();   
    for (...) {   
    l.add(object);   
    }
    

    Vector是ArrayList同步版本。

    正确的写法:

    Collection l = new ArrayList();   
    for (...) {   
    l.add(object);   
    }
    

    三、错误的选择List类型

    根据下面的表格数据来进行选择

    在这里插入图片描述

    四、HashMap size陷阱

    错误的写法:

    Map map = new HashMap(collection.size());  
    for (Object o : collection) {  
      map.put(o.key, o.value);  
    }
    

    这里可以参考guava的Maps.newHashMapWithExpectedSize的实现. 用户的本意是希望给HashMap设置初始值, 避免扩容(resize)的开销. 但是没有考虑当添加的元素数量达到HashMap容量的75%时将出现resize。

    正确的写法:

    Map map = new HashMap(1 + (int) (collection.size() / 0.75));
    

    五、对Hashtable, HashMap 和 HashSet了解不够

    这里主要需要了解HashMap和Hashtable的内部实现上, 它们都使用Entry包装来封装key/value, Entry内部除了要保存Key/Value的引用, 还需要保存hash桶中next Entry的应用, 因此对内存会有不小的开销, 而HashSet内部实现其实就是一个HashMap. 有时候IdentityHashMap可以作为一个不错的替代方案. 它在内存使用上更有效(没有用Entry封装, 内部采用Object[]). 不过需要小心使用. 它的实现违背了Map接口的定义. 有时候也可以用ArrayList来替换HashSet.

    这一切的根源都是由于JDK内部没有提供一套高效的Map和Set实现。

  • 相关阅读:
    leetcode刷题:栈与队列01(用栈实现队列)
    PodMan容器技术
    Java—部署安装
    代码随想录算法训练营Day62|冗余连接、冗余连接II
    Skywalking介绍
    R大数定律(Python切比雪夫不等式验证大数定律)模拟圆周率
    车道线检测传统方法笔记
    序列 DP
    Swin Transformer 与 CNN 结合实现图像分类
    JAVA计算机毕业设计延安市图书馆管理Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/pleaseprintf/article/details/139426600
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号