Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 - Fatal编程技术网

Java中静态字符串与局部字符串的寿命比较

Java中静态字符串与局部字符串的寿命比较,java,string,Java,String,给定以下代码段A private static final String SQL = "SELECT * FROM TABLE WHERE ID = ?"; 和片段B public List<MyObject> getData(final Long id){ return (List<MyObject>)template.query("SELECT * FROM TABLE WHERE ID = ?",id); } public List getData(最终

给定以下代码段A

private static final String SQL = "SELECT * FROM TABLE WHERE ID = ?";
和片段B

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query("SELECT * FROM TABLE WHERE ID = ?",id);
}
public List getData(最终长id){
return(List)template.query(“从ID=?”的表中选择*,ID);
}
和代码段C

public List<MyObject> getData(final Long id){
    return (List<MyObject>)template.query(SQL,id);
}
public List getData(最终长id){
返回(列表)模板。查询(SQL,id);
}

B和C实际上是一样的吗?B中的字符串是否因为具有局部作用域而获得gc'd(年轻一代?)

否。B和C都不创建
字符串
。加载代码时将创建
字符串
(如果它尚未作为内部
字符串
)。它将与代码的其余部分一起被垃圾收集(除非对同一
字符串
实例有另一个引用)。

否。B和C都不会创建
字符串
。加载代码时将创建
字符串
(如果它尚未作为内部
字符串
)。它将与代码的其余部分一起被垃圾收集(除非存在对同一
字符串
实例的另一个引用)。

字符串常量始终处于中间位置。每次调用代码段B时,它都将使用相同的字符串对象。基本上它相当于代码片段A+C

实际上,具有相同字符序列的两个字符串常量也将使用对相同字符串的引用:

String x = "a" + "b";
String y = "ab";

System.out.println(x == y); // true

字符串常量始终处于内部状态。每次调用代码段B时,它都将使用相同的字符串对象。基本上它相当于代码片段A+C

实际上,具有相同字符序列的两个字符串常量也将使用对相同字符串的引用:

String x = "a" + "b";
String y = "ab";

System.out.println(x == y); // true

B和C都使用相同的字符串值,因为所有字符串本质上都是由JVM“缓存”的。只要它们需要,它们就存在于内存中

使用B还是C是代码可读性(和可维护性)的问题。方法B的优点是SQL查询字符串与使用其结果的代码相邻,因此在使用该查询时应该没有问题


如果您在许多地方使用相同的SQL查询字符串,那么方法C是有利的,它允许您为整个类(甚至包)定义一次字符串。如果您必须在使用它的任何地方更改它,您只需要更改该定义。

B和C都使用相同的字符串值,因为所有字符串基本上都由JVM“缓存”。只要它们需要,它们就存在于内存中

使用B还是C是代码可读性(和可维护性)的问题。方法B的优点是SQL查询字符串与使用其结果的代码相邻,因此在使用该查询时应该没有问题


如果您在许多地方使用相同的SQL查询字符串,那么方法C是有利的,它允许您为整个类(甚至包)定义一次字符串。如果你在任何地方都要更改它,你只需要更改一个定义。

因此,换句话说,如果我使用了B,我的本地字符串不会被占用,会被垃圾收集,但在C中,字符串SQL将被占用,而不是GC'dno,你没有正确读取答案。你所有的代码片段都会产生一个内部字符串。换句话说,如果我使用了B,我的本地字符串不会被内部存储,会被垃圾收集,但是在C中,字符串SQL会被内部存储,而不是GC'dno,你没有正确地读到答案。你所有的代码片段都会产生一个内联字符串。这是一种你真的不应该花时间担心的微优化……事实上,我一直都看到这种“psfs”模式,所以我想知道将查询声明为“psfs”或内联是否有任何效率提高——我想不是,干杯。这是一种你真的不应该花时间担心的微观优化……事实上,我一直都看到这种“psfs”模式,所以我想知道将查询声明为“psfs”或内联是否会提高效率——我猜不是,干杯。