java - 何时创建引用、存储值并将引用设置为空

标签 java garbage-collection

我有几个问题:

  1. 关于对象和原始引用的创建 值(value)观,我想知道:什么时候通常适合存储 变量中的值?

    根据我的常识,经验法则是创建 当相同的值被 多次使​​用或避免引用时 硬编码 例如

    String name = "Bob"; 
    System.out.println("Welcome " + name + ". Is your name really " + name + "?");
    

    而如果像下面的例子那样只使用一次,它会 只需执行以下操作即可提高性能。

    System.out.println("Welcome Bob"); 
    

    相对于

    String name = "Bob"; 
    System.out.println("Welcome " + name + ".");
    

    添加的问题:如果我们讨论的是在遍历数组或可枚举对象时使用的变量,以下哪一个会更高效(假设我们正在遍历一个对象,例如 1万次)?还是没有区别而只是一种风格选择?

    例如,

    // nameArray is an extremely long array
    public static void loop(String[] nameArray) { 
        String name; //Should this be declared inside the loop? 
         int len = nameArray.length(); 
         for(int i = 0; i < len; i++) { 
             name = nameArray[i]; 
             System.out.println(name); 
         } 
    } 
    

    或者这会更受欢迎吗?

     // nameArray is an extremely long array
    public static void loop(String[] nameArray) { 
         int len = nameArray.length(); 
         for(int i = 0; i < len; i++) { 
             String name = nameArray[i]; //Declare String reference inside for loop
             System.out.println(name); 
         } 
    } 
    
  2. 关于垃圾回收,在引用对象/基元之后 已经过了它的使用生命周期,是否总是好的做法设置 该值设为 null 以使其符合垃圾回收条件(假设没有其他对该对象/原始值的引用)?

    例如,

    String name = "Bob"; 
    System.out.println("Welcome " + name + ".);
    name = null;
    

预先感谢您抽出宝贵时间查看此内容。

最佳答案

  1. 不,这没有区别 - 无论您是否使用局部变量来引用它,该对象都会被分配。使用任何更具可读性的内容。

  2. 显式将值设置为 null 几乎从不是好的做法。有一些极端情况,例如当不这样做时会持有对变量的不必要引用,否则这些变量将有资格进行垃圾收集(参见示例:Effective Java - Item 6: Eliminate obsolete object references)。在所有其他情况下,尽可能限制变量的范围是帮助垃圾收集器的最有效方法。

底线是:在需要时使用变量并让垃圾收集器完成它的工作,除非你有令人信服的理由不这样做。

关于java - 何时创建引用、存储值并将引用设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34285224/

相关文章:

java - 有没有办法在maven中为javacv的 native 部分设置依赖关系,而无需手动安装和设置java.library.path?

java - 当 JSP 完成执行时会发生什么?

.net - 'Pinned GC handle' 背后的概念是什么?

algorithm - haskell 垃圾收集器

python - 使用 .ui 文件的 PySide 小部件意外被垃圾收集

java - 计数/未计数循环和安全点 - `while (++i < someInt)` 是否被视为未计数循环?

java - 使用 Java 在 Elasticsearch 中执行 Update By Query 时的 NPE

java - 对随机传入数据进行排序的内存和时间高效方法

java - Android:SQLite 使用了错误的数据库

java - 我是否应该同步访问存储 `DataSource` 的最终静态属性(在服务器启动时设置一次)?