美文网首页
1.6避免创建不必要的对象

1.6避免创建不必要的对象

作者: flyjar | 来源:发表于2020-12-08 14:30 被阅读0次

1.6避免创建不必要的对象

1.6.1

一般来说,最好能重复利用单个对象而不是每次都创建一个一样的对象

public void eachData(){
  
  for(int i=0;i<20;i++){
       
        String charData=new String("hello world");  //这种写法是非常浪费内存的
      //第一次创建两个对象,一个在栈上,一个在堆上。栈上对象存放着对堆上对象的引用。堆上对象是一个值(存在于常量池)
  }
  
  
    for(int i=0;i<20;i++){
       
        String charData="hello world";  // 采用此种写法
      //而是直接使用已经存在常量池的值
  }
  
}

1.6.2

​ 静态工厂方法Boolean.valueOf(String)几乎总是优选于构造器,注意构造器在java9中已经被遗弃了。对于一些创建成本比较高昂的对戏那个。建议重复利用它。而不是每次都创建它。

1.6.3

​ String.matches方法最容易查看一个字符串是否与正则表达式相匹配,但并不适合在注重性能的情形中重复使用。问题在于它在内部为正则表达式创建了一个Pattern实例,却只用了一次,之后就可以进行垃圾回收了。创建Pattern实例的成本很高,因为需要将正则表达式编译成有限状态机

以下代码

static boolean isRomanNumberal(String s){
   return s.matches("^(?=.)M*(C[MD]D?C{0,3})(X[CL]|L?x{0,3})(I[XV]|V?I{0,3})$");
}

​ 为了提升性能,应该显示的将正则表达式编译成一个Pattern实例(不可变的final),让它成为类初始化的一部分,并将它缓存起来。每次调用isRomanNumberal方法的时候就重用同一个实例

优化后的代码

public class RomanNumberal{
  
   //此对象只会创建一次
   private static final Pattern ROMAN=Pattern.compile("^(?=.)M*(C[MD]D?C{0,3})(X[CL]|L?x{0,3})(I[XV]|V?I{0,3})$");
   
  static boolean isRomanNumberal(String s){
        return ROMAN.matcher(s).matches();
  }
}

1.6.4

自动装箱使得基本类型和装箱类型之间的差遍变的模糊起来,但是并没有完全消除。它们在性能上存在着比较明显的差别

以下代码

private static long sum(){
  Long sum=0L;
  for(long i=0;i<=Intger.MAX_VALUE;i++){
    sum+=i;
  }
  return sum;
}

优化后的代码

private static long sum(){
  long sum=0L; //采用基础数据类型的long。速度会比装箱的Long。此方法将快五六倍
  for(long i=0;i<=Intger.MAX_VALUE;i++){
    sum+=i;
  }
  return sum;
}

总结:要优先使用基本类型而不是装箱类型,要是当心无意识的自动装箱。

相关文章

  • 1.6:避免创建不必要的对象

    ① 不可变类,采用静态工厂方法 对于不可变类,若同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂而不...

  • 1.6避免创建不必要的对象

    1.6避免创建不必要的对象 1.6.1 ​ 一般来说,最好能重复利用单个对象而不是每次都创建一个一样的对...

  • 条目6:避免创建不必要的对象

    避免创建不必要的对象 避免通过构造函数创建字符串 避免使用String.match方法做正则匹配 避免在循环中频繁...

  • 避免创建不必要的对象

    在编码中尽量减少大对象的使用,创建对象的成本是非常高的。举个栗子: 代码块一 代码块二 在代码块一中我们使用的是l...

  • 避免创建不必要的对象

    第五条:避免创建不必要的对象 1. 简介 一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同...

  • 避免创建不必要的对象

    一般来说,最好能重用对象而不是每次需要的时候就创建一个相同的对象。如果对象是不可变的,它就始终可以被重用。 例子:...

  • 避免创建不必要的对象

    记住一个原则:能重用对象就不要每次都创建一个新的对象。例一: 字符串常量在JVM常量池中储存。 例二:对于同时提供...

  • 避免创建不必要的对象

    一、错误做法 二、正确做法

  • Android 如何提高代码质量?

    避免创建不必要的对象,尽可能避免频繁的创建临时对象,例如在for循环内,减少GC的次数。 尽量使用基本数据类型代替...

  • 避免创建不必要的“大”对象

    关键点一 在编码过程中,最好是能重用已经建立的对象,而不是每次用到都要新建对象。在这里重用是指对象是不可变的,那就...

网友评论

      本文标题:1.6避免创建不必要的对象

      本文链接:https://www.haomeiwen.com/subject/xxofgktx.html