在检查代码时,居然被要求改回String ,理由是不符合规范, 和别的系统不能达成统一 , 担心以后有人来维护系统时, 看不懂 StringBuffer 这个理由还真是有点郁闷`~``
解决方案 »
- openjpa如何在控制台显示执行的SQL语句
- jdbc在mvc中connection。statement,resultset的关闭问题
- 麻烦推荐两本学习Struts 2.0+Spring+Hibernate的书,谢谢啦。
- 乱码问题
- 在一个JavaBean中调用另外一个JavaBean的问题
- 关于Spring的问题,各位大侠帮忙,急
- osworkflow中 图形界面的应用
- 求助:SQL2000数据库连接问题!急!
- 有关struts的问题,返回页面结果不对!在线等待,以解决就结帖
- 有谁知道 在Java中怎样使用MSXml4.0 吗?
- 请问:在struts架构里,我要实现定时发邮件功能,该怎么做?(顶者有分哦)
- 求注入法的解决方法
--------------
小朋友,不懂就别乱说,2万行左右,半个多月的写档比较合适。
实际上架构设计得非常王八蛋 , 由servlet调用model层实现业务逻辑, 而model层被设计到了session bean之上, 由model来调用 session bean. session bean 被用来操作JDBC, 操作数据库.
--------------小朋友,不懂就别乱说,你没做过EJB的集群吧?
最混蛋的是,在写JDBC时, 要拼sql语句 , 我看原来的系统中用的是 string 拼, 每个语句最少有十个加号连接. 太费性能了, 我就改成了 StringBuffer .
在检查代码时,居然被要求改回String ,理由是不符合规范, 和别的系统不能达成统一 , 担心以后有人来维护系统时, 看不懂 StringBuffer .
--------------小朋友,不懂就别乱说,拼的时候编译器,已经优化了,知道吗?你以为SUN公司的都是傻子吗?连这么点优化都考虑不到?不用我贴bytecode给你吧?JSR不用给你翻译吧?
你有那个水平骂哪个系统的时候,再开骂,好吗?
在检查代码时,居然被要求改回String ,理由是不符合规范, 和别的系统不能达成统一 , 担心以后有人来维护系统时, 看不懂 StringBuffer .
--------------小朋友,不懂就别乱说,拼的时候编译器,已经优化了,知道吗?你以为SUN公司的都是傻子吗?连这么点优化都考虑不到?不用我贴bytecode给你吧?JSR不用给你翻译吧?StringBuffer的确比String串要快得多。
--------
DelphiStudy:
呵呵,我知道StringBuffer和String区别比如你String str = “1”+“2”+“3”+“4”java编译器不会创建4个对象的,只会创建一个,再有,在string对象连接的时候,java编译器会自动的优化成StringBuffer的。
你表面上看到的string的相加连接其实早被编译器优化成StringBuffer了,和使用StringBuffer没区别。所谓优化就是在这里啊。
public class CompareStringStringBuffer{
public static void main(String[] args){
String s="";
StringBuffer sb=new StringBuffer("");
long begintime=System.currentTimeMillis();
for(int i=0;i<20000;i++){
s+="i";
} long endtime=System.currentTimeMillis();
System.out.println(endtime-begintime);
begintime=System.currentTimeMillis();
for(int j=0;j<20000;j++){
sb.append("i");
}
endtime=System.currentTimeMillis();
System.out.println(endtime-begintime);
}
}返回 2219 (string)
15 (StringBuffer)请问String真的被优化了吗?
你家的SQL拼接用过for循环吗?我说了:我知道StringBuffer和String区别。
"你表面上看到的string的相加连接其实早被编译器优化成StringBuffer了,和使用StringBuffer没区别。所谓优化就是在这里啊。"如果返回相差几十豪秒,那我也就认了,实际上相差几百倍啊blueindead() 老大!
使用for循环拼接字符串和使用“+”连接SQL语句是有区别的,因为SQL文的大部分都是在编译期已知的是作为常量存在的(个别作为查询条件的字符串可能要在运行期决定的除外),所以编译器能在编译期进行优化,但是如果用来拼接的字符串在编译期未知,那么编译期的优化显然就无效了,这种情况下就像你说的应该用StringBuffer。也就是说对于字符串拼接到底最好用“+”还是用StringBuffer,需要加以区分,当然,一般情况下首选StringBuffer是不会错的。
你把循环改成20(20个SQL够多了吧),你运行一下,看看结果是不是和你想的不一样?另:这就是优化。
"因为SQL文的大部分都是在编译期已知的是作为常量存在的(个别作为查询条件的字符串可能要在运行期决定的除外),所以编译器能在编译期进行优化,但是如果用来拼接的字符串在编译期未知,那么编译期的优化显然就无效了"这种说法比较让人信服。谢谢wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)
也谢谢blueindead() 。
问题的关键不在于循环次数,而在于需要拼接的字符串到底是在编译期决定的还是在运行期决定的。所谓编译期决定的字符串就是写死在源代码里面的字符串,也就是通常说的HardCoding,编译器的能力范围仅仅在编译的时候,程序运行时候产生的无论是20个字符串还是20000个字符串编译器是管不着的。至于JRE是否在运行期也会对字符串的拼接作优化我也不得而知。不过我觉得要实现这种优化大概很难,StringBuffer的存在自有其存在的意义,更深一层的原理还是从SUN提供的文档里找答案吧。:)
程序运行时候产生的无论是20个字符串还是20000个字符串编译器是管不着的。
--------
TO wingtrace:
你实验一下,20个循环你会得到 0,0。
这很循环有关系。java是比较智能的。
疏忽的地方还请wingtrace指教。
------------------------
这个实验得到什么样的结果更大程度上大概取决于System.currentTimeMillis()支持的精度还有CPU的运行速度,currentTimeMillis的精度不可能无限精确,20次的简单循环对于当今的CPU来说可能是钠秒级的事情,从JDK的DOC提供的信息来看,currentTimeMillis的精度只支持到毫秒,这期间的差别还是很大的。所以对于这种测试还是用大数据量比较合适,就“优化”本身而言,如果小数据量的时候优化了,大数据量的时候反而没优化或者几乎没有优化效果,那么这种优化本身就是没有意义的。
0 ldc #2 <String "">
2 astore_1
3 new #3 <Class java.lang.StringBuffer>
6 dup
7 ldc #2 <String "">
9 invokespecial #4 <Method java.lang.StringBuffer(java.lang.String)>
12 astore_2
13 invokestatic #5 <Method long currentTimeMillis()>
16 lstore_3
17 iconst_0
18 istore 5
20 goto 46
23 new #3 <Class java.lang.StringBuffer>
26 dup
27 invokespecial #6 <Method java.lang.StringBuffer()>
30 aload_1
31 invokevirtual #7 <Method java.lang.StringBuffer append(java.lang.String)>
34 ldc #8 <String "i">
36 invokevirtual #7 <Method java.lang.StringBuffer append(java.lang.String)>
39 invokevirtual #9 <Method java.lang.String toString()>
42 astore_1
43 iinc 5 1
46 iload 5
48 bipush 20
50 if_icmplt 23
53 invokestatic #5 <Method long currentTimeMillis()>
56 lstore 6
58 getstatic #10 <Field java.io.PrintStream out>
61 lload 6
63 lload_3
64 lsub
65 invokevirtual #11 <Method void println(long)>
68 invokestatic #5 <Method long currentTimeMillis()>
71 lstore_3
72 iconst_0
73 istore 8
75 goto 88
78 aload_2
79 ldc #8 <String "i">
81 invokevirtual #7 <Method java.lang.StringBuffer append(java.lang.String)>
84 pop
85 iinc 8 1
88 iload 8
90 bipush 20
92 if_icmplt 78
95 invokestatic #5 <Method long currentTimeMillis()>
98 lstore 6
100 getstatic #10 <Field java.io.PrintStream out>
103 lload 6
105 lload_3
106 lsub
107 invokevirtual #11 <Method void println(long)>
-----
是的,说的好。
因为我只想让大家认为少量循环无需考虑String和StringBuffer的区别。
至于优化,20和20000的是一样,有一个关于栈长度的问题优化才是和长短有关系的。不好意思。
这个循环是无关的, wingtrace说的好
不是针对楼主,大家掂量着看
Thanks blueindead and wingtrace. And For didoleo(冷月无声): following is a article about String and StringBuffer, hope it can help you:
http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htmAnd For uiiang
-_-~!