【Java七天学习训练营】Day4

泰山版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名(以此类推)打卡的同学送一件阿里云定制卫衣
除此之外,打卡完成编号是质数的同学可以获得一份笔记本+贴纸的纪念品

(部分奖品展示)

【Java七天学习训练营】Day4

阿里云ET公仔

【Java七天学习训练营】Day4

超大开发者社区鼠标垫

【Java七天学习训练营】Day4

阿里云定制双肩包

今日学习内容:集合处理

阅读前需了解:
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题详细解答


【Java七天学习训练营】Day4

【Java七天学习训练营】Day4

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

上一篇:使用Object的wait,notify,notifyAll做线程调度


下一篇:[转载]CSS块级元素和行内元素