3

如何在Java中避免创建不必要的对象(备战2022春招或暑期实习,每天进步一点点,打卡10...

 2 years ago
source link: https://blog.csdn.net/qq_41125219/article/details/120905218
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  • 备战2022春招或暑期实习,祝大家每天进步亿点点!Day1
  • 本篇总结的是 《如何在Java中避免创建不必要的对象》,后续会每日更新~
  • 关于《Redis入门到精通》、《并发编程》等知识点可以参考我的往期博客:《Redis从入门到精通》系列 《并发编程》系列
  • 相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!

751a8ffe445fbc514b868f41fb1efccd.jpeg

在Java开发中,程序员要尽可能的避免创建相同的功能的对象,因为这样既消耗内存,又影响程序运行速度。在这种情况下可以考虑重复利用对象

148c1aa1289fbd12.jpg

接下来举例几种对象重复利用的场景,看看我们是不是有中招了,如果有赶紧趁着还没被发现悄悄改掉,被发现了会被diss啦!

1、String和Boolean

如下两种写法看似没有什么区别,但是如果深入jvm底层了解,我们可以利用jvm运行时常量池的特性,避免创建具有相同功能的String对象(尤其是在循环内部创建)可以带来比较可观的性能优化以及节约内存。

错误写法

正确写法

除此之外,刚写Java代码的程序员们,也要正确的选择String、StringBuilder、StringBuffer类的使用。String为不可变对象,通常用于定义不变字符串;StringBuilder、StringBuffer用于可变字符串操作场景,如字符串拼接;其中StringBuffer是线程安全的,它通过Synchronized关键字来实现线程同步。

Boolean是常用的类型,在开发中也应该使用Boolean.valueof()而不是new Boolean(),从Boolean的源码可以看出,Boolean类定义了两个final static的属性,而Boolean.valueof()直接返回的是定义的这两个属性,而new Boolean()却会创建新的对象。

2、自动拆箱和装箱

Java提供了基本数据类型的自动拆箱和装箱功能,那是不是意味着我们可以在代码中随意的使用这两个类型呢?其实理论上在代码层面是没得问题,不过在具体的性能方面还是有优化的空间啦!!!

我们来测试下性能

使用Integer耗时3毫秒

image.png

使用int耗时0毫秒

image.png

因此关于自动拆箱装箱的使用,我们其实也可以做适当的考虑,毕竟有时候代码性能就是一点点挤出来的嘛!!!

0e202cc7a9cd5b4d.jpg

3、正则表达式

正则表达式我们经常用于字符串是否合法的校验,我们先来看一段简单的代码(大家有没有一眼看出问题呢?我想你肯定看出来了!!!):

执行这段代码的时间,一共耗时71毫秒,看似好像挺快的!

image.png

但是我们做个非常简单的优化,优化后的代码如下所示:

再次执行代码,一共耗时1毫秒,快了70倍呀!!!

image.png

这是因为String.matches()方法在循环中创建时,每次都需要执行Pattern.compile(regex),而创建Patter实例的成本很高,因为需要将正则表达式编译成一个有限状态机( finite state machine)。这种我们经常会因为Java api提供了比较方便的方法调用而忽略了性能考究,往往不容易被发现。这个时候就需要优秀的你,去“咬文嚼字”啦!

👇🏻 关注公众号 获取更多资料👇🏻


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK