这两套代码的区别(String x Stringbuffer)
Differences between these two sets of code (String x Stringbuffer)
我们的项目即将部署,一些要点已传递给我们。其中之一是将字符串连接交换到字符串缓冲区。
但是我们的一些字符串是 SQL 查询,它们非常大。当我将这些字符串作为 Stringbuffer 的参数传递时,连接仍然发生。那么,这两套代码有什么区别吗?
没有字符串缓冲区
private static final String QUERY_CONSULTA_CIDADE_FUVIAL = "SELECT SR.ID_SUB_REGIAO FROM REGIAO_TAB_NEGC RT "
+ "INNER JOIN SUB_REGIAO_TAB_NEGC ST ON ST.ID_REGIAO_TAB_NEGC = RT.ID_REGIAO_TAB_NEGC "
+ "INNER JOIN SUB_REGIAO SR ON SR.ID_SUB_REGIAO = ST.ID_SUB_REGIAO INNER JOIN CIDADE C1 ON C1.ID_ESTADO = SR.ID_UF "
+ "WHERE RT.ID_TAB_NEGC = :idTabelaNegociacao AND C1.ID_CIDD = :idCidade AND SR.FL_FLUVIAL = 'S' AND C1.TP_REDSP_FLUV = 'S'";
带字符串缓冲区
private static final StringBuffer QUERY_CONSULTA_CIDADE_PERTENCE_SUB_REGIAO = new StringBuffer(
"SELECT SR.ID_SUB_REGIAO FROM REGIAO_TAB_NEGC RT "
+ "INNER JOIN SUB_REGIAO_TAB_NEGC ST ON ST.ID_REGIAO_TAB_NEGC = RT.ID_REGIAO_TAB_NEGC "
+ "INNER JOIN SUB_REGIAO SR ON SR.ID_SUB_REGIAO = ST.ID_SUB_REGIAO "
+ "INNER JOIN CIDADE C1 ON C1.ID_ESTADO = SR.ID_UF AND C1.TP_CLASS_COMRC_RODO = SR.TP_CLASF "
+ "WHERE RT.ID_TAB_NEGC = :idTabelaNegociacao AND C1.ID_CIDD = :idCidade");
StringBuffer 的用法如下:
StringBuffer str = new StringBuffer ("Stanford ");
str.append("Lost!!");
对于 "private static final String" 你不能真正使用 StringBuffer 或者至少没有任何性能提升,甚至可能有性能损失!
StringBuffer 用于方法内部。
此外,由于您的变量是私有静态最终变量,所有“+”修饰符都将在编译时发生,并且无论如何都会被优化,因此您将得到高度优化。此处无需更改任何内容。
好吧,StringBuffer 中的连接比连接单个字符串更快。由于您在谈论生产环境,因此您可能需要考虑是使用 StringBuffer 还是 StringBuilder。 StringBuffer 是线程安全的,因此与 StringBuilder 相比速度较慢。
您可以在此处查看 String 和 StringBuffer 之间的区别:What is the difference between String and StringBuffer in Java?
String 和 StringBuffer 以及 StringBuilder 是 Java 的内置 classes。
这里的基本区别是 StringBuffer 和 StringBuilder 是可变的,而 String class 是不可变的。例如:
String s="abc";
StringBuffer sb=new StringBuffer("test");
(这里 s 和 sb 都在堆中创建对 "abc" 和 "test" 的字符串对象的引用,而 s 和 sb 只是对存储在堆中的值的引用,而这些引用变量存储在堆栈中)。所以现在对 s 所做的任何更改都不会改变字符串 s 所引用的原始值(因为字符串 classes 是不可变的)而 sb 可以。
例如:
->sb.append("123");
->Test 123
现在 sb 将引用的值变为 "Test 123"。
->s2=s.append("123");
->s2="abc 123"
其中 s 仍指代相同的 "abc"。
我们的项目即将部署,一些要点已传递给我们。其中之一是将字符串连接交换到字符串缓冲区。
但是我们的一些字符串是 SQL 查询,它们非常大。当我将这些字符串作为 Stringbuffer 的参数传递时,连接仍然发生。那么,这两套代码有什么区别吗?
没有字符串缓冲区
private static final String QUERY_CONSULTA_CIDADE_FUVIAL = "SELECT SR.ID_SUB_REGIAO FROM REGIAO_TAB_NEGC RT "
+ "INNER JOIN SUB_REGIAO_TAB_NEGC ST ON ST.ID_REGIAO_TAB_NEGC = RT.ID_REGIAO_TAB_NEGC "
+ "INNER JOIN SUB_REGIAO SR ON SR.ID_SUB_REGIAO = ST.ID_SUB_REGIAO INNER JOIN CIDADE C1 ON C1.ID_ESTADO = SR.ID_UF "
+ "WHERE RT.ID_TAB_NEGC = :idTabelaNegociacao AND C1.ID_CIDD = :idCidade AND SR.FL_FLUVIAL = 'S' AND C1.TP_REDSP_FLUV = 'S'";
带字符串缓冲区
private static final StringBuffer QUERY_CONSULTA_CIDADE_PERTENCE_SUB_REGIAO = new StringBuffer(
"SELECT SR.ID_SUB_REGIAO FROM REGIAO_TAB_NEGC RT "
+ "INNER JOIN SUB_REGIAO_TAB_NEGC ST ON ST.ID_REGIAO_TAB_NEGC = RT.ID_REGIAO_TAB_NEGC "
+ "INNER JOIN SUB_REGIAO SR ON SR.ID_SUB_REGIAO = ST.ID_SUB_REGIAO "
+ "INNER JOIN CIDADE C1 ON C1.ID_ESTADO = SR.ID_UF AND C1.TP_CLASS_COMRC_RODO = SR.TP_CLASF "
+ "WHERE RT.ID_TAB_NEGC = :idTabelaNegociacao AND C1.ID_CIDD = :idCidade");
StringBuffer 的用法如下:
StringBuffer str = new StringBuffer ("Stanford ");
str.append("Lost!!");
对于 "private static final String" 你不能真正使用 StringBuffer 或者至少没有任何性能提升,甚至可能有性能损失!
StringBuffer 用于方法内部。
此外,由于您的变量是私有静态最终变量,所有“+”修饰符都将在编译时发生,并且无论如何都会被优化,因此您将得到高度优化。此处无需更改任何内容。
好吧,StringBuffer 中的连接比连接单个字符串更快。由于您在谈论生产环境,因此您可能需要考虑是使用 StringBuffer 还是 StringBuilder。 StringBuffer 是线程安全的,因此与 StringBuilder 相比速度较慢。
您可以在此处查看 String 和 StringBuffer 之间的区别:What is the difference between String and StringBuffer in Java?
String 和 StringBuffer 以及 StringBuilder 是 Java 的内置 classes。 这里的基本区别是 StringBuffer 和 StringBuilder 是可变的,而 String class 是不可变的。例如:
String s="abc";
StringBuffer sb=new StringBuffer("test");
(这里 s 和 sb 都在堆中创建对 "abc" 和 "test" 的字符串对象的引用,而 s 和 sb 只是对存储在堆中的值的引用,而这些引用变量存储在堆栈中)。所以现在对 s 所做的任何更改都不会改变字符串 s 所引用的原始值(因为字符串 classes 是不可变的)而 sb 可以。 例如:
->sb.append("123");
->Test 123
现在 sb 将引用的值变为 "Test 123"。
->s2=s.append("123");
->s2="abc 123"
其中 s 仍指代相同的 "abc"。