IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 如何在Java中避免创建不必要的对象(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day1) -> 正文阅读

[Java知识库]如何在Java中避免创建不必要的对象(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day1)

  • 备战2022春招或暑期实习,祝大家每天进步亿点点!Day1
  • 本篇总结的是 《如何在Java中避免创建不必要的对象》,后续会每日更新~
  • 关于《Redis入门到精通》、《并发编程》等知识点可以参考我的往期博客:《Redis从入门到精通》系列?《并发编程》系列
  • 相信自己,越活越坚强活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!

751a8ffe445fbc514b868f41fb1efccd.jpeg

简介

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

148c1aa1289fbd12.jpg

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

1、String和Boolean

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

错误写法

//?每次都会创建一个新的String对象,且不会加入常量池
String?name2?=?new?String("李子捌");

正确写法

//?正确写法
String?name1?=?"李子捌";

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

//?StringBuffer中的append()方法
public?synchronized?StringBuffer?append(String?str)?{
????toStringCache?=?null;
????super.append(str);
????return?this;
}

//?StringBuilder中的append()方法
public?StringBuilder?append(String?str)?{
????super.append(str);
????return?this;
}

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

public?static?final?Boolean?TRUE?=?new?Boolean(true);

public?static?final?Boolean?FALSE?=?new?Boolean(false);

2、自动拆箱和装箱

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

我们来测试下性能

long?start?=?System.currentTimeMillis();
Integer?sum?=?0;
for?(int?i?=?0;?i?<?100000;?i++)?{
????sum?+=?i;
}
System.out.println(System.currentTimeMillis()?-?start);

使用Integer耗时3毫秒

image.png

long?start?=?System.currentTimeMillis();
//?修改Integer?为?int?
int?sum?=?0;
for?(int?i?=?0;?i?<?100000;?i++)?{
????sum?+=?i;
}
System.out.println(System.currentTimeMillis()?-?start);

使用int耗时0毫秒

image.png

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

0e202cc7a9cd5b4d.jpg

3、正则表达式

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

public?static?void?main(String[]?args)?{

????String?email?=?"1057301174@qq.com";
????String?regex?=?"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

????long?start?=?System.currentTimeMillis();
????for?(int?i?=?0;?i?<?10000;?i++)?{
????????email.matches(regex);
????}

????System.out.println(System.currentTimeMillis()?-?start);

}

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

image.png

?

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

public?static?void?main(String[]?args)?{

????String?email?=?"1057301174@qq.com";
????String?regex?=?"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
????Pattern?pattern?=?Pattern.compile(regex);

????long?start?=?System.currentTimeMillis();
????for?(int?i?=?0;?i?<?10000;?i++)?{
????????//email.matches(regex);
????????pattern.matcher(email);
????}

????System.out.println(System.currentTimeMillis()?-?start);

}

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

image.png

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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:20:41  更:2021-10-23 12:20:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/23 8:26:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码