这两套代码的区别(String x Stringbuffer)

问题描述 投票:0回答:3

我们的项目即将部署,一些要点已传递给我们。其中之一是将字符串连接交换为字符串缓冲区。

但是我们的一些字符串是 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");
java string stringbuffer
3个回答
2
投票

StringBuffer 的使用方式如下:

 StringBuffer str = new StringBuffer ("Stanford ");
 str.append("Lost!!");

对于“私有静态最终字符串”,您不能真正使用 StringBuffer,或者至少没有任何性能增益,甚至可能会导致性能损失!

StringBuffer 用于方法内部。

此外,由于您的变量是私有静态最终变量,因此所有“+”修饰符都将在编译时发生,并且无论如何都会被优化,因此您将得到高度优化。这里不需要改变任何东西。


1
投票

String、StringBuffer 和 StringBuilder 是 Java 的内置类。 这里的基本区别是 StringBuffer 和 StringBuilder 是可变的,而 String 类是不可变的。例如:

String s="abc";
StringBuffer sb=new StringBuffer("test");

(这里 s 和 sb 都在堆中创建对“abc”和“test”字符串对象的引用,s 和 sb 只是对存储在堆中的值的引用,而这些引用变量存储在堆栈中)。因此,现在 s 中所做的任何更改都不会更改字符串 s 所引用的原始值(因为字符串类是不可变的),而 sb 可以。 例如:

->sb.append(" 123");

->"test 123"

现在 sb 所指的值变成“test 123”。

->s2=s.append(" 123");
->s2="abc 123"

其中 s 仍将引用相同的“abc”。


0
投票

嗯,StringBuffer 中的串联比串联单个字符串要快。由于您谈论的是生产环境,您可能需要考虑是使用 StringBuffer 还是 StringBuilder。 StringBuffer 是线程安全的,因此与 StringBuilder 相比速度较慢。

您可以在这里查看String和StringBuffer之间的区别:Java中String和StringBuffer有什么区别?

© www.soinside.com 2019 - 2024. All rights reserved.