Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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字符串情况下,n+=和s1+s2之间的差异_Java_String_Concatenation - Fatal编程技术网

java字符串情况下,n+=和s1+s2之间的差异

java字符串情况下,n+=和s1+s2之间的差异,java,string,concatenation,Java,String,Concatenation,我需要编写更长的查询,这些查询是动态生成的,并附加到字符串变量中 String str = ""; str +="select * from"; str+=" users where userid = 1"; 我想知道下面是做同样的事情还是只做一个实例 String str = "select * from "+" users where userid = 1"; 两个实例都创建多个字符串 如果需要构建查询字符串,只需使用 为了完整性起见,请检查您是否自己构造SQL查询。如果只是文

我需要编写更长的查询,这些查询是动态生成的,并附加到字符串变量中

String str = "";

  str +="select * from";
  str+=" users where userid = 1";
我想知道下面是做同样的事情还是只做一个实例

String str = "select * from "+" users where userid = 1";

两个实例都创建多个字符串

如果需要构建查询字符串,只需使用


为了完整性起见,请检查您是否自己构造SQL查询。

如果只是文本,编译器可能会对此进行优化,但如果不是,字符串上的每个+操作都会创建一个中间实例。事实上,a+=b只是将a=a+b写入编译器的一种简单方式,对编译器来说也是一样的


顺便说一句,我有一种强烈的感觉,您希望将值连接到查询中。如果可以,请避免这种情况,因为它可能会引入严重的安全问题SQL注入。用PreparedStatement代替。

从语义角度看s+=s1;s=s+s1;都是一样的

JLS 15.26.2。说:

形式为E1 op=E2的复合赋值表达式相当于E1=T E1 op E2,其中T是E1的类型,但E1只计算一次

在这种情况下:

   s += s1;
变成

   s = (String) ((s) + (s1));
这是什么

   s = s + s1;
删除多余的类型转换和括号时


但是,您的示例(而不是问题标题)是关于字符串>>文本的在构建查询时,您需要备份并使用准备好的语句,否则可能会受到SQL注入攻击


话虽如此,使用StringBuilder是一个不错的选择,但也可以尝试在顶部使用重用的字符串常量,这样您就不会经常在循环中创建它们。

谢谢。但我的第二个代码不是a=a+b,而是我想要的a=b+cknow@KevinEsche在问题的上下文中,应该清楚字符串的含义,但无论如何,我添加了字符串以供澄清。Thx的提示。这不是allI的问题,我还要加上s=s+s1;本质上变为s=新StringBuilders.appends1.toString@肉桂-这是一个实现细节。编译器是>>允许的>必需的
   s = s + s1;
    "select * from " + " users where userid = 1";