• 创建和销毁对象——避免创建不必要的对象


    参考资料:《Effective Java》、《Java核心技术 卷1》

    基础回顾

    1.自动装箱

    我们常见的基本类型,如int、long、float等,都有一个对应的包装器类。这些包装器类的名字和它们也非常对应,如:Integer、Long、Float等。

    当我们像定义一个整型列表,但是尖括号里面是不允许写int的,这时候就需要用到Integer,如下:

    ArrayList<Integer> arrayList=new ArrayList<Integer>();

    当我们往这个集合添加数字的时候,其实就经历了自动装箱的过程

    arrayList.add(3);

    上面的代码实际上会自动变换成:

    arrayList.add(Integer.valueOf(3));

    这种变换就被称为自动装箱。

    相反的,当我们将一个Integer类型的对象赋值给int时,将会自动地拆箱。

    需要注意的几点:

    1.Integer类型的比较要用equals。

    2.装箱和拆箱时编译器认可的,而不是虚拟机。就像上面的变换一样,是由编译器去生成对应的字节码,虚拟机只是去执行这些字节码。

    避免创建不必要的对象

    1.最好能重用单个对象

    一般来说,最好能重用单个对象,而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速又流行。

    如果对象是不可变的,它始终可以被重用。

     反面例子:

    String str=new String("重用对象");

    上面的语句每次被执行的时候都创建一个新的String实例。改进后如下:

    String str="重用对象";

    上面的代码中,对于所有在同一台虚拟机中运行的代码,只要它们包含相同的字符串,该对象就会被重用。

    2.优先使用静态工厂方法而不是构造器

    构造器在每次被调用时都会创建一个新的对象,而静态工厂方法不会这么做。

    静态工厂方法:https://www.cnblogs.com/lbhym/p/11787505.html

    3.自动装箱可能会创建多余对象

    要优先使用基本类型而不是包装器类。

    书上给出的例子:

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

    上面的程序必须使用long类型,因为int无法容纳int正整数的总和。

    将sum声明成了Long,实际运行结果无误,但是时间却长了很多,每台机器可能不一样。

  • 相关阅读:
    备忘
    基于ZooKeeper实现分布式锁
    git 使用ssh密钥
    git 的安装及使用
    sqlalchemy 使用pymysql连接mysql 1366错误
    SQL语句及5.7.2 mysql 用户管理
    C 实现快速排序
    C 实现冒泡排序
    C 实现选择排序
    sqlalchemy orm 操作 MySQL
  • 原文地址:https://www.cnblogs.com/lbhym/p/11813834.html
Copyright © 2020-2023  润新知