﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jbrg2008-随笔分类-J2SE综合</title><link>http://www.blogjava.net/jbrg2008/category/28649.html</link><description>人以铜为镜,可以正衣冠;以古为镜,可以见兴替;以人为镜,可以知得失.</description><language>zh-cn</language><lastBuildDate>Thu, 10 Jan 2008 23:38:28 GMT</lastBuildDate><pubDate>Thu, 10 Jan 2008 23:38:28 GMT</pubDate><ttl>60</ttl><item><title>String中三种加法的区别</title><link>http://www.blogjava.net/jbrg2008/archive/2008/01/09/173862.html</link><dc:creator>翰林</dc:creator><author>翰林</author><pubDate>Wed, 09 Jan 2008 00:19:00 GMT</pubDate><guid>http://www.blogjava.net/jbrg2008/archive/2008/01/09/173862.html</guid><wfw:comment>http://www.blogjava.net/jbrg2008/comments/173862.html</wfw:comment><comments>http://www.blogjava.net/jbrg2008/archive/2008/01/09/173862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jbrg2008/comments/commentRss/173862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jbrg2008/services/trackbacks/173862.html</trackback:ping><description><![CDATA[String中三种加法的区别<img alt="" src="/CuteSoft_Client/CuteEditor/images/emdog.gif" align="absMiddle" border="0" /><br />
<br />
JAVA的确是一种令程序员陷入两难境地的语言,&nbsp;确切的说是思想.&nbsp;它提供了如此丰富的library,让程序员能够很容易的写出功能强大的程序.&nbsp;同时它也封装了如此多的细节,&nbsp;让程序员能够轻易的写出很拙略的程序.&nbsp;它所代表的object指向思想设计之初是为了把程序员从纷繁复杂的编程细节中解放出来,来达到对已有程序的利用.&nbsp;但是在编程&nbsp;实际上又要求程序员了解其实现的细节而避免写出因调用已有library不正引起的performance慢的,耗费系统资源多的程序.通常成为一个优秀的JAVA程序员需要较长时间的经验积累,包括从程序的tuning中,或从其他有经验的程序员口中,才知道一定功能需要怎样实现,在程序中需要避免那些问题.但这往往是比较片面的,知其然而不知其所以然.我想大多数程序员都有类似的经历,举一个简单的例子,下面有三种对String的累加操作.&nbsp;<br />
①&nbsp;String&nbsp;tmp&nbsp;=&nbsp;"a"&nbsp;+&nbsp;"b"&nbsp;+&nbsp;"c";&nbsp;<br />
②&nbsp;String&nbsp;tmp&nbsp;=&nbsp;null;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp+=&nbsp;"a";&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp+=&nbsp;"b";&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp+=&nbsp;"c";&nbsp;<br />
③&nbsp;String&nbsp;tmp&nbsp;=&nbsp;null;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buf&nbsp;=&nbsp;new&nbsp;StringBuffer();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("a");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("b");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("c");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;buf.toString();&nbsp;<br />
有些JAVA程序员在任意的用这三种方法的任一种,无视它们的区别.有&nbsp;些程序员知道第三种方法好一直在用而不知其为什么好,以至于作为&nbsp;<br />
经验教条的传授给JAVA新手.真正的答案是什么呢?让我们揭开JAVA&nbsp;String&nbsp;Class和StringBuffer&nbsp;Class的封装面纱看看它的内部实现.在JAVA中的String&nbsp;Class是一个不可变类,所有对一个Sting&nbsp;Object的改变都会导致一个新的String&nbsp;Object的生成.那么对tmp+=a中+符号的实现呢?如果你注意一下StringBuffer的Javadoc会发现.JDK对它的实现是tmp=(new&nbsp;StringBuffer().append(tmp).append("a")).toSting();&nbsp;这样我们发现②这种方法在隐性生成了一个StringBuffer&nbsp;Object和一个String&nbsp;Object&nbsp;再乘3就是六个object&nbsp;的资源耗费.(<font color="red">还不包括String&nbsp;Class&nbsp;和StringBuffer&nbsp;Class内部使用的Char[]</font>)而方法③只用了两个.也许有些程序员会对这些耗费不以为然,的确也是,不过在一些场景下它会成为perfamence的瓶颈.再回头看看①这种方法,它会被JAVA编译器编译为tmp=(new&nbsp;StringBuffer().append("a").append("b").append("c")).to&nbsp;String();我们发现做的和③方法是同样的事. 
<img src ="http://www.blogjava.net/jbrg2008/aggbug/173862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jbrg2008/" target="_blank">翰林</a> 2008-01-09 08:19 <a href="http://www.blogjava.net/jbrg2008/archive/2008/01/09/173862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Class.forName的含义</title><link>http://www.blogjava.net/jbrg2008/archive/2008/01/08/173505.html</link><dc:creator>翰林</dc:creator><author>翰林</author><pubDate>Tue, 08 Jan 2008 00:25:00 GMT</pubDate><guid>http://www.blogjava.net/jbrg2008/archive/2008/01/08/173505.html</guid><wfw:comment>http://www.blogjava.net/jbrg2008/comments/173505.html</wfw:comment><comments>http://www.blogjava.net/jbrg2008/archive/2008/01/08/173505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jbrg2008/comments/commentRss/173505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jbrg2008/services/trackbacks/173505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="red">Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类，也就是说JVM会执行该类的静态代码段<img src="/CuteSoft_Client/CuteEditor/images/emmessag.gif" align="absMiddle" border="0"  alt="" /></font><br />
<p>Class aClass = Class.forName(xxx.xx.xx);<br />
Object anInstance = aClass.newInstance();<br />
这其中Class.forName("").newInstance()返回的是object<br />
<br />
例：<br />
Class Driver{<br />
protected static Driver current;<br />
public static Driver getDriver(){<br />
return current;<br />
}<br />
}<br />
<br />
Class MyDriver extends Driver{<br />
static{<br />
Driver.current=new MyDriver();<br />
}<br />
MyDriver(){}<br />
}<br />
<br />
用时:<br />
Class.forName("MyDriver");<br />
Driver d=Driver.getDriver();<br />
<br />
有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些：Class.forName(xxx.xx.xx).newInstance()，为什么会有这两种写法呢？<br />
<br />
在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己，即任何一个JDBC Driver的Driver类的代码都必须类似如下：<br />
public class MyJDBCDriver implements Driver {<br />
static {<br />
DriverManager.registerDriver(new MyJDBCDriver());<br />
}<br />
}<br />
<br />
所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了，在JDBC驱动中，有一块静态代码，也叫静态初始化块，它执行的时间是当class调入到内存中就执行（你可以想像成，当类调用到内存后就执行一个方法）。所以很多人把jdbc driver调入到内存中，再实例化对象是没有意义的。</p>
<img src ="http://www.blogjava.net/jbrg2008/aggbug/173505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jbrg2008/" target="_blank">翰林</a> 2008-01-08 08:25 <a href="http://www.blogjava.net/jbrg2008/archive/2008/01/08/173505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>