在Java中,使用“安全吗?”;String ret=someString.split(";\t";)[0]";?

在Java中,使用“安全吗?”;String ret=someString.split(";\t";)[0]";?,java,Java,在Java中使用String ret=someString.split(“\t”)[0]安全吗 我担心someString.split(“\t”)[0]是临时变量,所以它可能会被GC回收 是的,很安全。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量ret中,因此它不会消失。垃圾收集不是这样工作的,只有不再被引用的对象(比如,被局部变量引用)才是垃圾收集的候选对象。是的,它是安全的。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量ret中,因此它不会消失。垃圾收集

在Java中使用
String ret=someString.split(“\t”)[0]
安全吗


我担心
someString.split(“\t”)[0]
是临时变量,所以它可能会被GC回收

是的,很安全。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量
ret
中,因此它不会消失。垃圾收集不是这样工作的,只有不再被引用的对象(比如,被局部变量引用)才是垃圾收集的候选对象。

是的,它是安全的。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量
ret
中,因此它不会消失。垃圾收集不是这样工作的,只有不再被引用(比如,被局部变量引用)的对象才是垃圾收集的候选对象。

这是绝对安全的。什么时候

someString.split("\t")
执行时,对它返回的对象的引用被放在堆栈上。因此,它是可访问的,无法GC'ed。该对象只能在

someString.split("\t")[0]
                    // ^ array access

已经执行。

绝对安全。什么时候

someString.split("\t")
执行时,对它返回的对象的引用被放在堆栈上。因此,它是可访问的,无法GC'ed。该对象只能在

someString.split("\t")[0]
                    // ^ array access
已执行。

绝对正确

如果应用程序可以使用它,垃圾收集器将不会删除它1

但是,您的示例中有几个不相关的边缘情况:

  • 如果
    someString
    null
    ,您将得到
    NullPointerException

  • 如果
    someString
    是空字符串,那么split将为您提供一个零长度数组,这将导致
    ArrayIndexOutOfBoundsException


1-唯一的例外是当纯Java世界之外的东西对引用做了非常糟糕的事情时。但当这种情况发生时,您已经有了一个损坏的堆,JVM崩溃即将发生。

绝对如此

如果应用程序可以使用它,垃圾收集器将不会删除它1

但是,您的示例中有几个不相关的边缘情况:

  • 如果
    someString
    null
    ,您将得到
    NullPointerException

  • 如果
    someString
    是空字符串,那么split将为您提供一个零长度数组,这将导致
    ArrayIndexOutOfBoundsException



1-唯一的例外是当纯Java世界之外的东西对引用做了非常糟糕的事情时。但是当这种情况发生时,您已经有了一个损坏的堆,JVM崩溃即将发生。

String ret=someString.split(“\t”)[0]someString
为空,则code>将失败,因此不安全


但是如果您知道
someString
不是null,那么这是完全安全的。垃圾收集器将永远不会删除任何值,而您的代码仍然可以访问这些值,因此这是一件您永远不需要担心的事情。

String ret=someString.split(“\t”)[0]someString
为空,则code>将失败,因此不安全


但是如果您知道
someString
不是null,那么这是完全安全的。垃圾收集器将永远不会删除任何值,而您的代码仍然可以访问它们,因此这是一件您永远不必担心的事情。

是的,ret仍在引用您的结果。是的,RET是引用你的结果。很多人使用S拆股作为数组不需要把它传递到数组中。这是正常的。@ StStar我习惯于C++,总是担心这些问题……它不会得到GC`ED。但是你可能应该检查由代码>字符串返回的数组。除非你绝对确信数组至少包含一个元素。很多人使用S拆股作为数组不需要将它传递到数组中。这是正常的。@ StStar我习惯于C++,总是担心这些问题……它不会得到GC`ED。但是你可能应该检查由代码>字符串返回的数组。
除非您绝对确定数组至少包含一个元素。