Java 存储字符串文字的长度是否会对性能产生影响?
我发现字符串文本并不总是垃圾收集的,所以我想知道这两个代码示例在性能方面是否具有可比性 length()只返回字符串内部字符数组的大小,因此只要字符串不是新创建的,就不需要计算Java 存储字符串文字的长度是否会对性能产生影响?,java,string,performance,garbage-collection,Java,String,Performance,Garbage Collection,我发现字符串文本并不总是垃圾收集的,所以我想知道这两个代码示例在性能方面是否具有可比性 length()只返回字符串内部字符数组的大小,因此只要字符串不是新创建的,就不需要计算 // example 1 private static final int BAR_LENGTH = "bar".length(); public int foo() { return BAR_LENGTH; } // example 2 public int foo() { return "bar".le
// example 1
private static final int BAR_LENGTH = "bar".length();
public int foo() {
return BAR_LENGTH;
}
// example 2
public int foo() {
return "bar".length();
}
我认为这不会有什么不同 这就是
String
类中length
方法的实现:
public int length()
{
return this.value.length;
}
因此,从本质上讲,它将返回包含字符串字符的数组
value
(定义为private final char[]value;
)的长度。长度本身就是数组的一个属性。我认为它不会有任何区别
这就是String
类中length
方法的实现:
public int length()
{
return this.value.length;
}
因此,从本质上讲,它将返回包含字符串字符的数组
value
(定义为private final char[]value;
)的长度。而length
本身就是数组的一个属性。字符串文本保存在字符串池中。因此,在上述两种情况下,不会重新创建字符串,而是从池中提取字符串。因此在性能上没有差别。字符串文本保存在字符串池中。因此,在上述两种情况下,不会重新创建字符串,而是从池中提取字符串。因此在性能上没有差别。也许我在这里对代码的解释有点过于字面化,但是示例2的性能显然会更差,因为每次调用foo()
时,它都会生成一个新的字符串。如果检查长度,则只返回字符串所支持的字符数组的长度属性。@zron-它不会每次创建新字符串。JLS保证“bar”文本由一个且仅一个对象表示。@Zyrot:不考虑“learn”下链接中的答案:“可能不是。代码对象将包含一个或多个对表示文本的字符串对象的引用。因此,只要代码对象是可访问的,字符串对象将是可访问的。”如果编译器足够好,这两种方法都会被优化为直接返回3,因为结果不会改变。因此,它们在性能方面应该是相同的,即使存在差异,您也可能不会注意到。也许我在这里对代码的解释有点过于字面化,但示例2的性能显然会更差,因为每次调用foo()
时,它都会生成一个新的字符串
“bar”。没有区别。如果检查长度,则只返回字符串所支持的字符数组的长度属性。@zron-它不会每次创建新字符串。JLS保证“bar”文本由一个且仅一个对象表示。@Zyrot:不考虑“learn”下链接中的答案:“可能不是。代码对象将包含一个或多个对表示文本的字符串对象的引用。因此,只要代码对象是可访问的,字符串对象将是可访问的。”如果编译器足够好,这两种方法都会被优化为直接返回3,因为结果不会改变。因此,它们在性能方面应该是相同的,即使存在差异,您也可能不会注意到。这是否意味着只要程序结束,在可访问方法中声明的任何字符串都将保留在内存中?是的。和accessible意味着该字符串在编译代码中是引用的。我知道的唯一一种情况是,当类被动态加载并且类加载器被销毁时,字符串文本被GCed。这是否意味着只要程序结束,在可访问方法中声明的任何字符串都将保留在内存中?是的。和accessible意味着该字符串在编译代码中是引用的。我所知道的唯一一种情况是在动态加载类并销毁类装入器的情况下GCed是字符串文本