Java语言学习了这么长时间之后,自己对于Java编程的一些细节还是稍微有点总结,正好根据云时代架构中《Java高级开发必会的50个性能优化的细节(珍藏版)》来叙述一些我和里面的点比较相符且有点感悟的地方。

1)尽量在合适的场合使用单例

  单例模式我们并不陌生,软件设计的设计模式中单例模式相对来说是比较重要的一个。单例模式的优点非常明显,就是避免多次创建同一个对象,这样可以减轻系统加载的负担,减少内存的占用,使系统的总体效率有所提高。这里我也举一个单例模式的例子:

public class Singleton {

    private static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton()
}
return singleton;
}
}

可以看到单例模式的特点:1)有一个静态成员变量,变量的类型为本类;2)构造方法为私有,这是为了防止在外面调用构造函数。

通过这段代码:单例模式在当前成员变量已经创建了之后即已经存在了之后就不会再次创建而是直接返回这一个对象,这样可以防止对象的重复创建。

但是这种方法也有局限:这种写法是懒汉式的一种,但它只适用于单线程下的使用,当使用多线程的时候,如果有两个同时访问这段代码,第一个判断为空后就会创建一个对象,但此时第二个也已经执行完毕,也判断其为空,同样也会创建一个对象,这就使单例模式的作用没有发挥出来,有兴趣的可以多去研究研究。

2)尽量避免过多过常的创建Java对象。

这句话看着确实有道理,但是很少有人注意,感觉这句话没有很适合的场景,自己从来没有过多的创建过Java对象,这里我写一段大家非常之熟悉的代码:

PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
List<User> users = new ArrayList<User>();
while(rs.next()) {
User user = new User();
user.setUserName(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
return users;

这端代码相信经历过JavaWeb开发的人员们并不陌生甚至来说是非常熟悉,这段代码实现的就是从数据库查询出所有的用户并返回,当然这段代码本身是没有错误的,但是我现在稍微进行改进一下:

在while循环上面加一句话:User user = null; 然后将红色标注的部分改成user = new User();

这两个一对比就会发现,第一种虽然可以实现,但是没执行一次while循环就会创建一个User类的对象,假如数据库中有100000条数据,执行这一次查询之后就会创建100000个对象,这对系统造成的压力可想而知,虽然以现在的电脑配置等的处理这么多问题不是事。但是这种优化我们还是应该知道的;然后我们再来看第二写法,先是声明了一个对象,但并没有赋值;然后每执行一次while循环就只会给之前创建的这个对象赋值然后返回,也就是说,通过100000次循环之后,我们只是创建了一个对象,这和之前相比起来改进还是挺大的吧。

3)尽量在finally块中释放资源

异常的处理一直是被开发人员关注但却怎么也达不到完美的技术。可以这样说,如果一个程序员开发的系统将所有的异常都处理的非常好,那他绝对是超乎常人的存在。在日常开发中,我们也会遇到异常的问题,常见的有空指针、下标越界等,所以,异常的处理就显得特别重要,要不然将来让用户看到HTTP 500的时候用户会怎么想。而在异常处理中,finally一直没有被我们重视,一般我们在使用异常的时候仅仅使用try...catch并没有考虑到finally,但其实finally的存在使得我们在考虑什么时候关闭资源的问题不复存在,我不管你再try还是catch里面执行什么操作,在我finally这里就执行最后的收尾就可以了。日常使用的比如文件的关闭、对象的释放、使用最多的还有数据库对象的关闭等在finally中写上不仅使得程序的结构更加清晰,而且不会出现这样那样的问题。

最新文章

  1. Docker 学习笔记(CentOS 7.1)
  2. SOAPFaultException
  3. 【C#4.0图解教程】笔记(第1章~第8章)
  4. 【转】Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方案)
  5. HTML5文件加载进度管理
  6. js常用DOM操作
  7. 解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)
  8. 关于oracle12c对RAW裸设备的支持?
  9. Python中闭包、装饰器的概念
  10. Bootstrap选项卡
  11. cookie大小
  12. iOS开发--XMPPFramework--好友模块(四)
  13. python3 常见的两种文件上传方法
  14. hdu1394逆序数(线段树)
  15. User Agent 用户代理
  16. Luogu 1071 - 潜伏者 - [字符串]
  17. 区间dp的一些模式和总结
  18. mysql 清空所有表数据重置自增ID
  19. day36(动态代理)
  20. Web大前端面试题-Day4

热门文章

  1. YII insert multiple records into a table
  2. 123、Java面向对象之引用传递实例一
  3. 无线冲方案 WPC Qi v1.2.4 update
  4. php中$_REQUEST、$_POST、$_GET的区别和联系小结
  5. Android加载手机磁盘上的资源---decodeFile方法的使用
  6. Day2-C-迷宫问题 -POJ3984
  7. CF6
  8. Windows7 wampServer3.0.6 Mutillidae2.7.12
  9. leetcode142 Linked List Cycle II
  10. jmeter断言之响应code:200