Effective Java中有很多值得注意的技巧,今天我刚开始看这本书,看到这一章的时候,我发现自己以前并没有理解什么是不必要的对象,所以拿出来跟大家探讨一下,避免以后犯不必要的错误!
首先书中对不可变的对象(immutable)做了简单解释:不可变对象都是可以重用的。因为String是不可变对象,所以这样创建String是没有必要的:
```java
String str = new String("abc");
```
`'abc'`本身就是一个String实例了,再用实例去包裹他,就属于浪费资源了。这样创建的话,`'abc'`就可以实现重用了:
```java
String str = "abc";
```
如果本身不是不可变对象,JDK中很多类也提供了重用的功能。了解和使用它们,可以避免创建不必要对象。
例如`Long`、`Integer`等,都提供了`valueOf()`的静态方法。`Calendar`等也提供了`getInstance()`方法。

上面都不是重点,很多人都已经了解他们了。下面探讨一个很有意思的问题,看这段代码:
```java
Long sum = 0L;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
```
JDK1.5支持自动装箱和拆箱,我们不用进行类型转换了。但作者说这里有一个疏忽,导致了计算时间的大大提升,我很是没看出来。其实这个问题还是大标题所讲的:创建了不必要的对象。
`sum`是一个`Long`类型的对象,在他本身相加的时候,他会再创建一个`Long`对象,因为这些对象的不同,决定他们不能重用,而就这样,我们创建了`Integer.MAX_VALUE`个`Long`对象。想想挺恐怖的,虽然创建一个对象的开销很小,但也不能这样玩儿。
解决之道就是把`Long sum`换成`long sum`,使用了基本类型,他们是在栈中,也没有创建对象一说,性能提升不止一倍。
在我的计算机上,`Long`计算花费30秒, `long`花费了3.1秒左右。
避免创建不必要的对象,注意自动装箱带来的影响,这一点在以后要提高警惕!
当然,不能因噎废食,章中最后的解说,个人感觉也非常精彩: 当然,我们不要认为创建对象的代价非常昂贵,因为小对象的构造器只做很少量的显式工作,他的创建和回收动作是非常廉价的。通过创建附加的对象,提升程序的清晰性、间接性和功能性,这通常是件好事。
反之,使用对象池来创建对象并不是一种好的做法,除非池中的对象是非常重量级的。

Effective Java之避免创建不必要的对象的更多相关文章

  1. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  2. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Effective Java读书笔记--创建和销毁对象

    1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...

  4. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  5. Java中类的创建及类与对象的关系

    //import java.util.Scanner; //创建一个类 class Person{ //属性和方法的定义不是必须的 //属性 String name ; int age ; //方法 ...

  6. 什么是不可变对象(immutable object)?Java 中怎么 创建一个不可变对象?

    不可变对象指对象一旦被创建,状态就不能再改变.任何修改都会创建一个新的对象,如 String.Integer 及其它包装类. 详情参见答案,一步一步指导你在 Java中创建一个不可变的类.

  7. Effective Java学习笔记--创建和销毁对象

    创建和销毁对象 一.静态工厂方法代替构造器 静态工厂方法的优缺点 优点: 1.可以自定义名称(可以将功能表述的更加清晰) 2.不必每次调用都创建新的对象(同一对象重复使用) 3.返回的类型可以是原返回 ...

  8. Java中如何创建一个新的对象的/Creating Objects/

    The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't ...

  9. 《Effective Java》第3章 对于所有对象都通用的方法

    第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每 ...

随机推荐

  1. svn使用过程forMac

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  2. 【转】【MySQL】SQLSTATE详解

    根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值.SQLSTATE 值是包含五个字符的字符串 . ...

  3. 转载:有关SQL server connection KeepAlive 的FAQ

    转:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/03/sql-server-connection-keepalive-faq.aspx 1.什么是S ...

  4. 分享JS代码(转)

    var imgUrl = 'http://xxx/share_ico.png'; // 分享后展示的一张图片 var lineLink = 'http://xxx'; // 点击分享后跳转的页面地址 ...

  5. Jquery 将表单序列化为Json对象

    大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ...

  6. 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站

    首先得有一个注册的appkey和App Secret   该流程分三个步骤: 第一步:通过用户授权获取授权码Code: 第二步:用上一步获取的Code和应用密钥(AppSecret)通过Https P ...

  7. mvc4中的 webapi 的使用方式

    目录 一:简单介绍什么是Web api 二:怎么定义的 Post Get Put 和 Delete 三:简单使用,直接从前台传递一个类到后台接收 四:其他获取值的方式 一:简单介绍什么是Web api ...

  8. python package 的两种组织方式

    方式一/package1/ .../__init__.py # 空文件 .../class1.py class Class1: def __init__(self): self.name = &quo ...

  9. [CareerCup] 12.2 Find the Reason of Crash 找到程序崩溃的原因

    12.2 You are given the source to an application which crashes when it is run. After running it ten t ...

  10. diff: /../Podfile.lock: No such file or directory

    从github上下载源码运行会报错:问题1描述: diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No ...