每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

前言

每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量

想细看的可以去官网下载,或者下面自取
阿里巴巴Java开发手册(终极版)

五、集合处理

  1. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则:

    1. 只要重写 equals,就必须重写 hashCode。(参考Set集合)
    2. 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。(set作用是去重,假设new 2个对象,年龄都是18,set去重判断他的hashCode不相等,导致去重失败!!)
    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[] { "you", "wu" };
    List list = Arrays.asList(str);
    第一种情况:list.add("yangguanbao"); 运行时异常。
    第二种情况:str[0] = "gujin"; 那么 list.get(0)也会随之修改。
    
  6. 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用 add 方法,而<? super T>不能使用 get 方法,做为接口调用赋值时易出错。(迷糊吧~,看例子)

    interface Fruit {}
    class Apple implements Fruit {}
    class Orange implements Fruit {}// 使用 <? extends Fruit>
    List<? extends Fruit> fruits = new ArrayList<Apple>(); // 合法
    // fruits.add(new Apple()); // 编译错误,不允许添加
    Fruit fruit = fruits.get(0); // 可以读取,得到的是Fruit类型// 使用 <? super Apple>
    List<? super Apple> apples = new ArrayList<Fruit>(); // 合法
    apples.add(new Apple()); // 允许添加
    // Apple apple = apples.get(0); // 编译错误,需要强制转换
    Object obj = apples.get(0); // 只能当作Object处理
    
    • 说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:
    • 第一、频繁往外读取内容的,适合用<? extends T>。(PE 生产者,允许你读取任何T或其子类型的元素,但不允许向集合中添加元素。这保证了类型安全,因为你只关心你能从中得到什么类型的数据。)
    • 第二、经常往里插入的,适合用<? super T>。(因为<? super T>允许你向集合中添加任何T或其父类型的元素,但获取元素时只能当作Object处理。这样可以确保你可以安全地将T及其子类的对象放入集合中。)
  7. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。(并发编程,去熟悉熟悉)

    正例:
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {String item = iterator.next();if (删除元素的条件) {iterator.remove();}
    }
    反例:
    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    for (String item : list) {if ("1".equals(item)) {list.remove(item);}
    }
    
  8. 【强制】 在 JDK7 版本及以上,Comparator 要满足如下三个条件,不然 Arrays.sort,Collections.sort 会报IllegalArgumentException 异常。

    • 说明:三个条件如下
    • x,y 的比较结果和 y,x 的比较结果相反
    • x>y,y>z,则 x>z。
    • x=y,则 x,z 比较结果和 y,z 比较结果相同。
    反例:下例中没有处理相等的情况,实际使用中可能会出现异常:
    new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() > o2.getId() ? 1 : -1;}
    };
    
  9. 【推荐】集合初始化时,指定集合初始值大小。(可以看看hashmap源码,面试加分噢~)

    • 说明:HashMap 使用 HashMap(int initialCapacity) 初始化,
    • 正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loaderfactor)默认为 0.75,如果暂时无法确定初始值大小,请设置为 16(即默认值)。
    • 反例:HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大,resize 需要重建 hash 表,严重影响性能。
  10. 【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。

    • 说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 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 方法进行遍历、对比、去重操作。

总结

利用不同集合的特性,能快速处理不同的业务,例如Set去重,HashMap,key唯一的特性,已经根据Key获取value达到性能优化。ArrayList和LinkedList的特点去使用。因为有特性,自然就会有缺陷,比如第9点,初始化值,在集合新增数据过程中,会涉及到扩容,每种集合扩容方式都不一样,在新手期间,为了快速编程,很少会去指定集合的初始值,这也导致被老大教育规范。所以,集合处理方面,是很有必要,不只是面试常问,在编码过程中也很重要。

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

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

相关文章

arthas常用命令(五)--heapdump 、jvm

heapdump heapdump , 类似 jmap 命令的 heap dump 功能。 dump 到指定文件。 arthas-output 是arthas 生成到项目中的文件。 dump.hprof 是自定义的 dump 文件名称。 [arthas26028]$ heapdump arthas-output/dump.hprof Dumping heap to arthas-output/dump.hprof ... Heap…

SoC芯片中Clock Gen和Reset Gen的时钟树综合

社区目前已经开设了下面列举的前四大数字后端实战课程&#xff0c;均为直播课&#xff0c;且均是小编本人亲自授课&#xff01;遇到项目问题&#xff0c;都可以远程一对一指导解决具体问题。小编本人是一线12年后端经验的数字后端工程师。想找一线IC后端技术专家亲自带你做后端…

【C语言】动态内存管理(下)

本篇博客将讲解以下知识&#xff1a; 1、calloc和realloc 2、常见的动态内存错误 1、calloc和realloc &#xff08;1&#xff09;calloc C语言中还提供了一个函数叫calloc&#xff0c;calloc也用来动态内存分配 calloc函数原型&#xff1a; void* calloc(size_t num, …

Python 入门(二、什么是 Python 的虚拟环境)

Python 入门第二课 &#xff0c;Python 的虚拟环境...... by 矜辰所致前言 本来以为环境搭建好了&#xff0c;就直接开始敲代码了&#xff0c;但是一直看到一个专业词汇&#xff1a;虚拟环境。 对于习惯了嵌入式 C 语言开发博主来说&#xff0c;一开始确实有点不明白&#xf…

在java 中如何实现执行linux命令,通过post接口代理出来?

接口方式输入命令得返回结果 public AjaxResult doPost(HttpServletRequest request, HttpServletResponse response, String command) throws ServletException, IOException {// 设置响应内容类型 text/plain // response.setContentType("application/json"…

Unite Shanghai 2024 团结引擎专场 | 团结引擎 OpenHarmony 工程剖析

在 2024 年 7 月 24 日的 Unite Shanghai 2024 团结引擎专场演讲中&#xff0c;Unity中国 OpenHarmony 技术负责人刘伟贤对团结引擎导出的 OpenHarmony 工程进行了细节剖析&#xff0c;详细讲解 XComponent 如何与引擎结合&#xff0c;UI 线程和引擎线程的关联以及 ts/ets 的代…

smbms项目(1)

目录 一、项目搭建准备工作 二、登录功能实现 三、注销功能实现 四、登录拦截实现 一、项目搭建准备工作 1、搭建一个maven web项目 2、配置Tomcat 3、测试项目是否能够跑起来 4、导入项目中会遇到的jar包&#xff08;servlet、jsp、mysql驱动、jstl、standard&#xf…

python+大数据+基于Spark的共享单车数据存储系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Golang | Leetcode Golang题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; func canIWin(maxChoosableInteger, desiredTotal int) bool {if (1maxChoosableInteger)*maxChoosableInteger/2 < desiredTotal {return false}dp : make([]int8, 1<<maxChoosableInteger)for i : range dp {dp[i] -1}var dfs …

浙江省发规院产业发展研究所调研组莅临迪捷软件考察调研

2024年10月10日下午&#xff0c;浙江省发展与规划院产业发展研究所调研组一行莅临迪捷软件考察调研&#xff0c;绍兴市府办、区发改、区经信、迪荡街道等相关领导陪同。 调研组一行参观了迪捷软件的展厅与办公区&#xff0c;深入了解了迪捷软件的公司发展历程、运营状况、产品…

【论文#码率控制】ADAPTIVE RATE CONTROL FOR H.264

目录 摘要1.前言2.基本知识2.1 蛋鸡悖论2.2 基本单元的定义2.3 线性MAD预测模型 3.GOP级码率控制3.1 总比特数3.2 初始化量化参数 4.帧级码率控制4.1 非存储图像的量化参数4.2 存储图像的目标比特 5.基本单元级码率控制6.实验结果7.结论 《ADAPTIVE RATE CONTROL FOR H.264》 A…

第J5周:DenseNet+SE-Net实战(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc; 本周任务&#xff1a; ●1. 在DenseNet系列算法中插入SE-Net通道注意力机制&#xff0c;并完成猴痘病识别&#xff0…

Mysql(八) --- 视图

文章目录 前言1.什么是视图&#xff1f;2.创建视图3. 使用视图4. 修改数据4.1.注意事项 5. 删除视图6.视图的优点 前言 前面我们学习了索引&#xff0c;这次我们来学习视图 1.什么是视图&#xff1f; 视图是一个虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询…

Java:玩家打怪小游戏

今天&#xff0c;我们尝试用Java来做一个“打怪小游戏”&#xff0c;听名字就知道&#xff0c;我们是应该创建几个成员和怪物&#xff0c;还有知道知道成员和怪物的血量&#xff0c;一次攻击的伤害等等。。当然我们的游戏攻击模式是“回合制”&#xff08;其实是别的方法&#…

Element-ui官方示例(Popover 弹出框)

Element-ui官方示例&#xff08;Popover 弹出框&#xff09;&#xff0c;好用的弹出框。 使用 vue-cli3 我们为新版的 vue-cli 准备了相应的​Element 插件​&#xff0c;你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模版&#…

SQLAlchemy入门:详细介绍SQLAlchemy的安装、配置及基本使用方法

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。本文将详细介绍SQLAlchemy的安装、配置及基本使用方法&#xff0c;并通过代码示例和案例分析&#xff0c;帮助新…

数据使用方法:

MySQL的存储引擎&#xff1a; 存储引擎的类型 MyISAM、InnoDB 、Memory、CSV等9种。 设置表的存储引擎&#xff1a; 数据表的存储位置 将查询结果插入新表 更新数据&#xff1a; 数据更新 更新数据记录 UPDATE 表名SET 字段1值1,字段2值2,...,字段n值 n [WHERE 条件]; 示例&a…

论文笔记:Pre-training to Match for Unified Low-shot Relation Extraction

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://aclanthology.org/2022.acl-long.397.pdf 论文代码&#xff1a;https://github.com/fc-liu/MCMN &#xff08;笔记不易&#xff0c;请勿恶意转载抄袭&#xff01;&#xff01;&#xff01;&#xff09; 目录 A…

pnpm报错 cannot find package xxx,有的电脑正常运行,只有这个的电脑报错

pnpm build报错 cannot find package xxx&#xff0c;有的电脑正常运行&#xff0c;只有这一个报错 在网上查找各种资料发现是项目在电脑里的目录层级比较深导致的。 问题&#xff1a;在 Windows 系统上&#xff0c;文件路径过长&#xff08;超过 260 个字符&#xff09;可能…

VMware设置虚拟机与物理机在同一网段

1、设置虚拟网络编辑器 打开VMware编辑中的“虚拟网络编辑器...”菜单 将桥接模式选择为物理机的网卡。 2、设置虚拟机的网络适配器 打开“虚拟机|设置...”菜单&#xff0c;按下图设置。 3、查看Ubuntu的IP地址 输入命令&#xff1a; ip addr show 可查看ip地址是否与物…