在Java中,使用“安全吗?”;String ret=someString.split(";\t";)[0]";?
在Java中使用在Java中,使用“安全吗?”;String ret=someString.split(";\t";)[0]";?,java,Java,在Java中使用String ret=someString.split(“\t”)[0]安全吗 我担心someString.split(“\t”)[0]是临时变量,所以它可能会被GC回收 是的,很安全。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量ret中,因此它不会消失。垃圾收集不是这样工作的,只有不再被引用的对象(比如,被局部变量引用)才是垃圾收集的候选对象。是的,它是安全的。创建“临时”数组并不重要,您得到了想要的结果并将其存储在局部变量ret中,因此它不会消失。垃圾收集
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
- 如果
是空字符串,那么split将为您提供一个零长度数组,这将导致someString
ArrayIndexOutOfBoundsException
1-唯一的例外是当纯Java世界之外的东西对引用做了非常糟糕的事情时。但当这种情况发生时,您已经有了一个损坏的堆,JVM崩溃即将发生。绝对如此 如果应用程序可以使用它,垃圾收集器将不会删除它1 但是,您的示例中有几个不相关的边缘情况:
- 如果
为someString
,您将得到null
NullPointerException
- 如果
是空字符串,那么split将为您提供一个零长度数组,这将导致someString
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。但是你可能应该检查由代码>字符串返回的数组。
除非您绝对确定数组至少包含一个元素。