• 我对java中使用集合设定初始容量的理解


    背景

    • 想清楚为什么需要容量大小。因为集合容器底层依然是数组,而数组肯定是需要一个容量值的。
    • 设置一个初始容量,防止因为扩容机制占有了很多的内存,但是又没有存储更多的对象,浪费了空间。
    • 那如果不设置初始容量也可以吗? 答案:肯定可以的,只是我们很多做法有好的,也有不好的。
    • 哪些java集合需要设置初始容量,而哪些集合根本没有必要设置初始容量呢?为什么有这样的区别?

    过程

    • 在给java容器设定初始容量的时候,最需要掌握的基础知识:java容器的扩容机制。
    1. HashMap, HashSet初始容量是16,扩容因子是0.75,扩容后是原来的2倍。
    2. ArrayList初始容量是10,扩容因子是1,扩容是原来的1.5倍。
    3. Vector初始容量是10,扩容因子是1,扩容后是原来的2倍。它的其他知识点:Vector是线程安全的。 synchronized。
    4. HashTable是线程安全的,它的底层实现是HashMap因此它的扩容机制跟HashMap是一样的。而它的线程安全是通过关键字synchronized实现的。
    5. CopyOnWriteArrayList的扩容机制跟ArrayList一样。 这个容器的其他知识点:防止读写并发出现的问题。 写的时候拷贝一个副本进行写。写完了后又把新的数组赋值给原来的变量即可。原来旧的因为没有被引用了,因此下次就被垃圾收集器回收调了。并且在写的时候,加了锁的,因此同一个时刻只能有一个线程在写。当然,同时可能有很多线程在读。
    • 在使用集合容器的时候,给一个大概的初始容量。链表就没有必要给初始容量了。因为链表是一个可以无限长的集合容器,只需要构建节点之间的关系即可。

    • 知道了每个容器的扩容机制后,然后也对当前的业务场景非常了解,知道大概一共可能会有多少个对象。这个时候我们才有资格给容器设置一个大概的初始容量。在不知道容器扩容机制,不知道当前业务场景,是没有资格给容器设定一个初始容量的。

    • 对性能有很高要求的场景,才需要给容器设定一个初始容量。对很多业务场景其实意义不大,有意义但是不大

    小结

    • 想清楚为什么需要容量。因为集合容器底层依然是数组,而数组肯定是需要一个容量值的。
    • 其他细节知识:
    1. HashTable是线程安全的。采用关键字synchronized实现的。
    2. Vector是线程安全的。 采用关键字synchronized实现的。
    3. CopyOnWriteArrayList:防止读写并发出现的问题。 写的时候拷贝一个副本进行写。写完了后又把新的数组赋值给原来的变量即可。
  • 相关阅读:
    应用于伺服电机控制、 编码器仿真、 电动助力转向、发电机、 汽车运动检测与控制的旋变数字转换器MS5905P
    docker-compose
    C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance
    Vue3创建项目 Vite
    跨平台编译工具--CMake上手教程
    Mac - 安装Nginx
    C++项目——云备份-②-第三方库认识
    我的高考往事
    实现一个小功能,原生js点击图片上传图片并切换
    Marin说PCB之BGA焊盘削焊盘带来的焊接问题和解决办法
  • 原文地址:https://blog.csdn.net/outsanding/article/details/125467838