Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储字符串文字的长度是否会对性能产生影响?_Java_String_Performance_Garbage Collection - Fatal编程技术网

Java 存储字符串文字的长度是否会对性能产生影响?

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

我发现字符串文本并不总是垃圾收集的,所以我想知道这两个代码示例在性能方面是否具有可比性

length()只返回字符串内部字符数组的大小,因此只要字符串不是新创建的,就不需要计算

// 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是字符串文本