在Java中怎么避免创建不必要的对象(java,开发技术)

时间:2024-05-08 17:07:50 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

简介

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

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

1、String和Boolean

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

错误写法

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

正确写法

//正确写法Stringname1="李子捌";

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

//StringBuffer中的append()方法publicsynchronizedStringBufferappend(Stringstr){toStringCache=null;super.append(str);returnthis;}//StringBuilder中的append()方法publicStringBuilderappend(Stringstr){super.append(str);returnthis;}

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

publicstaticfinalBooleanTRUE=newBoolean(true);publicstaticfinalBooleanFALSE=newBoolean(false);

2、自动拆箱和装箱

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

我们来测试下性能

longstart=System.currentTimeMillis();Integersum=0;for(inti=0;i<100000;i++){sum+=i;}System.out.println(System.currentTimeMillis()-start);

使用Integer耗时3毫秒

在Java中怎么避免创建不必要的对象

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

使用int耗时0毫秒

在Java中怎么避免创建不必要的对象

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

3、正则表达式

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

publicstaticvoidmain(String[]args){Stringemail="1057301174@qq.com";Stringregex="^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";longstart=System.currentTimeMillis();for(inti=0;i<10000;i++){email.matches(regex);}System.out.println(System.currentTimeMillis()-start);}

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

在Java中怎么避免创建不必要的对象

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

publicstaticvoidmain(String[]args){Stringemail="1057301174@qq.com";Stringregex="^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";Patternpattern=Pattern.compile(regex);longstart=System.currentTimeMillis();for(inti=0;i<10000;i++){//email.matches(regex);pattern.matcher(email);}System.out.println(System.currentTimeMillis()-start);}

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

在Java中怎么避免创建不必要的对象

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

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:在Java中怎么避免创建不必要的对象的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:如何使用Python编程matplotlib绘图挑钻石seaborn小提琴和箱线图下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18