阿里Java开发手册~集合处理

news2024/11/15 18:30:20
1. 【强制】关于 hashCode equals 的处理,遵循如下规则:
1 ) 只要重写 equals ,就必须重写 hashCode
2 ) 因为 Set 存储的是不重复的对象,依据 hashCode equals 进行判断,所以 Set 存储的
对象必须重写这两个方法。
3 ) 如果自定义对象做为 Map 的键,那么必须重写 hashCode equals
说明: String 重写了 hashCode equals 方法,所以我们可以非常愉快地使用 String 对象
作为 key 来使用。
2. 【强制】 ArrayList subList 结果不可强转成 ArrayList ,否则会抛出 ClassCastException
异常: java . util . RandomAccessSubList cannot be cast to java . util . ArrayList ;
说明: subList 返回的是 ArrayList 的内部类 SubList ,并不是 ArrayList ,而是
ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
3. 【强制】 在 subList 场景中, 高度注意 对原集合元素个数的修改,会导致子列表的遍历、增
加、删除均产生 ConcurrentModificationException 异常。
4. 【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array) ,传入的是类型完全
一样的数组,大小就是 list . size()
说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配
内存空间,并返回新数组地址 如果数组元素大于实际所需,下标为 [ list . size() ] 的数组
元素将被置为 null ,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素
个数一致。
正例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);

反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它

类型数组将出现 ClassCastException 错误。
5. 【强制】使用工具类 Arrays . asList() 把数组转换成集合时,不能使用其修改集合相关的方
法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。
说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。 Arrays . asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
第一种情况: list.add("c"); 运行时异常。
第二种情况: str[0] = "gujin"; 那么 list.get(0) 也会随之修改。
6. 【强制】泛型通配符 <? extends T > 来接收返回的数据,此写法的泛型集合不能使用 add
法,而 <? super T> 不能使用 get 方法,做为接口调用赋值时易出错。
说明: 扩展说一下 PECS(Producer Extends Consumer Super) 原则: 1 )频繁往外读取内容
的,适合用上界 Extends 2 )经常往里插入的,适合用下界 Super
7. 【强制】不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
正例:
Iterator<String> it = a.iterator();
while (it.hasNext()) {
    String temp = it.next();
    if (删除元素的条件) {
        it.remove();
    }
}

反例:

List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
    if ("1".equals(temp)) {
        a.remove(temp);
    }
}

说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的

结果吗?
8. 【强制】 在 JDK 7 版本及以上, Comparator 要满足如下三个条件,不然 Arrays . sort
Collections . sort 会报 IllegalArgumentException 异常。
说明:
1 x y 的比较结果和 y x 的比较结果相反。
2 x > y y > z ,则 x > z
3 x = y ,则 x z 比较结果和 y z 比较结果相同。
反例: 下例中没有处理相等的情况,实际使用中可能会出现异常:
new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() > o2.getId() ? 1 : -1;
    }
};

9. 【推荐】集合初始化时,指定集合初始值大小。

说明: HashMap 使用 HashMap(int initialCapacity) 初始化,
正例: initialCapacity = ( 需要存储的元素个数 / 负载因子 ) + 1 。注意 负载因子(即 loader
factor )默认为 0.75 如果暂时无法确定初始值大小,请设置为 16
反例: HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容
7 次被迫扩大, resize 需要重建 hash 表,严重影响性能。
10. 【推荐】使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历。
说明: keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出
key 所对应的 value 。而 entrySet 只是遍历了一次就把 key value 都放到了 entry 中,效
率更高。如果是 JDK 8 ,使用 Map . foreach 方法。
正例: values() 返回的是 V 值集合,是一个 list 集合对象 keySet() 返回的是 K 值集合,是
一个 Set 集合对象 entrySet() 返回的是 K - V 值组合集合。
11. 【推荐】高度注意 Map 类集合 K / V 能不能存储 null 值的情况,如下表格:

 反例: 由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上, 存储 null 值时会抛出 NPE 异常。

12. 【参考】合理利用好集合的有序性 (sort) 和稳定性 (order) ,避免集合的无序性 (unsort)
不稳定性 (unorder) 带来的负面影响。
说明: 有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次
序是一定的。如: ArrayList order / unsort HashMap unorder / unsort TreeSet
order / sort
13. 【参考】利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List
contains 方法进行遍历、对比、去重操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之深入InnoDB存储引擎——物理文件

文章目录 一、参数文件二、日志文件三、表结构定义文件四、InnoDB 存储引擎文件1、表空间文件2、重做日志文件 一、参数文件 当 MySQL 实例启动时&#xff0c;数据库会先去读一个配置参数文件&#xff0c;用来寻找数据库的各种文件所在位置以及指定某些初始化参数。在默认情况…

vue启动失败问题

解决办法情况1&#xff1a;确认自己是否进入了vuedemo项目的目录。 解决办法情况2&#xff1a;目录进入正确npm start错误&#xff0c;这时可以进入自己电脑的项目文件中去删除node_modules和package-lock.json&#xff0c;然后回到控制台npm i或npm install安装依赖&#xff0…

SAP ABAP 自定义表数据导入

一:效果展示&#xff1a; 读取 Excel 数据到 SAP 数据库表。 二&#xff1a;源码&#xff1a; *&---------------------------------------------------------------------* *& Report ZTEST_DRW02 *&----------------------------------------------------------…

Unity游戏源码分享-2.5D塔防类游戏

Unity游戏源码分享-2.5D塔防类游戏 项目地址&#xff1a; https://download.csdn.net/download/Highning0007/88118947

《Federated Unlearning via Active Forgetting》论文精读

文章目录 1、概述2、方法实验主要贡献框架概述 3、实验结果比较方法实验结果忘却完整性忘却效率模型实用性 4、总结 原文链接&#xff1a; Federated Unlearning via Active Forgetting 1、概述 对机器学习模型隐私的⽇益关注催化了对机器学习的探索&#xff0c;即消除训练数…

【Spring】什么是Bean的生命周期及作用域,什么是Spring的执行流程?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 在前面的播客中讲解了如何从Spring中存取Bean对象&#xff0c;那么本篇我们来讲解Bean对象的生命周期是什么&#xff0c;Bean对象的6种作用域分别是什么&#xff0c;都有哪些区别&#xff…

WebDAV之π-Disk派盘 + 静读天下

静读天下 支持WebDAV方式连接π-Disk派盘。 静读天下是一款备受千万Android用户好评的阅读工具,如果你享受本地阅读带来的宁静与踏实,同时对阅读器又有着苛刻要求,符合设计简洁、高效易用、功能强大且稳定,那么不妨试试这款app。静读天下支持txt、html、epub、umd、fb2、…

Python数据分析实战-利用limit 与 offset进行数据库数据批量查询与处理(附源码和实现效果)

实现功能 利用limit 与 offset进行数据库数据批量查询与处理 实现代码 def query_batch(self,engine,batch_step,end,sql):session make_session(engine)cursor session.execute(sql.format(batch_step, end))fields cursor._metadata.keysdf pd.DataFrame([dict(zip(fi…

LeetCode-116-填充每个节点的下一个右侧节点指针

一&#xff1a;题目描述&#xff1a; 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针&#xff0c;让这个指…

Flutter 的线程模型和异步原理

本文字数&#xff1a;&#xff1a;36130字 预计阅读时间&#xff1a;91分钟 在Android应用中&#xff0c; 用户时常会遇到界面卡顿的情况&#xff0c;非常影响用户的体验。作为Android开发肯定都知道&#xff1a;应用在主线程里做了大量的耗时操作(例如文件读写&#xff0c; 数…

新一代网络安全防护体系的五个关键特征

目前&#xff0c;网络安全技术正面临着一个转折点&#xff0c;基于边界的安全防护理论存在缺陷&#xff0c;基于规则的威胁判别机制不再有效&#xff0c;围绕传统技术构建的安全工程也不再适用。新一代安全建设不能再像修“城墙”一样&#xff0c;专注于外部网络攻击和已知威胁…

C++:类和对象(中)---默认成员函数---运算符重载---const的含义

文章目录 默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载const的含义取地址及const取地址操作符重载 默认成员函数 首先要理解什么是默认成员函数&#xff1a;类在什么都不写的时&#xff0c;编译器会生成六个默认成员函数 用户没有显式实现&#xff0c;但…

谁能讲清楚Spark之小白入门

在这我假设大家都是小白&#xff0c;那么Spark是什么&#xff1f;你为什么搜索它&#xff1f;思考一下。 首先&#xff0c;Spark是大数据处理框架的一种&#xff0c;那么什么是大数据处理框架&#xff1f;什么是大数据&#xff1f;字面意思懂得都懂。&#xff08;如果不懂去百度…

网络安全代码合集

SQL注入 联合注入 ?id1and 11-- - ?id1order by 1-- - ?id-1union select 1,2,3-- - ?id-1union select 1,database(),3-- - ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase() -- - ?id-1 union sele…

Docker啥是容器编排?

文章目录 容器编排compose案例wordpress案例swarmKubernetes特点 容器编排 Docker容器编排是一种管理和协调多个Docker容器的技术&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。在现代应用开发中&#xff0c;容器化已经成为一种流行的部署方式&#xff0c;Docker是其…

A Deep Framework for Hyperspectral Image Fusion Between Different Satellites

1.摘要 最近&#xff0c;将低分辨率高光谱图像&#xff08;LR-HSI&#xff09;与不同卫星的高分辨率多光谱图像&#xff08;HR-MSI&#xff09;融合已成为提高HSI分辨率的有效方法。然而&#xff0c;由于不同的成像卫星、不同的照明条件和相邻的成像时间&#xff0c;LR-HSI和H…

15.Netty源码之EventLoop

highlight: arduino-light Netty配置主从Reactor模式 通过将NioServerSocketChannel绑定到了bossGroup。 将NioServerSocketChannel接收到请求创建的SocketChannel放入workerGroup。 将2个不同的SocketChannel绑定到2个不同的Group完成了主从 Reactor 模式。 分配NIOEventLoop的…

【Git|项目管理】Git的安装以及本地仓库的创建和配置

文章目录 1.Git简介2.安装Git2.1在Centos上安装git2.2 在ubuntu上安装git 3.创建本地仓库4.配置本地仓库 1.Git简介 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理文件的更改。它可以记录和存储代码的所有历史版本&#xff0c;并可以方便地进行分支管理、合并代码和协…

JavaScript中的this指向及绑定规则

在JavaScript中&#xff0c;this是一个特殊的关键字&#xff0c;用于表示函数执行的上下文对象&#xff0c;也就是当前函数被调用时所在的对象。由于JavaScript的函数调用方式多种多样&#xff0c;this的指向也因此而变化。本文将介绍JavaScript中this的指向及绑定规则&#xf…

【LeetCode】141.环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…