这两套代码的区别(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"。