1. 采用clone()创建对象

    想要立刻颠覆我的思想?不,我不认为clone()能代替new,毕竟java当中任何存在的东西都是有意义的。clone作为内存拷贝,的确比new创建内存来得快,但是否能作为主流创建对象的方法,我不能只听一本书的观点。
    查询资料后发现,如果一个对象没有什么成员变量,那一定是new比clone快,按照内存分配的逻辑,也能理解这件事情。但如果一个对象有较多的变量可以复用,那一定是clone更快。
    那就牵扯到另一个问题,是否要实现cloneable接口。相信很多开发的时候没有人会专门为了这个问题去为bean实现cloneable接口,那么在什么时候使用呢?
    如果有个需求需要同时添加多个条目,那么其中的创建时间、状态以及相同的其他选项应该是一致的,那么这个时候可以为其进行clone操作添加,但实际有这种操作的情况很少,所以应用场景可能也会少得可怜。不过我会记住这一优化事项,并在可能的情况下使用。

    1. 避免boolean判断

    哪里来的奇葩会对boolean进行判断?boolean本身就是判断后的结果,还要对其进行判断。这就让我想到一个不雅的俗语——脱裤子放屁。

    1. 多用条件操作符

    想着条件操作符难道是switch?的确在有很多种操作条件下switch很好,但是if-else也不赖。看下去后发现他说的条件操作符就是三目运算符。三目运算符的确在效率上比if-else更高,但其使用的局限性也是很大的,他只能用作赋值,很多种if-else的场景下,是不同方法的调用,但的确在赋值上,三目运算符是推荐使用的。

    1. 静态方法代替实例方法

    很多时候我在写方法的时候有在想这个方法是否可以复用,如果可以,那就放到util工具类当中,这与这条优化事项的思想相符。但如果这个方法只在这一个地方使用,我认为已经不必要将其当做静态方法了,毕竟其只属于某个类。

    1. 有条件的使用final

    实际上我很少使用到final,为数不多的几次是创建工具类时添加一个,然后设置私有的构造方法,防止util被实例化。在本小节的说明中,主要使用final是为了防止修改。

    1. 避免不需要的instanceof操作

    示例稀碎,又是哪位天才会在完全确定某个实例属于某个类的时候进行instanceof操作?一般进行这个操作都是在判断如果不是则抛出异常。

    1. 避免子类存在父类转换

    说实话Java性能优化这本书的示例很有问题,类名头文字居然不大写,读起来非常的费劲。我也不知道这项优化想要说明什么。在实际应用中父子类的关系应该是在某处声明返回为父类,实际返回为子类,很少有相反的情况。

    1. 多使用局部变量

    又是一个我不同意的优化事项。示例中为了反驳静态变量,硬是把局部变量循环使用了一百万次。实际情况呢,一个局部变量能使用五次已经算他的人生巅峰了。每次调用该方法时都要为其创建一个不再改变的局部变量,有这时间为什么不直接复用一个静态变量?

    1. 使用位运算

    他的场景也是非常少,很多情况下的运算都恰好不是2或是/2,而位运算恰好只能用作2和/2。我为了使用位运算能想到的一个场景便是权限,也就是说更多使用的是&、|、^而不是>>与<<。而为了使用哈希队列,我也仅仅使用了%运算

    1. 一维数组代替二维数组

    不错的想法。理由是二维数组的内存占用比一维数组高很多。那么什么情况下能提前知晓二维数组中第二维每个数组的长度?

    1. 布尔运算代替位运算

    布尔运算是&&、||两种,返回的是布尔值,位运算返回的是整型,这两者返回值都不同,怎么代替?

    1. 提取表达式优化

    示例是当表达式有重复,则提取出来进行单次运算。

    1. 少用!

    蠢示例:

    1. if(!a){
    2. return !a;
    3. } else {
    4. return !b;
    5. }

    我已经不知道如何去说这示例有多蠢了。实际使用中,一般用到!,下面一定是返回或者报错,实际上if-else的优化策略之一也是如此。

    1. 不要重复初始化变量

    2. 变量初始化过程思考

    一个类的实例化,首先初始化的一定是static变量,因为他早在实例化之前、程序进入JVM启动的时候就已经被分配完成了。无论怎么想,静态变量都是进入到full GC都无法回收的地方,这个地方被称为永久代。然后是构造方法内初始化。如果这两个地方都没有声明成员变量,那么该成员变量该是null或者默认值。这里有个示例是final变量,final变量只能在声明时赋值,其他地方都只拥有使用的权利。当然如果是对象,还是可以对对象内部进行操作。所以final实际上只是给变量绑定了地址,不让其变更地址。

    1. 对象的创建、访问过程

    2. 在switch中使用字符串

    很有意思的讲解,使用了JAD将class文件反编译,查看switch真实的运作。
    将目标变量哈希值取出,然后对unicode编码进行判断,所以对switch来说,普通String字符串与unicode编码是一样的。比较常用的switch方式是,搭配枚举进行使用。

    1. 数值字面量的改进

    说明了二进制(0b)八进制(0)与十六进制(0x)的表达式。

    1. 优化可变长参数的方法调用

    提出了可变长参数与泛型结合使用的问题。这地方需要谨慎使用。

    1. 针对基本数据类型的优化

    基本类对应的封装类的方法优化。比如String的intern与==的结合使用,以及+-127的其他类型的比较,但实际上最好不用。

    1. 空变量

    用完一个变量之后显示的赋空是否增加效率?可能在gc上的效率增加。