﻿<?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-离弦之ray和霹雳vivian的技术天空-随笔分类-Java</title><link>http://www.blogjava.net/clraychen/category/12145.html</link><description>contact us by sending email to 
            clraychen@gmail.com
            weiei.gao@gmail.com</description><language>zh-cn</language><lastBuildDate>Tue, 13 Mar 2012 06:38:31 GMT</lastBuildDate><pubDate>Tue, 13 Mar 2012 06:38:31 GMT</pubDate><ttl>60</ttl><item><title>Shallow copy &amp; Deep copy</title><link>http://www.blogjava.net/clraychen/archive/2008/02/22/181448.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Fri, 22 Feb 2008 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2008/02/22/181448.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/181448.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2008/02/22/181448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/181448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/181448.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt;"><span style="font-family: 宋体;">看设计模式看到</span>Prototype Pattern<span style="font-family: 宋体;">，老实说觉得这个模式并不是特别重要，但其中提到的</span>Java<span style="font-family: 宋体;">中的</span>clone()<span style="font-family: 宋体;">方法</span>,<span style="font-family: 宋体;">却值得仔细看一看，其中涉及到浅拷贝和深拷贝（</span>shallow copy &amp; deep copy<span style="font-family: 宋体;">），</span>Sun<span style="font-family: 宋体;">的一篇技术文档已经写的很清楚了，推荐。</span></p>
<p>http://java.sun.com/developer/JDCTechTips/2001/tt0410.html#making</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/181448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2008-02-22 16:44 <a href="http://www.blogjava.net/clraychen/archive/2008/02/22/181448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java ClassLoader基础知识（网上内容整理后所得）</title><link>http://www.blogjava.net/clraychen/archive/2008/02/20/180868.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Wed, 20 Feb 2008 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2008/02/20/180868.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/180868.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2008/02/20/180868.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/180868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/180868.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Java中一共有四个类加载器，之所以叫类加载器，是程序要用到某个类的时候，要用类加载器载入内存。<br />
&nbsp;&nbsp;&nbsp; 这四个类加载器分别为：<strong>Bootstrap ClassLoader</strong>、<strong>Extension ClassLoader</strong>、<strong>AppClassLoader</strong><br />
和<strong>URLClassLoader</strong>，他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做<strong>System ClassLoader<br />
<br />
</strong><strong>Bootstrap ClassLoader</strong>是在JVM开始运行的时候加载java的核心类，是用C++编写的，它用来加载核心类库，在JVM源代码中这样写道：<br />
static const char classpathFormat[] =<br />
"%/lib/rt.jar:"<br />
"%/lib/i18n.jar:"<br />
"%/lib/sunrsasign.jar:"<br />
"%/lib/jsse.jar:"<br />
"%/lib/jce.jar:"<br />
"%/lib/charsets.jar:"<br />
"%/classes";<br />
<strong>Extension ClassLoader</strong>是用来加载扩展类，即<strong>/lib/ext</strong>中的类。<br />
<strong>AppClassLoader</strong>用来加载<strong>Classpath</strong>的类，是和我们关系最密切的类。<br />
<strong>URLClassLoader</strong>用来加载网络上远程的类，暂且不讨论。<br />
<br />
<strong><span style="color: #5b10ff;"><span style="font-size: 18pt;">它们之间的关系:<br />
<br />
</span></span></strong>1.<strong>Parent-Child</strong>，按顺序从大到小。不是简单的继承关系。<br />
<br />
2.ClassLoader有个<strong>getParent</strong>的方法，但是Ext ClassLoader调用后得到的是<strong>null</strong>，bootstrap是JVM自己的，用户看不到。<br />
<br />
3.classloader的<strong>委托机制</strong>：当等级比较低的ClassLoader要加载某个类的时候，它首先会请求Parent加载器来加载，Parent再请求它的Parent<br />
比如现在Ext要加载了，它往上请求。如果最大的Bootstrap找不到，那么Boot会叫Ext自己找找，Ext找不到，是<strong><span style="color: #ff0000;">不会</span></strong>让下一级的App去找的，此时就报出ClassNotFoundException<br />
<br />
4.类A调用类B，B会要求调用它的类的类加载器来加载它，也就是B会要求加载A的加载器来加载B。这就会有个问题，如果他们在一起，那没关系，肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中，而B在Classpath中呢？过程是这样的首先加载A，那么一层层上到Bootstrap Classloader，boot没找到所以ext自己找，找到了，没问题；加载B，因为A调用了B，所以也从bootstrap来找，没找到，然后A的ext classloader来找还是没找到，但是再也不会往下调用了，于是报出ClassNotFoundException。<br />
但是现实生活中有很多应用，比如JDBC核心方法在核心库而驱动在扩展库，是必定在两个地方的，那怎么办呢？要用到Context ClassLoader我们在建立一个线程Thread的时候，可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader，当此线程运行的时候，我们可以通过getContextClassLoader方法来获得此context classloader，就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性，我们可以&#8220;打破&#8221;classloader委托机制了，父classloader可以获得当前线程的context classloader，而这个context classloader可以是它的子classloader或者其他的classloader，那么父classloader就可以从其获得所需的 Class，这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.
<img src ="http://www.blogjava.net/clraychen/aggbug/180868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2008-02-20 15:16 <a href="http://www.blogjava.net/clraychen/archive/2008/02/20/180868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ArrayList 泛型问题</title><link>http://www.blogjava.net/clraychen/archive/2007/12/23/169793.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sun, 23 Dec 2007 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/12/23/169793.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/169793.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/12/23/169793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/169793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/169793.html</trackback:ping><description><![CDATA[一直疑惑 ArrayList&lt;int&gt; 怎么搞，但懒得去查，今天网上搜到了：<br />
<br />
The generics facility in Java can be used only for<br />
object (reference) types. &nbsp;It cannot be used primitive<br />
types like 'int' or 'float'.<br />
<br />
So, if you wanted an ArrayList that contained only<br />
integer data, then you'd need to use the object type<br />
which corresponds to int: java.lang.Integer.<br />
<br />
&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt; numbers;<br />
&nbsp;&nbsp;&nbsp;numbers = new ArrayList&lt;Integer&gt;(40);<br />
<br />
Fortunately, the new Autobox/unbox features of Java can<br />
make this work just like an ArrayList of int.<br />
<br />
&nbsp;&nbsp;&nbsp;numbers.add(27);<br />
<br />
The value 27 will be automatically boxed as an Integer<br />
object, then added to the ArrayList&lt;Integer&gt;.<br />
<br />
For more information, consult <br />
<a href="http://java.sun.com/developer/technicalArticles/J2SE/generics/index.html" target="expertslink">http://java.sun.com/developer/technicalArticles/J2SE/generics/index.html</a><br />
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf<br />
<br />
<img src ="http://www.blogjava.net/clraychen/aggbug/169793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-12-23 15:22 <a href="http://www.blogjava.net/clraychen/archive/2007/12/23/169793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看到有意思的一句话</title><link>http://www.blogjava.net/clraychen/archive/2007/12/16/168134.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sun, 16 Dec 2007 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/12/16/168134.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/168134.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/12/16/168134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/168134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/168134.html</trackback:ping><description><![CDATA["Any <font color="blue">fool</font> can write code that a computer can understand. Good programmers write code that <font color="red">humans</font> can understand."<br />
- Martin Fowler, Refactoring - Improving the Design of Existing Code
<img src ="http://www.blogjava.net/clraychen/aggbug/168134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-12-16 23:16 <a href="http://www.blogjava.net/clraychen/archive/2007/12/16/168134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的一些小细节（四）Collection——《HardCore Java》</title><link>http://www.blogjava.net/clraychen/archive/2007/10/26/156250.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Fri, 26 Oct 2007 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/10/26/156250.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/156250.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/10/26/156250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/156250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/156250.html</trackback:ping><description><![CDATA[<font face="Times New Roman, serif"><strong style="font-size: 18pt">Interfaces</strong></font>
<p style="margin-bottom: 0cm">有两种主要的<font face="Times New Roman, serif">Collection Types<br />
</font><font face="Times New Roman, serif">java.util.Map <br />
</font><font face="Times New Roman, serif">java.util.SortedMap<br />
</font><font face="Times New Roman, serif">java.util.Collection<br />
</font><font face="Times New Roman, serif">java.util.Set<br />
</font><font face="Times New Roman, serif">java.util.List<br />
</font><font face="Times New Roman, serif">java.util.SortedSet</font></p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong style="font-size: 18pt">Implementations</strong></font></p>
<p style="margin-bottom: 0cm" align="left"><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">List</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">的三种实现</span></font></font></p>
<p style="margin-bottom: 0cm" align="left"><font color="#000000"></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">java.util.Vector<br />
</span></font></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">java.util.ArrayList<br />
</span></font></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">java.util.LinkedList</span></font></font></font></p>
<p style="margin-bottom: 0cm" align="left"><font color="#000000"></font><font color="#000000"><font size="3"><span lang="zh-CN"><strong>三者的异同</strong></span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US"><br />
</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">三者都是有序的，一般就是加入的次序。</span></font></font></p>
<p style="margin-bottom: 0cm" align="left"><font color="#000000"></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">和</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">ArrayList</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">内部都是用数组实现的，可以把它们想象成为一个数组。当容量不够的时候，就新建一个更大的数组，然后把现在这个数组中的所有元素都拷过去。可以想象这种实现可以很方便的直接取出你要的某个元素而不用遍历。但是如果在中间删除或者插入元素，效率就不高了。甚至每次扩容的时候，都是很影响效率的时候。</span></font></font></p>
<p style="margin-bottom: 0cm" align="left"><font color="#000000"></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">和</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">ArrayList</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">的区别就是</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">Vector</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">是线程安全的，但</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">ArrayList</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">不是。因为实现线程安全是有代价的，如果应用中不需要线程安全，那么就用</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">ArrayList</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">，如果需要线程安全那就一定要用</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">Vector</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">。</span></font></font></p>
<p style="margin-bottom: 0cm" align="left"><font color="#000000"></font><font color="#000000"><font size="3"><span lang="zh-CN">至于</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">java</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">中的</span></font></font><font face="Times New Roman, serif"><font color="#000000"><font size="3"><span lang="en-US">LinkedList</span></font></font></font><font color="#000000"><font size="3"><span lang="zh-CN">，其实在数据结构中就是双向链表。插入和删除元素都很快，但是要查找一个元素就慢了。有失必有得，如何选择，就看应用的情况了。</span></font></font></p>
<p lang="zh-CN" style="margin-bottom: 0cm" align="left"><br />
</p>
<p style="margin-bottom: 0cm"><strong style="font-size: 18pt"><font face="Times New Roman, serif">Map</font>和<font face="Times New Roman, serif">SortedMap</font>的几种实现</strong></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.HashTable<br />
</font><font face="Times New Roman, serif">java.util.HashMap<br />
</font><font face="Times New Roman, serif">java.util.IdentityHashMap<br />
</font><font face="Times New Roman, serif">java.util.WeakHashMap</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上四种都是无序的。<font face="Times New Roman, serif">HashTable</font>和<font face="Times New Roman, serif">HashMap</font>的区别是<font face="Times New Roman, serif">HashTable</font>是线程安全的而<font face="Times New Roman, serif">HashMap</font>不是，这个关系有点像<font face="Times New Roman, serif">Vector</font>和<font face="Times New Roman, serif">ArrayList</font>。</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdentityHashMap</font>首先它是一个<font face="Times New Roman, serif">HashMap</font>，不同的是，它不是根据<font face="Times New Roman, serif">equal()</font>函数来判断是否重复，只要不是同一个对象，哪怕这两个对象的数据都是一样的，那么就可以<font face="Times New Roman, serif">add</font>进来。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.LinkedHashMap</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.uil.TreeMap</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上两种是有序的<font face="Times New Roman, serif">Map</font>，可以进行<font face="Times New Roman, serif">iterate</font>，当然这是要付出效率代价的。两者不同之处，由名字便可知道，<font face="Times New Roman, serif">LinkedHashMap</font>用链表来维护这个次序，而<font face="Times New Roman, serif">TreeMap</font>是用二叉树来维护这个次序。</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">Sets</font>和<font face="Times New Roman, serif">SortedSets</font>的几种实现</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.HashSet<br />
</font><font face="Times New Roman, serif">java.util.LinkedSet<br />
</font><font face="Times New Roman, serif">java.util.TreeSet</font></p>
<p style="margin-bottom: 0cm">由名字就可知道什么意思了，不多说了<br />
<br />
</p>
<p style="margin-bottom: 0cm"><strong style="font-size: 18pt"><font face="Times New Roman, serif">Collection</font>的选择</strong></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要通过一个<font face="Times New Roman, serif">key</font>找到一个元素吗？<br />
<font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Yes</font>，那就用<font face="Times New Roman, serif">Map<br />
</font><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No</font>，那就用<font face="Times New Roman, serif">Collection</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果选择了一个<font face="Times New Roman, serif">Collection</font>，允许重复元素吗？<br />
<font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Yes</font>，那就用<font face="Times New Roman, serif">List<br />
</font><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; No</font>，那就用<font face="Times New Roman, serif">Set</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后就是决定要不要<font face="Times New Roman, serif">Sorted...</font>这个就比较难决定了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果常常要<font face="Times New Roman, serif">sort</font>，那就直接选择<font face="Times New Roman, serif">sorted</font>的类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果偶尔或者根本不需要<font face="Times New Roman, serif">sorted</font>，那就选择普通类型，需要<font face="Times New Roman, serif">sort</font>的时候先拷到<font face="Times New Roman, serif">sorted</font>的类型中<font face="Times New Roman, serif">sort</font>一下。</p>
<p style="margin-bottom: 0cm"><strong>三种<font face="Times New Roman, serif">Iterators</font></strong></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.Enumeration</font></p>
<p style="margin-bottom: 0cm">这个基本被<font face="Times New Roman, serif">Iterator</font>替代掉了，但在某些场合，比如<font face="Times New Roman, serif">J2ME</font>中还可能用到。</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.Iterator</font></p>
<p style="margin-bottom: 0cm">用的最广泛</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">java.util.ListIterator</font></p>
<p style="margin-bottom: 0cm">双向的<font face="Times New Roman, serif">Iterator</font>，必须用在实现<font face="Times New Roman, serif">List</font>的<font face="Times New Roman, serif">Collection</font>上面。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><strong><font face="Times New Roman, serif">PS</font>：</strong>很多<font face="Times New Roman, serif">Collection</font>提供的是<font face="Times New Roman, serif">Fail-Fast Iterators</font>，就是在<font face="Times New Roman, serif">iterater</font>的时候，这个<font face="Times New Roman, serif">Collection</font>是不能被更改的，否则就会报出<font face="Times New Roman, serif">ConcurrentModificationException</font>在多线程环境下面尤其要注意。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/156250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-10-26 21:14 <a href="http://www.blogjava.net/clraychen/archive/2007/10/26/156250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的一些小细节（三）_final story——《HardCore Java》</title><link>http://www.blogjava.net/clraychen/archive/2007/10/23/155283.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Tue, 23 Oct 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/10/23/155283.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/155283.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/10/23/155283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/155283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/155283.html</trackback:ping><description><![CDATA[<font face="Times New Roman, serif"><strong>Final constrants</strong></font>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在编程中，用<font face="Times New Roman, serif">final</font>变量来声明一些常量，这样就不用在每个用到这个常量数字的地方打入令人厌烦的复杂数字（比如<font face="Times New Roman, serif">PI</font>），只要打入这个常量名字就行了。这大家都知道，可是要注意，这种常量是在编译阶段才被替换的（所谓替换，就是把程序中用到这个常量名字的地方，用常量本身来替代）。那意味着，如果其它类用到了这个常量，如果常量的值发生了更改，那用到这个常量的类必须重新<font face="Times New Roman, serif">build</font>一下，否则那个类里还是以前的值。<font face="Times New Roman, serif"><br />
</font><br />
</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在程序中你用到了<font face="Times New Roman, serif">private final static</font>常量，并且只在某一个方法内用到，那么你应该把它的声明移到方法以内。如果被两个以上的方法用到，那么还是留在类声明里。</p>
<p style="margin-bottom: 0cm">移入方法内部后，不用写<font face="Times New Roman, serif">private</font>关键字，而且程序看起来比较简单。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Final Variables</strong></font></p>
<p style="margin-bottom: 0cm">首先写个例子</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">public static String someMethod(final String environmentKey){</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><font color="#800000"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final</strong></font> String key = "env." + environmentKey;</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Key is :" + key);</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (System.getProperty(key));</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">}</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在<font face="Times New Roman, serif">method</font>中声明的<font face="Times New Roman, serif"><font color="#800000"><strong>final</strong></font></font>变量和常量是不同的，不同之处在于<font face="Times New Roman, serif">method-scoped final variables are variable</font>。每次进入这个方法内部，这个变量就被初始化一次。当然，这些变量都是运行时进行替换，而不像常量是在编译时进行替换。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Final Parameters</strong></font></p>
<p style="margin-bottom: 0cm">将方法的<font face="Times New Roman, serif">parameters</font>声明成<font face="Times New Roman, serif"><font color="#800000"><strong>final</strong></font></font>，可以防止，在方法体内部这个参数被篡改。很好的<font face="Times New Roman, serif">best practice</font>。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Final Collections</strong></font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public <font color="#800000"><strong>final</strong></font> static Set VALID_COLORS; </font>这句语句是不是声明了一个<font face="Times New Roman, serif">final set</font>？答案是<font face="Times New Roman, serif">NO</font>。这只是声明了一个<font face="Times New Roman, serif"><font color="#800000"><strong>final</strong></font></font>引用，也就是<font face="Times New Roman, serif">VALID_COLORS</font>这个引用不能被更改。</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果重新声明一个引用指向这个对象，那么这个对象还是能够更改的，所以这并不是一个<font face="Times New Roman, serif">final set</font>。那么怎样做才能真正得到一个<font face="Times New Roman, serif">final set</font>呢？</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">public final static Set VALID_COLORS;</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><font color="#0000ff">static{</font></font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">Set temp = new HashSet();</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">temp.add(Color.red);</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">temp.add(Color.blue);</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">...</font></p>
<p style="margin-bottom: 0cm"><font color="#800000"></font><font face="Times New Roman, serif"><font color="#0000ff"><strong>VALID_COLORS = Collections.unmodifiableSet(temp);</strong></font></font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><font color="#0000ff">}</font></font><br />
</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实现自己的<font face="Times New Roman, serif">unmodifiable collections factory</font>的时候，除了要实现<font face="Times New Roman, serif">Collection</font>，<font face="Times New Roman, serif">seriallizable</font>接口以外，对于<font face="Times New Roman, serif">Collection</font>中定义的写操作，要重载。方法体中可以简单地抛出<font face="Times New Roman, serif"><em><u>UnsupportedOperationException</u></em></font>异常。<br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Instance-Scoped Variables</strong></font></p>
<p style="margin-bottom: 0cm; widows: 0; orphans: 0" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说白了，就是那些在对象被实例化的时候才被初始化的属性，并且是不能被修改的。那么就把他声明成<font face="Times New Roman, serif"><font color="#800000"><font face="Times New Roman, serif"><font size="3"><span lang="en-US"><strong>final</strong></span></font></font></font></font>吧。</p>
<p style="margin-bottom: 0cm; widows: 0; orphans: 0" align="left"><font face="Times New Roman, serif">ex</font>：<font face="Times New Roman, serif">private <font color="#800000"><font face="Times New Roman, serif"><font size="3"><span lang="en-US"><strong>final</strong></span></font></font></font> Date creationDate =</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();</font></p>
<p style="margin-bottom: 0cm">这么做的话，就可以防止误操作，改变这个本来不应该变的值。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Final Classes</strong></font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">ex: </font></p>
<p style="margin-bottom: 0cm; widows: 0; orphans: 0" align="left"><font face="Times New Roman, serif">public<font color="#800000"><font face="Times New Roman, serif"><font size="3"><span lang="en-US"><strong> final</strong></span></font></font></font> class SomeClass(){</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">//...Class contents</font></p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">}</font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样的<font face="Times New Roman, serif">class </font>不能被继承。</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有一种方法实现，就是把它所有的构造函数都改成<font face="Times New Roman, serif">private</font>的。</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这在设计模式中<font face="Times New Roman, serif">sigleton</font>模式中见过，但这就限制了这个类的重用，所以取个折衷，可以把构造函数声明成<font face="Times New Roman, serif">protected</font>的。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Final Method</strong></font></p>
<p style="margin-bottom: 0cm">这个很熟悉了，一个类中的某个方法如果被声明成<font face="Times New Roman, serif">final</font>的，那么这个类的子类是不能<font face="Times New Roman, serif"><u>override</u></font>这个方法的。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif"><strong>Conditional Complilation</strong></font></p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编程的时候我们常常会使用<font face="Times New Roman, serif">System.out.println(".....");</font>来显示一些程序的运行情况，但在真正交付的时候，我们并不希望这些语句被编译到<font face="Times New Roman, serif">class</font>文件里面去。</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个做法是所有这种类型的语句前面加上一个<font face="Times New Roman, serif"><font color="#0000ff">if(booleanParameter)</font></font>，然后通过设置这个<font face="Times New Roman, serif"><font color="#0000ff">booleanParameter</font></font>来实现要不要运行这些语句，编译器在编译的时候如果发现<font face="Times New Roman, serif">if</font>里面的语句不可达，那么会将这些程序代码直接去掉。</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 疑问就是这些<font face="Times New Roman, serif"><font color="#0000ff">booleanParameter</font></font>放在哪里比较好和方便。作者给出的建议是在包中专门建一个类，里面存放这些静态的<font face="Times New Roman, serif"><font color="#0000ff">boolean</font></font>常量，当然，命名的时候要仔细。名字要指出用在哪里。</p>
 <img src ="http://www.blogjava.net/clraychen/aggbug/155283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-10-23 14:07 <a href="http://www.blogjava.net/clraychen/archive/2007/10/23/155283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的一些小细节（二）——《HardCore Java》</title><link>http://www.blogjava.net/clraychen/archive/2007/10/22/154878.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Mon, 22 Oct 2007 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/10/22/154878.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/154878.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/10/22/154878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/154878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/154878.html</trackback:ping><description><![CDATA[<p style="margin-bottom: 0cm"><span lang="en-US">1.Java</span><span lang="zh-CN">没有指针？</span><span lang="en-US">No</span><span lang="zh-CN">，</span><span lang="en-US">Java</span><span lang="zh-CN">只是没有针对指针的算法。引用其实已经包含了指针。</span></p>
<p style="margin-bottom: 0cm">2.RTTI——Runtime type identification，作用就是告诉你整个object是属于什么类型的。最常用的是getClass()方法。</p>
<p style="margin-bottom: 0cm">3.只在for循环中用到的变量，就在for循环中声明和分配，不用担心会循环分配内存。</p>
<p style="margin-bottom: 0cm">比如：</p>
<p style="margin-bottom: 0cm">for(int i =0;i&lt;10;i++){</p>
<p style="margin-bottom: 0cm">String s = a[i];</p>
<p style="margin-bottom: 0cm">}</p>
<p style="margin-bottom: 0cm">s并不会循环new，编译器会处理，让它只在第一次分配内存。<br />
前面编程，我还特意把s移到外面去呢&#8230;&#8230;汗啊</p>
<p style="margin-bottom: 0cm">4.switch语句中，如果在default语句中加一个break是完全没有用的。因为在那个地方的break根本就不会被执行。</p>
<p style="margin-bottom: 0cm">5.continue</p>
<p style="margin-bottom: 0cm">for(int idx=0;idx&lt;1000,idx++){</p>
<p style="margin-bottom: 0cm">if(idx==555){continue;}</p>
<p style="margin-bottom: 0cm">}</p>
<p style="margin-bottom: 0cm">在这个例子中，循环仅仅跳过了555，如果程序中遇到类似要跳过某个点的情况，可以这么利用continue，会减少很多代码。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm">6.chaining constructor</p>
<p style="margin-bottom: 0cm">活用super()、this()等，来缩减构造函数的复杂度。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm">7.private for attributes </p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp; public for public methods</p>
<p style="margin-bottom: 0cm">&nbsp;&nbsp; protected for helper methods</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm">8.In Java, instances of the same class are friends and give unrestricted access to all of their properties and methods.</p>
<p style="margin-bottom: 0cm">比如</p>
<p style="margin-bottom: 0cm">if((obj.value==5)&amp;&amp;(this.value==5)){</p>
<p style="margin-bottom: 0cm">obj.value=25;</p>
<p style="margin-bottom: 0cm">} </p>
<p style="margin-bottom: 0cm">这里面跳过了setter方法，直接给属性赋值，这是很危险的做法。解决的方法是无论什么方法给对象中的属性赋值都要通过setter方法。</p>
<p style="margin-bottom: 0cm"><br />
</p>
<p style="margin-bottom: 0cm">9.对于问题代码要尽量用throw exception告知用户，因为有时候不知道代码的执行环境，如EJB等等，很多环境都是没有Console的，若是简单的System.out.println 可能解决不了问题。</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/154878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-10-22 10:15 <a href="http://www.blogjava.net/clraychen/archive/2007/10/22/154878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC小总结</title><link>http://www.blogjava.net/clraychen/archive/2007/10/21/154739.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sun, 21 Oct 2007 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/10/21/154739.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/154739.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/10/21/154739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/154739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/154739.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong><span style="font-size: 16pt">JDBC </span></strong><strong><span style="font-size: 16pt; font-family: 宋体">主要有两种方法</span></strong></p>
<p>DriverManager<span style="font-family: 宋体">机制：</span>java.sql<span style="font-family: 宋体">核心</span>API</p>
<p>DataSource<span style="font-family: 宋体">机制：</span>javax.sql<span style="font-family: 宋体">可扩展</span>API</p>
<p><strong><span style="font-size: 14pt">DriverManager</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">机制：</span></strong></p>
<p>stetp1<span style="font-family: 宋体">：注册驱动程序</span></p>
<p><span style="font-family: 宋体">（</span>1<span style="font-family: 宋体">）隐式注册</span>Class.forName("JDBCDriverName");</p>
<p><span style="font-family: 宋体">（</span>2<span style="font-family: 宋体">）显示注册</span>DriverMnager.registerDriver(new JDBCDriverName());</p>
<p>step 2:<span style="font-family: 宋体">建立数据库连接</span></p>
<p>Connection conn = DriverManager.getConnection(URL,username,password);</p>
<p>//<span style="font-family: 宋体">其中</span>URL<span style="font-family: 宋体">＝</span>jdbc:driver:databasename</p>
<p>step3:SQL<span style="font-family: 宋体">操作</span></p>
<p><strong><span style="font-size: 14pt">DataSource</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">机制</span></strong></p>
<p>step1<span style="font-family: 宋体">：查询数据源对象</span></p>
<p>Context ctx = new InitialContext();</p>
<p>DataSource ds = (DataSource)ctx.lookup(DataSourceJNDIName);</p>
<p>step2<span style="font-family: 宋体">：获取数据库连接</span></p>
<p>Connection con = ds.getConnection();</p>
<p>step3<span style="font-family: 宋体">：</span>SQL<span style="font-family: 宋体">操作</span></p>
<p><strong><span style="font-size: 16pt">SQL</span></strong><strong><span style="font-size: 16pt; font-family: 宋体">操作</span></strong></p>
<p><strong><span style="font-family: 宋体">（</span></strong><strong>1</strong><strong><span style="font-family: 宋体">）使用</span></strong><strong>Statement</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = con.createStatement();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUpdate("SQL<span style="font-family: 宋体">语句</span>");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();</p>
<p><strong><span style="font-family: 宋体">（</span></strong><strong>2</strong><strong><span style="font-family: 宋体">）使用</span></strong><strong>PreparedStatement</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">例子</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement psmt = conn.preparedStatement("INSERT INTO employee&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES(?,?,?)");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(1,"Benjamin");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(2,"France");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setInt(3,55);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int opNum = psmt.executeUpdate();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">还可以批量处理</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(1,"Benjamin");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(2,"France");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setInt(3,55);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">psmt.addBatch();</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(1,"Rob");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setString(2,"America");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psmt.setInt(3,56);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">psmt.addBatch();</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int [] updateCounts = psmt.<span style="color: blue">executeBatch();</span></p>
<p><strong><span style="font-size: 16pt; font-family: 宋体">关于</span></strong><strong><span style="font-size: 16pt">ResultSet</span></strong></p>
<p>ResultSet rs = stmt.executeQuery("SQL");</p>
<p>next()——<span style="font-family: 宋体">移到下一行，如果没有了则返回</span>false<span style="font-family: 宋体">。常常放在</span>while(rs.next)<span style="font-family: 宋体">用来循环取数据</span></p>
<p>getString(String ColumnName)</p>
<p>absolute(int row)</p>
<p>beforeFist()</p>
<p>isAfterLast()</p>
<p>isBeforeFirst()</p>
<p>isFirst()</p>
<p>isLast()</p>
<p>refreshRow()</p>
<p><strong><span style="font-size: 16pt; font-family: 宋体">关于元数据</span></strong></p>
<p><span style="font-family: 宋体">所谓元数据就是描述数据的数据，这里当然指列名等等信息了</span></p>
<p>ResultSetMetaData rsmd = rs.<span style="color: blue">getMetaData();</span></p>
<p>rsmd.getColumnCount();</p>
<p>rsmd.getColumnName(index);</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/154739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-10-21 18:41 <a href="http://www.blogjava.net/clraychen/archive/2007/10/21/154739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 的一些小细节（一）——《Java就业培训教程》</title><link>http://www.blogjava.net/clraychen/archive/2007/10/10/151653.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Wed, 10 Oct 2007 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/10/10/151653.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/151653.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/10/10/151653.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/151653.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/151653.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong>Java</strong><strong><span style="font-family: 宋体">类型相关</span></strong></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">类型名</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">大小</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">取值范围</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>byte</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>8 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>-128<span style="font-family: 宋体">～</span>127</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>short</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>16 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>-32768~32767</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>int </p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>32 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>long</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>64 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>float</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>32 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 142pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>double</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189">
            <p>64 bits</p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="189"></td>
        </tr>
    </tbody>
</table>
<p><strong>Java</strong><strong><span style="font-family: 宋体">常量</span></strong></p>
<p><span style="font-family: 宋体">①</span><span style="font-family: 宋体">十进制不能以</span><span style="color: #3366ff">0</span><span style="font-family: 宋体">打头（数字</span>0<span style="font-family: 宋体">除外）</span></p>
<p><span style="font-family: 宋体">②</span><span style="font-family: 宋体">十六进制必须以</span><span style="color: #3366ff">0x</span><span style="font-family: 宋体">或者</span><span style="color: #3366ff">0X</span><span style="font-family: 宋体">打头</span></p>
<p><span style="font-family: 宋体">③</span><span style="font-family: 宋体">八进制必须以</span><span style="color: #3366ff">0</span><span style="font-family: 宋体">打头</span></p>
<p><span style="font-family: 宋体">④</span><span style="font-family: 宋体">长整型必须以</span><span style="color: #3366ff">L</span><span style="font-family: 宋体">结尾</span></p>
<p><span style="font-family: 宋体">⑤</span><span style="font-family: 宋体">小数常量默认为</span><span style="color: #3366ff">double</span><span style="font-family: 宋体">型，如果要将小数赋值给</span><span style="color: #3366ff">float</span><span style="font-family: 宋体">变量，数字后面要加</span><span style="color: #3366ff">f</span></p>
<p><strong>final</strong><strong><span style="font-family: 宋体">关键字</span></strong></p>
<p>final <span style="font-family: 宋体">标记的类不能被继承</span></p>
<p>final <span style="font-family: 宋体">变量是常量，不能改变</span></p>
<p>final <span style="font-family: 宋体">方法不能被子类重写</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">变量</span></strong></p>
<p><span style="font-family: 宋体">（</span>1<span style="font-family: 宋体">）当发生隐式类型转换时，<span style="color: #3366ff">目标类型</span>取值范围要大于<span style="color: #3366ff">源类型</span>取值范围</span></p>
<p><span style="font-family: 宋体">（</span>2<span style="font-family: 宋体">）字符串可以使用加号同其它的数据类型相连而形成一个新的字符串</span></p>
<p style="text-indent: 21pt">Example<span style="font-family: 宋体">：</span></p>
<p style="text-indent: 21pt">System.out.println(&#8216;a&#8217;+1);&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">输出的是</span>98</p>
<p style="text-indent: 21pt">System.out.println(&#8220;&#8221;+&#8217;a&#8217;+1); <span style="font-family: 宋体">输出的是</span>&#8221;a1&#8221;</p>
<p><span style="font-family: 宋体">（</span>3<span style="font-family: 宋体">）<span style="color: #3366ff">局部变量</span>一定要进行初始化</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="font-family: 宋体">编译的时候可能只是警告，但在使用时就会报错</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">运算</span></strong></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">整数之间做除法时，只保留整数部分而舍弃小数部分。</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">养成这样的习惯：把</span>x==3 <span style="font-family: 宋体">写成</span> 3==x</p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（3）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&amp;<span style="font-family: 宋体">和</span>&amp;&amp;<span style="font-family: 宋体">的区别</span> </p>
<p style="margin-left: 36pt">&amp;&amp;<span style="font-family: 宋体">称为短路表达式，意思就是</span>&amp;<span style="font-family: 宋体">不管两边是</span>true<span style="font-family: 宋体">或者</span>false<span style="font-family: 宋体">都会算一下，而</span>&amp;&amp;<span style="font-family: 宋体">如果算到前面的是</span>false<span style="font-family: 宋体">，它后面就不算了，反正综合起来表达式肯定是</span>false<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（4）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">位运算</span></p>
<p style="margin-left: 36pt">&lt;&lt; <span style="font-family: 宋体">左移</span></p>
<p style="margin-left: 36pt">&gt;&gt; <span style="font-family: 宋体">右移</span></p>
<p style="margin-left: 51.75pt; text-indent: -15.75pt">&nbsp;&nbsp; <span style="font-family: 宋体">如果最高位是</span>0<span style="font-family: 宋体">，左边移空的高位就填</span>0<span style="font-family: 宋体">，如果最高位是</span>1<span style="font-family: 宋体">，左边移空的高位就填入</span>1</p>
<p style="margin-left: 36pt">&gt;&gt;&gt; <span style="font-family: 宋体">无符号右移</span></p>
<p style="margin-left: 36pt">&nbsp;&nbsp; <span style="font-family: 宋体">不管最高位是什么，移空的高位一律填入</span>0</p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">右移</span>n<span style="font-family: 宋体">位就是除以</span>2<span style="font-family: 宋体">的</span>n<span style="font-family: 宋体">次方</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">左移</span>n<span style="font-family: 宋体">位就是乘以</span>2<span style="font-family: 宋体">的</span>n<span style="font-family: 宋体">次方</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">内存</span></strong></p>
<p><span style="font-family: 宋体">（</span>1<span style="font-family: 宋体">）</span>Java<span style="font-family: 宋体">内存分为两种：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">①</span><span style="color: #3366ff; font-family: 宋体">栈内存</span><span style="font-family: 宋体">：用于存放基本类型变量和对象的引用变量</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">②</span><span style="color: #3366ff; font-family: 宋体">堆内存</span><span style="font-family: 宋体">：</span>new<span style="font-family: 宋体">创建的对象和数组</span></p>
<p><span style="font-family: 宋体">（</span>2<span style="font-family: 宋体">）当堆内存中的对象没有引用指向它时，它就变成了垃圾，会被垃圾回收器回收。</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">面向对象</span></strong></p>
<p><span style="font-family: 宋体">（</span>1<span style="font-family: 宋体">）</span>= =<span style="font-family: 宋体">常用来比较引用是否指向同一个地址</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; equals()<span style="font-family: 宋体">用来比较对象的内容是否一样</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">对于数组有</span>Array.equals<span style="font-family: 宋体">方法</span></p>
<p style="margin-left: 26.25pt; text-indent: -26.25pt"><span style="font-family: 宋体">（</span>2<span style="font-family: 宋体">）</span>finalize()<span style="font-family: 宋体">方法，它相当于</span>C++<span style="font-family: 宋体">中的析构函数，但又和析构函数不一样。因为</span>Java<span style="font-family: 宋体">里面已经有垃圾回收器了，所以</span>finalize<span style="font-family: 宋体">方法不是特别重要。另外，</span>finalize<span style="font-family: 宋体">是在对象被当成垃圾从内存中释放前调用，而不是在对象变成垃圾前调用，垃圾回收器什么时候清理垃圾是不定时的，所以不要指望用</span>finalize<span style="font-family: 宋体">做什么必要的收尾工作，因为你根本无法确定它会赶在垃圾回收器之前执行。</span></p>
<p style="margin-left: 26.25pt; text-indent: -26.25pt"><span style="font-family: 宋体">（</span>3<span style="font-family: 宋体">）</span>System.gc()<span style="font-family: 宋体">这个语句可以显式地调用垃圾回收器回收垃圾。</span></p>
<p style="margin-left: 26.35pt; text-indent: -26.35pt"><strong>Java</strong><strong><span style="font-family: 宋体">参数传递</span></strong></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">基本类型的变量作为实参传递，并不能改变这个变量的值</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">举个例子，就是</span>main<span style="font-family: 宋体">函数里面定义的一个变量，传给一个方法，改下值，其实并没有改变</span>main<span style="font-family: 宋体">函数里面那个变量而是改了那个方法自己内部的那个副本。</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">那如果传递的是某个对象的引用呢？</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">道理一样，传递的是值，这个&#8220;值&#8221;就是引用的&#8220;值&#8221;，也就是对象的内存地址，方法通过这个地址对变量进行的修改，当然就是对</span>main<span style="font-family: 宋体">函数中定义的这个变量本身的修改了。</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">内部类</span></strong></p>
<p>A<span style="font-family: 宋体">类里面定义了</span>B<span style="font-family: 宋体">类，那么</span>B<span style="font-family: 宋体">就叫做内部类，</span>A<span style="font-family: 宋体">就叫做外部类。</span></p>
<p>B<span style="font-family: 宋体">可以直接访问</span>A<span style="font-family: 宋体">类的所有变量和方法，反之不成立。</span></p>
<p>B<span style="font-family: 宋体">类保存了</span>A<span style="font-family: 宋体">类的</span><span style="color: #3366ff">this</span><span style="font-family: 宋体">引用。</span></p>
<p><span style="font-family: 宋体">内部类可以是</span>static<span style="font-family: 宋体">的</span></p>
<p><span style="font-family: 宋体">如果内部类被声明为</span>static<span style="font-family: 宋体">，那么它可以包含</span>static<span style="font-family: 宋体">的变量，但不再能访问外部类的非</span>static<span style="font-family: 宋体">变量。</span></p>
<p><span style="font-family: 宋体">方法内定义的内部类，只能访问方法中的</span>final<span style="font-family: 宋体">变量，而不能访问临时变量，但可以访问外部类的变量。</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">异常</span></strong></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">一个方法被覆盖时，覆盖它的方法必须抛出相同的异常或异常的子类</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">如果父类抛出多个异常，那么覆盖方法必须抛出那些异常的一个子集，也就是说，不能抛出新的异常。</span></p>
<p><strong>Java</strong><strong><span style="font-family: 宋体">线程</span></strong></p>
<p><span style="font-family: 宋体">两种实现多线程方式</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">直接继承</span>Thread </p>
<p style="margin-left: 36pt">MyThread <span style="color: #3366ff">extends Thread</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">然后</span></p>
<p style="margin-left: 36pt">MyThread t = new MyTread();</p>
<p style="margin-left: 36pt">t.start();</p>
<p style="margin-left: 36pt">t.start();</p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">值得注意的是，无论调用</span>start<span style="font-family: 宋体">多少遍只能启动一个线程。</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">要实现多个线程，只能生成多个对象，分别启动线程，一个对象只能启动一个线程</span></p>
<p style="margin-left: 36pt; text-indent: -36pt; tab-stops: list 36.0pt">（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">实现</span>Runnable<span style="font-family: 宋体">接口</span></p>
<p style="margin-left: 36pt">MyThread <span style="color: #3366ff">implements Runnalbe</span></p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">然后</span></p>
<p style="margin-left: 36pt">new Thread(t).start();</p>
<p style="margin-left: 36pt">new Thread(t).start();</p>
<p style="margin-left: 36pt"><span style="font-family: 宋体">这种方法就能实现多个线程。</span></p>
<p><span style="font-family: 宋体">但这两种方法启动的多个线程又有不一样的地方：</span></p>
<p><span style="font-family: 宋体">第一种因为是生成了多个对象，所以类中声明的一些资源，比如变量等等都是各不相关的。</span></p>
<p><span style="font-family: 宋体">第二种对类中声明的资源是多个线程共享的。</span></p>
<p><span style="font-family: 宋体">所以要按需选择。</span></p>
<p><strong>Java String</strong><strong><span style="font-family: 宋体">和</span>StringBuffer</strong></p>
<p><span style="color: #3366ff">String </span><span style="font-family: 宋体">对象不能轻易被改变，经常用的&#8220;</span>+<span style="font-family: 宋体">&#8221;其实是新生成了一个</span><span style="color: #3366ff">String</span><span style="font-family: 宋体">对象，平常感觉不大，但是真的在大型应用中，对效率影响非常严重。</span></p>
<p><span style="color: #3366ff">StringBuffer</span><span style="font-family: 宋体">对象可以改动，一旦生成了不再变化的内容，就可以调用它的</span><span style="color: #3366ff">toString</span><span style="font-family: 宋体">方法，把它转化为</span>String<span style="font-family: 宋体">对象。</span></p>
 <img src ="http://www.blogjava.net/clraychen/aggbug/151653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-10-10 10:51 <a href="http://www.blogjava.net/clraychen/archive/2007/10/10/151653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>郁闷啊</title><link>http://www.blogjava.net/clraychen/archive/2006/06/14/52608.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Tue, 13 Jun 2006 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2006/06/14/52608.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/52608.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2006/06/14/52608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/52608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/52608.html</trackback:ping><description><![CDATA[要做软工作业了，把以前的东西要翻出来了。<br /><br />本来想马上配好myeclipse+jboss+mysql的，但不知道是什么原因老是说配置错误。网上也找到了类似的错误，但也没有很好的解答。<br /><br />逼的我没办法，只好重装jdk，终于行了，但要睡觉咯……因为后面还有考试。<img src ="http://www.blogjava.net/clraychen/aggbug/52608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2006-06-14 00:41 <a href="http://www.blogjava.net/clraychen/archive/2006/06/14/52608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>