【Java七天学习训练营】Day4

简介: 《Java开发手册》发布至今,下载超260万次,此次2020最新泰山版《Java开发手册》来了!七天打卡训练营由手册作者亲自出题,每天学一个知识点,写一个小作业,帮助你把新书读透!

泰山版Java开发手册

《Java开发手册》始于阿里内部规约,在全球 Java 开发者共同努力下,已成为业界普遍遵循的开发规范。今年是手册上线第四年,推出全新泰山版免费下载,涵盖三大更新亮点,直接下载一睹为快:专题页链接

Java七天学习训练营Day4

Java七天学习训练营是由泰山版《Java开发手册》的作者亲自出题,每天学习一个知识点,写一份小作业,帮助你不仅是阅读,更能透彻理解泰山版《Java开发手册》的重要知识。

活动时间:5月15日截止提交完成打卡的同学名单

完成七天打卡挑战的少侠即有机会获得精美的阿里云开发者社区周边礼品,包含阿里云ET公仔、超大社区鼠标垫、卫衣、背包等等。

奖品说明:
同学们获取奖品的顺序,以阿里妹收到同学完成打卡后填写的表单序号为主。

第1名和第100、200、300等100的倍数打卡的同学送一个阿里云ET公仔(限量10个)
第10、20、30名等10的倍数打卡的同学送一张超大鼠标垫(限量50个)
第6名、第66名、第666名(以此类推)打卡同学送一个阿里云双肩包
第8名、第88名、第888名(以此类推)打卡的同学送一件阿里云定制卫衣
除此之外,打卡完成编号是质数的同学可以获得一份笔记本+贴纸的纪念品

(部分奖品展示)

公仔.jpg

阿里云ET公仔

152.png

超大开发者社区鼠标垫

背包.JPG

阿里云定制双肩包

今日学习内容:集合处理

阅读前需了解:
1.每日学习的知识点都节选自泰山版《Java开发手册》,如想完整阅读电子书的所有内容,请到专题页下载。
2.根据约束力强弱,规约依次分为强制、推荐、参考三大类:
【强制】必须遵守。是不得不遵守的约定,违反本约定或将会引起严重的后果。
【推荐】尽量遵守。长期遵守这样的规定,有助于系统稳定性和合作效率的提升。
【参考】充分理解。技术意识的引导,是个人学习、团队沟通、项目合作的方向。

1. 【强制】关于hashCode和equals的处理,遵循如下规则:
 1) 只要重写equals,就必须重写hashCode。
 2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
 3) 如果自定义对象作为Map的键,那么必须重写hashCode和equals。
说明:String正因为重写了hashCode和equals方法,所以我们可以非常愉快地使用String对象作为key来使用。

2. 【强制】使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出UnsupportedOperationException异常。

3. 【强制】判断所有集合内部的元素是否为空,使用isEmpty()方法,而不是size()==0的方式。
说明:前者的时间复杂度为O(1),而且可读性更好。
正例:

Map<String, Object> map = new HashMap<>();
if(map.isEmpty()) {
    System.out.println("no element in this map.");
}

反例:

List<String> list = new ArrayList<>();
if (list.size() == 0) {
    System.out.println("no element in this list.");
}

4. 【强制】Collections类返回的对象,如:emptyList()/singletonList()等都是immutable list,不可对其进行添加或者删除元素的操作。
反例:某二方库的方法中,如果查询无结果,返回Collections.emptyList()空集合对象,调用方一旦进行了添加元素的操作,就会触发UnsupportedOperationException异常。

5. 【强制】ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;

说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。

6. 【强制】在subList场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException 异常。
说明: 抽查表明,九成的开发同学对此知识点都有错误的认知。

7. 【强制】使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一致、长度为0的空数组。

反例:直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它类型数组将出现ClassCastException错误。

正例:

List<String> list = new ArrayList<>(2);
list.add("guan");
list.add("bao");
array = list.toArray(new String[0]);

说明:使用toArray带参方法,数组空间大小的length:
1)等于0,动态创建与size相同的数组,性能最好。
2)大于0但小于size,重新创建大小等于size的数组,增加GC负担。
3)等于size,在高并发情况下,数组创建完成之后,size正在变大的情况下,负面影响与2相同。
4)大于size,空间浪费,且在size处插入null值,存在NPE隐患。

8. 【强制】在使用Collection接口任何实现类的addAll()方法时,都要对输入的集合参数进行NPE判断。

说明:在ArrayList#addAll方法的第一行代码即Object[] a = c.toArray(); 其中c为输入集合参数,如果为null,则直接抛出异常。

9. 【强制】使用工具类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]= "changed"; 那么list.get(0)也会随之修改,反之亦然。

10. 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,两者在接口调用赋值的场景中易出错。

说明:扩展说一下PECS (Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>。

今日作业

Map类集合key/value能不能存储null以及是否线程安全,下面描述哪个不正确的?说说为什么?

a)Hashtable,不允许key为null,不允许value为null,线程安全

b)ConcurrentHashMap,不允许key为null,不允许value为null,线程安全

c)TreeMap,允许key为null,允许value为null,线程安全

d)HashMap,允许key为null,允许value为null,线程不安全

同学们请把作业写在评论区里,如果出现了优秀作业,将再给该同学送出额外的礼品!明天的打卡页将公布答案。

上期答案

题目一: float a = 0.125f; double b = 0.125d; System.out.println((a - b) == 0.0); 代码的输出结果是什么?
A. true √
B. false

解释:首先浮点数是由符号位、指数位、有效数字三个部分组成,而0.125f、0.125d均可以精确的表示出来,不存在精度丢失,因而a-b==0.0。

题目二: double c = 0.8; double d = 0.7; double e = 0.6; 那么c-d与d-e是否相等?
A. true
B. false √

解释:类似十进制里面的分数1/3,就是无限循环数,无法精确表示出来,同理浮点数里有些数值也没法精确表示出来。
System.out.println(0.8-0.7);//输出0.10000000000000009
System.out.println(0.7-0.6);//输出0.09999999999999998

题目三: System.out.println(1.0 / 0); 的结果是什么?
A. 抛出异常
B. Infinity √
C. NaN

解释:在整型运算中,除数是不能为0的,否则直接运行异常。但是在浮点数运算中,引入了无限这个概念。可以看一下源码Double的定义, public static final double POSITIVE_INFINITY = 1.0 / 0.0;

题目四: System.out.println(0.0 / 0.0); 的结果是什么?
A. 抛出异常
B. Infinity
C. NaN √
D. 1.0

解释:Java源码,Double包装类下,public static final double NaN = 0.0d / 0.0;NAN表示非数字,它与任何值都不相等,甚至不等于它自己。

题目五: >>和>>>的区别是?
A. 任何整数没有区别
B. 负整数一定没有区别
C. 浮点数可以>>运算,但是不可以>>>运算
D. 正整数一定没有区别 √

解释:>>>表示不带符号向右移动二进制数,移动后前面统统补0;两个箭头表示带符号移动,正整数的符号位是0,因而两者没有区别

6——10题答案:DADDD

保存下方图片,扫码码加阿里妹
回复“答案”,即可领取6-10题详细解答


阿里妹阿里妹.JPG

按钮.jpg

阿里妹温馨提示:恭喜你完成了第四天的学习打卡!建议收藏专题页,每天记得上线打卡哦。只有连续七天坚持打卡,才有机会领取到奖品!

相关文章
|
1月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
79 3
|
30天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
87 43
Java学习十六—掌握注解:让编程更简单
|
15天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
32 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
22天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
44 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
33 2
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
24 3
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
30 2
|
1月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
20 2
下一篇
无影云桌面