EffectiveJava-1
最近在看EffectiveJava,记录一下,分享一下自己的心得。
一、将局部变量的作用于最小化
- 在第一次使用的地方进行声明,过早的声明局部变量,会延长局部变量的生命周期,若在代码块外声明变量,当程序结束代码块后,该变量还是存在的,这并不是我们想要的结果(应该代码块结束后变量销毁)
- 当具有足够的信息进行初始化时再进行声明(try-catch代码块除外),当变量的值必须在try块的外部用到,它就必须在try块之前被声明。
- 若在循环终止之后不再需要循环变量的内容,能使用for循环就使用for循环,尽量不用while循环。for循环结束后,其局部变量全部销毁,while循环结束后,其变量可能还会存在;for循环比while循环更简洁;for循环中出现错误,程序不会通过编译,while循环中出现错误会在运行时报错。
二、for-each循环优于传统的for循环
- for-each循环不用关心容器的类型。
- for-each循环完全隐藏了迭代器或者索引变量,避免了混乱和出错的可能。
- for-each循环不仅能遍历集合和数组,还可以遍历实现Iterable接口的任何对象。
- 三种情况下无法使用for-each循环
- 解构过滤,遍历集合过程中需要删除指定的元素。
- 转换,若需要遍历列表或数组,并取代它的部分或者全部元素值,需要列表迭代器或者数组索引,便于设定元素的值
- 平行迭代,如果需要并行地遍历多个集合,就要显式的控制迭代器或者索引变量。
平行迭代的例子:
enum Num{ONE,TWO,THREE,FOUR,FIVE,SIX}
...
Cllection<Num> nums= EnumSet.allOf(Num.class);
for (Iterator<Num> i = nums.iterator();i.hasNext();)
for(Iterator<Num> j = nums.iterator();j.hasNext();)
System.out.println(i.next()+" "+j.next());
输出结果为:
ONE ONE
TWO TWO
THREE THREE
FOUR FOUR
FIVE FIVE
SIX SIX
此处需要注意:如此循环并不会输出6*6个结果,并且若外层遍历的容器中元素个数少于内层遍历的容器中元素个数,则会抛出NoSuchElementException异常。
参考:《Effective java》P219~P224
EffectiveJava-1的更多相关文章
- EffectiveJava——请不要在代码中使用原生态类型
先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public stat ...
- EffectiveJava——用函数对象表示策略
有些语言支持函数指针.代理.lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力.这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为.比较器 ...
- EffectiveJava——类层次优于标签类
标签类: 有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域.例如下面这个类,它能够表示圆形或者矩形: /** * 类层次优先与标签类 * @author wei ...
- EffectiveJava——接口优于抽象类
Java程序设计语言提供两种机制,可以用来定义允许多个实现的类型:接口和抽象方法,这两者直接醉为明显的区别在于,抽象类允许某些方法的实现,但接口不允许,一个更为重要的区别在于,为了实现由抽象类定义的类 ...
- EffectiveJava——复合优先于继承
继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...
- EffectiveJava笔记(第一部分)
考虑用静态构造方法代替构造器的好处: 1.静态构造方法有名字 BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, i ...
- <EffectiveJava>读书笔记--02泛型数组
1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...
- <EffectiveJava>读书笔记--01继承的使用注意
1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该 ...
- EffectiveJava阅读笔记(一)
考虑用静态工厂方法代替构造器 一.概述 二.使用静态工厂的优势 获取类对象的两种方式: 使用公有构造方法 静态工厂方法 1.介绍 有名称 不必每次调用时创建一个新对象 可以返回原类型的任何子类型对象 ...
- EffectiveJava(30) -- 全面解析enum类型
--在大多数项目中,我们会经常使用int类型来声明final类型的常量,它在不考虑安全的情况下确实能满足我们绝大多数的需求.但是在JDK1.5版本发布之后,声明一组固定的常量组成合法值的类型就建议使用 ...
随机推荐
- redis的安装与五种结构的使用
这次我们来说说我们的redis,在我们的redis的认知里,最熟悉的就是用redis作为缓存使用,还有我们的分布式session,其实还有很多redis的使用,还有redis的哨兵模式等等. Redi ...
- ZGC gc策略及回收过程-源码分析
源码文件:/src/hotspot/share/gc/z/zDirector.cpp 一.回收策略 main入口函数: void ZDirector::run_service() { // Main ...
- 动态扩容lvm逻辑卷的操作记录
在进行动态扩容LVM逻辑卷的之前,先看这篇文章:https://www.cnblogs.com/huhyoung/p/9689776.html.以下是我实操记录. 在上班期间,测试经理突然找我,能不能 ...
- Docker容器启动失败 Failed to start Docker Application Container Engine的解决办法
当编辑完daemon.json时,准备systemctl start docker.service启动docker时报以下错误: 网上查找的诸多方法都不行,后面看到一篇类似的文章:http://www ...
- python 报错TypeError: 'range' object does not support item assignment,解决方法
贴问题 nums = range(5)#range is a built-in function that creates a list of integers print(nums)#prints ...
- CTF-SSH私钥泄露渗透
环境 Kali ip 192.168.56.102 Smb 靶机ip 192.168.56.104 0x01信息探测 使用netdiscover -r ip/mask 进行内网网段存活ip探测 靶机为 ...
- [模板]二维ST表
考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都 ...
- [HDU2294] Pendant - 矩阵加速递推
Pendant Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 自定义的Spring Boot starter如何设置自动配置注解
本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...