我们的项目接近部署,并向我们传递了一些要点。其中之一是将字符串连接交换为字符串缓冲区。
但我们的一些字符串是SQL查询,它们非常大。当我将这些字符串作为Stringbuffer的参数传递时,连接仍然会发生。那么,这两组代码之间有什么区别吗?
没有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'";
使用stringbuffer
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");
答案 0 :(得分:2)
StringBuffer将按如下方式使用:
StringBuffer str = new StringBuffer ("Stanford ");
str.append("Lost!!");
用于"私有静态终结字符串"你不能真正使用StringBuffer,或者至少没有任何性能提升,甚至可能性能损失!
StringBuffer用于方法内部。
此外,由于您的变量是私有静态决赛,所有' +'修饰符将在编译时发生,并且无论如何都将进行优化,因此您将得到高度优化。这里不需要改变任何东西。
答案 1 :(得分: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所引用的值将变为“测试123”。
->s2=s.append("123");
->s2="abc 123"
其中s仍指代相同的“ abc”。
答案 2 :(得分:0)
嗯,StringBuffer中的连接比连接单个字符串要快。由于您在谈论生产环境,您可能需要考虑是否使用StringBuffer或StringBuilder。 StringBuffer是线程安全的,因此与StringBuilder相比较慢。
您可以在此处检查String和StringBuffer之间的差异:What is the difference between String and StringBuffer in Java?