﻿<?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-轻帆向南</title><link>http://www.blogjava.net/dongond/</link><description>大学记忆，过往的终点，新的起点...</description><language>zh-cn</language><lastBuildDate>Wed, 15 Apr 2026 11:56:27 GMT</lastBuildDate><pubDate>Wed, 15 Apr 2026 11:56:27 GMT</pubDate><ttl>60</ttl><item><title>about String</title><link>http://www.blogjava.net/dongond/archive/2012/02/22/370531.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Wed, 22 Feb 2012 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2012/02/22/370531.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/370531.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2012/02/22/370531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/370531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/370531.html</trackback:ping><description><![CDATA[<div><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【zz 网上关于String的讨论很多，这段讲解让我稍稍有了点头绪：）】<br />先来了解一下JVM运行时数据区的内存模型。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">《深入Java虚拟机》书中是这样描述的：JVM运行时数据区的内存模型由五部分组成：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【1】方法区</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【2】堆</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【3】Java栈</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【4】PC寄存器</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【5】本地方法栈</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">对于String s = "hello" ,它的虚拟机指令：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> </span><span style="line-height: 18px; ">0</span><span style="line-height: 18px; ">:   ldc     #</span><span style="line-height: 18px; ">16</span><span style="line-height: 18px; ">; </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">string hello    </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">2</span><span style="line-height: 18px; ">:   astore_1   </span><span style="line-height: 18px; ">3</span><span style="line-height: 18px; ">:   </span><span style="line-height: 18px; color: #0000ff; ">return</span><span style="line-height: 18px; "> </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">对于上面虚拟机指令，其各自的指令流程在《深入Java虚拟机》这样描述到(结合上面实例)：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">ldc指令格式：ldc,index</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">ldc指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行ldc指令，jvm首先查找index所指定的常量池入口，在index指向的常量池入口，jvm将会查找constant_integer_info，constant_float_info和constant_string_info入口。如果还没有这些入口，jvm会解析它们。而对于上面的hahajvm会找到constant_string_info入口，同时，将把指向被拘留String对象（由解析该入口的进程产生）的引用压入操作数栈。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">astore_1指令格式：astore_1</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">astore_1指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行astore_1指令，jvm从操作数栈顶部弹出一个引用类型或者returnaddress类型值，然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnaddress类型值存入局部变量1。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">return 指令的过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">从方法中返回，返回值为void。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">谈一下我个人理解：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">从上面的ldc指令的执行过程可以得出：s的值是来自被拘留string对象（由解析该入口的进程产生）的引用，即可以理解为是从被拘留string对象的引用复制而来的，故我个人的理解是s的值是存在栈当中。上面是对于s值得分析，接着是对于"hello"值的分析,我们知道，对于string s = "hello" 其中"hello"值在java程序编译期就确定下来了的。简单一点说，就是haha的值在程序编译成class文件后，就在class文件中生成了（大家可以用ue编辑器或其它文本编辑工具在打开class文件后的字节码文件中看到这个hello值）。执行java程序的过程中，第一步是class文件生成，然后被jvm装载到内存执行。那么jvm装载这个class到内存中，其中的hello这个值，在内存中是怎么为其开辟空间并存储在哪个区域中呢？</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">说到这里，我们不妨先来了解一下jvm常量池这个结构，《深入Java虚拟机》书中有这样的描述：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">常量池</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和，包括直接常量（string,integer和floating point常量）和对其他类型，字段和方法的符号引用。对于string常量，它的值是在常量池中的。而jvm中的常量池在内存当中是以表的形式存在的，对于string类型，有一张固定长度的constant_string_info表用来存储文字字符串值，注意：该表只存储文字字符串值，不存储符号引用。说到这里，对常量池中的字符串值的存储位置应该有一个比较明了的理解了。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">在介绍完jvm常量池的概念后，接着谈开始提到的"hello"的值的内存分布的位置。对于haha的值，实际上是在class文件被jvm装载到内存当中并被引擎在解析ldc指令并执行ldc指令之前，jvm就已经为haha这个字符串在常量池的constant_string_info表中分配了空间来存储hello这个值。既然hello这个字符串常量存储在常量池中，根据《深入java虚拟机》书中描述：常量池是属于类型信息的一部分，类型信息也就是每一个被转载的类型，这个类型反映到jvm内存模型中是对应存在于jvm内存模型的方法区中，也就是这个类型信息中的常量池概念是存在于在方法区中，而方法区是在jvm内存模型中的堆中由jvm来分配的。所以，hello的值是应该是存在堆空间中的。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">而对于string s = new string("hello") ,它的jvm指令：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> </span><span style="line-height: 18px; ">0</span><span style="line-height: 18px; ">:   </span><span style="line-height: 18px; color: #0000ff; ">new</span><span style="line-height: 18px; ">     #</span><span style="line-height: 18px; ">16</span><span style="line-height: 18px; ">; </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">class string </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">3</span><span style="line-height: 18px; ">:   dup  </span><span style="line-height: 18px; ">4</span><span style="line-height: 18px; ">:   ldc     #</span><span style="line-height: 18px; ">18</span><span style="line-height: 18px; ">; </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">string hello </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">6</span><span style="line-height: 18px; ">:   invokespecial   #</span><span style="line-height: 18px; ">20</span><span style="line-height: 18px; ">; </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">method java/lang/string."":(ljava/lang/string;)v </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">9</span><span style="line-height: 18px; ">:   astore_1  </span><span style="line-height: 18px; ">10</span><span style="line-height: 18px; ">:  </span><span style="line-height: 18px; color: #0000ff; ">return</span><span style="line-height: 18px; "> </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">对于上面虚拟机指令，其各自的指令流程在《深入java虚拟机》这样描述到(结合上面实例)：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">new指令格式：new indexbyte1,indexbyte2</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">new指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行new指令，jvm通过计算(indextype1&lt;&lt;8)|indextype2生成一个指向常量池的无符号16位索引。然后jvm根据计算出的索引查找常量池入口。该索引所指向的常量池入口必须为constant_class_info。如果该入口尚不存在，那么jvm将解析这个常量池入口，该入口类型必须是类。jvm从堆中为新对象映像分配足够大的空间，并将对象的实例变量设为默认值。最后jvm将指向新对象的引用objectref压入操作数栈。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">dup指令格式：dup</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">dup指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行dup指令，jvm复制了操作数栈顶部一个字长的内容，然后再将复制内容压入栈。本指令能够从操作数栈顶部复制任何单位字长的值。但绝对不要使用它来复制操作数栈顶部任何两个字长(long型或double型)中的一个字长。上面例中，即复制引用objectref，这时在操作数栈存在2个引用。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">ldc指令格式：ldc,index</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">ldc指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行ldc指令，jvm首先查找index所指定的常量池入口，在index指向的常量池入口，jvm将会查找constant_integer_info，constant_float_info和constant_string_info入口。如果还没有这些入口，jvm会解析它们。而对于上面的haha,jvm会找到constant_string_info入口，同时，将把指向被拘留string对象（由解析该入口的进程产生）的引用压入操作数栈。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">invokespecial指令格式：invokespecial,indextype1,indextype2</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">invokespecial指令过程：对于该类而言，该指令是用来进行实例初始化方法的调用。鉴于该指令篇幅，具体可以查阅《深入java虚拟机》中描述。上面例子中，即通过其中一个引用调用string类的构造器，初始化对象实例，让另一个相同的引用指向这个被初始化的对象实例，然后前一个引用弹出操作数栈。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">astore_1指令格式：astore_1</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">astore_1指令过程：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行astore_1指令，jvm从操作数栈顶部弹出一个引用类型或者returnaddress类型值，然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnaddress类型值存入局部变量1。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">return 指令的过程:</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">从方法中返回，返回值为void。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">要执行astore_1指令，jvm从操作数栈顶部弹出一个引用类型或者returnaddress类型值，然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnaddress类型值存入局部变量1。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">通过上面6个指令，可以看出，string s = new string("hello");中的hello存储在堆空间中，而s则是在操作数栈中。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">上面是对s和haha值的内存情况的分析和理解；那对于string s = new string("hello");语句,到底创建了几个对象呢?</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">我的理解：这里"hello"本身就是常量池中的一个对象，而在运行时执行new string()时，将常量池中的对象复制一份放到堆中，并且把堆中的这个对象的引用交给s持有。所以这条语句就创建了2个string对象。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><strong style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">下面是一些string相关的常见问题：</strong><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">String中的final用法和理解</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">final stringbuffer a = new stringbuffer("111");</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">final stringbuffer b = new stringbuffer("222");</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">a=b;//此句编译不通过</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">final stringbuffer a = new stringbuffer("111");</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">a.append("222");//编译通过</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">可见，final只对引用的"值"(即内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于它所指向的对象的变化，final是不负责的。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><strong style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">String 常量池问题的几个例子</strong><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">下面是几个常见例子的比较分析和理解：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【1】</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a1</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span> <span style="line-height: 18px; ">1</span><span style="line-height: 18px; ">;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = true </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">atrue</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">true</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = true </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a3.4</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span> <span style="line-height: 18px; ">3.4</span><span style="line-height: 18px; ">;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = true</span><span style="line-height: 18px; color: #008000; "> </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">分析：jvm对于字符串常量的"+"号连接，将程序编译期，jvm就将常量字符串的"+"连接优化为连接后的值，拿"a" + 1来说，经编译器优化后在class中就已经是a1。在编译期其字符串常量的值就确定下来，故上面程序最终的结果都为true。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【2】</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">ab</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String bb </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">b</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span><span style="line-height: 18px; "> bb;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = false</span><span style="line-height: 18px; color: #008000; "> </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">分析：jvm对于字符串引用，由于在字符串的"+"连接中，有字符串引用存在，而引用的值在程序编译期是无法确定的，即"a" + bb无法被编译器优化，只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【3】</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">ab</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   </span><span style="line-height: 18px; color: #0000ff; ">final</span><span style="line-height: 18px; "> String bb </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">b</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span><span style="line-height: 18px; "> bb;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = true</span><span style="line-height: 18px; color: #008000; "> </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">分析：和[3]中唯一不同的是bb字符串加了final修饰，对于final修饰的变量，它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">【4】</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">ab</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   </span><span style="line-height: 18px; color: #0000ff; ">final</span><span style="line-height: 18px; "> String bb </span><span style="line-height: 18px; ">=</span><span style="line-height: 18px; "> getbb();   String b </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span> <span style="line-height: 18px; ">+</span><span style="line-height: 18px; "> bb;   System.out.println((a </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> b)); </span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">result = false  </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; color: #0000ff; ">private</span> <span style="line-height: 18px; color: #0000ff; ">static</span><span style="line-height: 18px; "> string getbb() {    </span><span style="line-height: 18px; color: #0000ff; ">return</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">b</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;   } </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">分析：jvm对于字符串引用bb，它的值在编译期无法确定，只有在程序运行期调用方法后，将方法的返回值和"a"来动态连接并分配地址为b，故上面程序的结果为false。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">通过上面4个例子可以得出得知：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string s = "a" + "b" + "c"; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">就等价于string s = "abc"; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string a = "a"; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string b = "b"; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string c = "c"; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string s = a + b + c; &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">这个就不一样了，最终结果等于： &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">stringbuffer temp = new stringbuffer(); &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">temp.append(a).append(b).append(c); &nbsp;&nbsp;</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string s = temp.tostring();</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">由上面的分析结果，可就不难推断出string 采用连接运算符（+）效率低下原因分析，形如这样的代码：</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> </span><span style="line-height: 18px; color: #0000ff; ">public</span> <span style="line-height: 18px; color: #0000ff; ">class</span><span style="line-height: 18px; "> test {    </span><span style="line-height: 18px; color: #0000ff; ">public</span> <span style="line-height: 18px; color: #0000ff; ">static</span> <span style="line-height: 18px; color: #0000ff; ">void</span><span style="line-height: 18px; "> main (String args[]) {      String s </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; color: #0000ff; ">null</span><span style="line-height: 18px; ">;      </span><span style="line-height: 18px; color: #0000ff; ">for</span><span style="line-height: 18px; "> (</span><span style="line-height: 18px; color: #0000ff; ">int</span><span style="line-height: 18px; "> i </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">0</span><span style="line-height: 18px; ">; i </span><span style="line-height: 18px; ">&lt;</span> <span style="line-height: 18px; ">100</span><span style="line-height: 18px; ">; i</span><span style="line-height: 18px; ">++</span><span style="line-height: 18px; ">) {        s </span><span style="line-height: 18px; ">+=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;      }    }  } </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">每做一次 + 就产生个stringbuilder对象，然后append后就扔掉。下次循环再到达时重新产生个stringbuilder对象，然后 append 字符串，如此循环直至结束。 如果我们直接采用 stringbuilder 对象进行 append 的话，我们可以节省 n - 1 次创建和销毁对象的时间。所以对于在循环中要进行字符串连接的应用，一般都是用stringbuffer或stringbulider对象来进行append操作。</span><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><strong style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">string对象的intern方法理解和分析：</strong><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><dl style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 718px; overflow-x: auto; overflow-y: auto; font-size: 12px; font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; "><dt style="background-color: #f5f5f5; height: 24px; line-height: 24px; font-weight: bold; text-indent: 6px; color: #333333; ">Java code</dt><dd style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><pre><div><span style="line-height: 18px; "> </span><span style="line-height: 18px; color: #0000ff; ">public</span> <span style="line-height: 18px; color: #0000ff; ">class</span><span style="line-height: 18px; "> test4 {    </span><span style="line-height: 18px; color: #0000ff; ">private</span> <span style="line-height: 18px; color: #0000ff; ">static</span><span style="line-height: 18px; "> String a </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">ab</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;     </span><span style="line-height: 18px; color: #0000ff; ">public</span> <span style="line-height: 18px; color: #0000ff; ">static</span> <span style="line-height: 18px; color: #0000ff; ">void</span><span style="line-height: 18px; "> main (String[] args){      String s1 </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">a</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;      String s2 </span><span style="line-height: 18px; ">=</span> <span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">b</span><span style="line-height: 18px; ">"</span><span style="line-height: 18px; ">;      String s </span><span style="line-height: 18px; ">=</span><span style="line-height: 18px; "> s1 </span><span style="line-height: 18px; ">+</span><span style="line-height: 18px; "> s2;      System.out.println(s </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> a);</span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">false </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">    System.out.println(s.intern() </span><span style="line-height: 18px; ">==</span><span style="line-height: 18px; "> a);</span><span style="line-height: 18px; color: #008000; ">//</span><span style="line-height: 18px; color: #008000; ">true   </span><span style="line-height: 18px; color: #008000; "> </span><span style="line-height: 18px; ">  }  } </span></div> </pre></dd></dl><br style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; " /><span style="font-family: simsun; line-height: 23px; text-align: left; background-color: #ffffff; ">这里用到java里面是一个常量池的问题。对于s1+s2操作，其实是在堆里面重新创建了一个新的对象,s保存的是这个新对象在堆空间的的内容，所以s与a的值是不相等的。而当调用s.intern()方法，却可以返回s在常量池中的地址值，因为a的值存储在常量池中，故s.intern和a的值相等。<br /><br /></span><div><a href="http://topic.csdn.net/u/20081231/13/4c342bec-5afd-4ab7-bce7-4b7b98cabbc2.html">http://topic.csdn.net/u/20081231/13/4c342bec-5afd-4ab7-bce7-4b7b98cabbc2.html</a></div></div><img src ="http://www.blogjava.net/dongond/aggbug/370531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2012-02-22 17:26 <a href="http://www.blogjava.net/dongond/archive/2012/02/22/370531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>about BigDecimal</title><link>http://www.blogjava.net/dongond/archive/2012/02/15/370036.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Wed, 15 Feb 2012 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2012/02/15/370036.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/370036.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2012/02/15/370036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/370036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/370036.html</trackback:ping><description><![CDATA[在java中做大数运算时要用到BigDecimal类。<br />何谓大数？<br />&nbsp;&nbsp;&nbsp;&nbsp;单精度浮点数：float--32位（4字节）--有效数字7位；<br />&nbsp;&nbsp;&nbsp;&nbsp;双精度浮点数：double--64位（8字节）--有效数字16位；<br />&nbsp;&nbsp;&nbsp;&nbsp;超过double表示范围的，一律用BigDecimal。<br />关于BigDecimal的构造，需要从String构造，切记不可由double构造<br />&nbsp; &nbsp; 即不可用 new BigDecimal(double var) [X]<br />&nbsp; &nbsp; 而是通过 new BigDecimal(String var)<br />&nbsp; &nbsp; 原因参考<a href="http://hi.baidu.com/waiting__for__you/blog/item/967206ec863751d3b21cb170.html">http://hi.baidu.com/waiting__for__you/blog/item/967206ec863751d3b21cb170.html<br /></a>【<br />&nbsp; &nbsp;&nbsp;<span style="color: #88b03f; font-family: Arial; font-size: 12px; line-height: normal; text-indent: 29px; background-color: #e6e9d8; ">BigDecimal(double)是把一个double类型十进制数构造为一个BigDecimal对象实例。</span><div><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">BigDecimal(String)是把一个以String表示的BigDecimal对象构造为BigDecimal对象实例。</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">习惯上，对于浮点数我们都会定义为double或float，但BigDecimal API文档中对于BigDecimal(double)有这么一段话：</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "><span style="font-size: 9pt; color: red; ">Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .10000000000000000555111512312578 27021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances notwithstanding.</span></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "><span style="font-size: 9pt; color: red; ">The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one</span></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "><span style="font-size: 9pt; ">下面对这段话做简单解释：</span></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "><strong><span style="font-size: 9pt; ">注意：这个构造器的结果可能会有不可预知的结果。有人可能设想</span></strong><strong><span style="font-size: 9pt; ">new BigDecimal(.1)</span></strong><strong><span style="font-size: 9pt; ">等于</span></strong><strong><span style="font-size: 9pt; ">.1</span></strong><strong><span style="font-size: 9pt; ">是正确的，但它实际上是等于</span></strong><strong><span style="font-size: 9pt; ">.1000000000000000055511151231257827021181583404541015625</span></strong><strong><span style="font-size: 9pt; ">，这就是为什么</span></strong><strong><span style="font-size: 9pt; ">.1</span></strong><strong><span style="font-size: 9pt; ">不能用一个</span></strong><strong><span style="font-size: 9pt; ">double</span></strong><strong><span style="font-size: 9pt; ">精确表示的原因，因此，这个被放进构造器中的长值并不精确的等于</span></strong><strong><span style="font-size: 9pt; ">.1</span></strong><strong><span style="font-size: 9pt; ">，尽管外观看起来是相等的。</span></strong></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; "><strong><span style="font-size: 9pt; ">然而（</span></strong><strong><span style="font-size: 9pt; ">String</span></strong><strong><span style="font-size: 9pt; ">）构造器，则完全可预知的，</span></strong><strong><span style="font-size: 9pt; ">new BigDecimal(&#8220;.1&#8221;)</span></strong><strong><span style="font-size: 9pt; ">如同期望的那样精确的等于</span></strong><strong><span style="font-size: 9pt; ">.1</span></strong><strong><span style="font-size: 9pt; ">，因此，（</span></strong><strong><span style="font-size: 9pt; ">String</span></strong><strong><span style="font-size: 9pt; ">）构造器是被优先推荐使用的。</span></strong></p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">看下面的结果：</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(new BigDecimal(123456789.02).toString());</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(new BigDecimal("123456789.02").toString());</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">输出为：</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21.75pt; ">123456789.01999999582767486572265625</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21.75pt; ">123456789.02</p><p style="line-height: normal; color: #88b03f; font-family: Arial; font-size: 12px; background-color: #e6e9d8; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21.75pt; ">现在我们知道，如果需要精确计算，非要用String来够造BigDecimal不可！</p></div>】<br /><br /><br /><br />&nbsp;<br /><br /><img src ="http://www.blogjava.net/dongond/aggbug/370036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2012-02-15 16:50 <a href="http://www.blogjava.net/dongond/archive/2012/02/15/370036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>人要学会调整自己，不能任由自己的脾气怎样。其实就是一个不断遇到问题，不断调试的过程，走过这个过程，你就会进步</title><link>http://www.blogjava.net/dongond/archive/2010/09/23/332684.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Thu, 23 Sep 2010 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/09/23/332684.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/332684.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/09/23/332684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/332684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/332684.html</trackback:ping><description><![CDATA[:)
<img src ="http://www.blogjava.net/dongond/aggbug/332684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-09-23 13:55 <a href="http://www.blogjava.net/dongond/archive/2010/09/23/332684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存不足 java.lang.OutOfMemoryError: Java heap space</title><link>http://www.blogjava.net/dongond/archive/2010/09/23/332679.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Thu, 23 Sep 2010 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/09/23/332679.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/332679.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/09/23/332679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/332679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/332679.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/dongond/archive/2010/09/23/332679.html'>阅读全文</a><img src ="http://www.blogjava.net/dongond/aggbug/332679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-09-23 12:45 <a href="http://www.blogjava.net/dongond/archive/2010/09/23/332679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>男人，最大的魅力来自于内心深处的一种自信！</title><link>http://www.blogjava.net/dongond/archive/2010/05/06/320243.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Thu, 06 May 2010 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/05/06/320243.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/320243.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/05/06/320243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/320243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/320243.html</trackback:ping><description><![CDATA[<!---------
<p>写给自己点什么？</p>
<p>现在认识到感情这玩意儿的威力了吧？</p>
<p>明知自己没资本，没能力，为何还要玩这本来玩不起的游戏？</p>
<p>现在傻眼了？你坐的住么？你想的开么？你还有能力继续你的大学理想么？</p>
<p>你还是放不下，你急躁，你无所适从，你越是急切越是表现得没底气，没思路</p>
<p>你颓废多长时间了？你还想饿几顿饭？你还自欺欺人的幻想到什么时候？你他妈活得还是个人样么？</p>
<p>这有什么受不了的？多大的压力你没承受过？</p>
<p>一个女生的疏离就把你击垮成这样子了？</p>
<p>你还认为自己稳重？还认为自己处事冷静？还认为自己能面对场面不急不慌自信应对吗？</p>
<p>感情这点破事儿一来，你自信跑哪去了？冷静跑哪儿去了？</p>
<p>你压根就不是谈恋爱的种！</p>
<p>你说你没经验，没经验你跑来谈什么谈？你冲动？</p>
<p>你倒挺实在的投入进来了，人家受伤退了你现在咋办？傻了吧？迷惘了吧？还退的回去么？</p>
<p>不觉得窝囊么？</p>
<p>曾经的你是这样子么？</p>
<p>你不是保持高傲着么？你不是看不惯某些人喧嚣浮躁的生活，看不惯某些人爱看热闹爱活在别人的世界里么？</p>
<p>你不是憧憬着一份充满默契、充满理解、彼此鼓励的爱情么？</p>
<p>你不是最不想让别人把自己当小丑看了么？</p>
<p>你不是最看不惯一个男人把嘴巴涂的甜甜的去博取嬉笑么？</p>
<p>你不是最看不起一个男人没真材实料，用言笑掩饰空虚的么？</p>
<p>而你现在又在做什么呢？</p>
<p>你尝试着学会这些，因为你发现没这些东西你无法在感情这个世界里获得捷径</p>
<p>算了吧，你做不出来，你坚持不下来</p>
<p>你天真的认为彼此都会自然而然的理解并走到一起？？</p>
<p>但是她一定感受的到么？她一定能顶住这份压力，忍耐你的节奏么？？</p>
<p>你这个傻子，谁都不是你想象中的那么一致？谁都不能抗住太多感情带来的压力？</p>
<p>你把一切都想的那么自然，一切都想象的那么美好，到头来，把所有人都害了</p>
<p>你有些自私了</p>
<p>你缺乏男子汉的气概</p>
<p>感情也一样，拿的起来，也得放的下</p>
<p>觉得放不下，就应该想办法挽回</p>
<p>一味儿的自我反省和纠结，有什么用？</p>
<p>感情要强势</p>
<p>感情需要承担责任</p>
<p>感情不能只依靠心理，该有付出有付出，该有行动有行动</p>
<p>你明白吗？</p>
<p>你不该过分的自责，给堕落找借口</p>
<p>你不是没有主动过</p>
<p>你不是没创造过机会</p>
<p>哪怕你们能成功一次？</p>
<p>你们的心就会彻底放开</p>
<p>随缘？随缘吧，相信缘分天注定，谁让你们不能在一起</p>
<p>也许人家不舍得为你牺牲那么多</p>
<p>也许人家根本就不喜欢你</p>
<p>也许</p>
<p>人家真的有原因</p>
<p><br />
你为何就不能痛快一点？给自己一个明确的答复</p>
<p>下决心对自己狠一点，对别人狠一点</p>
<p>你是个男人</p>
<p>不好低下头向别人倾诉</p>
<p>那就痛快的咽下去</p>
<p>能争取就尽力争取，给自己一个理由，给彼此一个交代</p>
<p><br />
你不能着急</p>
<p>你得冷静，真的要冷静</p>
<p>这不是你生活的全部，它不能占你全部的时间</p>
<p>尽量不去多想</p>
<p>给她一段时间</p>
<p>让她缓冲，让她心静</p>
<p>你觉得像个小丑一样去打扰她，是她希望看到的么？</p>
<p>她不会觉得烦么？有必要么？</p>
<p>不论最终结果如何</p>
<p>要亲耳听到她的心思，她的想法</p>
<p>继续，你要更加珍惜</p>
<p>分开，你需要让彼此坦开一切</p>
<p>男人，最后要给自己一个清晰的交代</p>
<p><br />
这叫爱吗？</p>
<p>应该算是了吧</p>
<p>你在爱着她</p>
<p>不管她怎么想</p>
<p>当作她只是一时的撒娇生气吧</p>
<p>等她</p>
<p>冷静的等她</p>
<p>如果接受，放开你的全部，像个男人的样，给她幸福</p>
<p>如果离开，做到彼此的坦诚，祝福她</p>
<p>不管怎样</p>
<p>这些天要对自己自私！</p>
<p>好好面对生活</p>
<p>不能消极堕落</p>
<p>千万不能！<br />
</p>
-------->
<img src ="http://www.blogjava.net/dongond/aggbug/320243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-05-06 23:56 <a href="http://www.blogjava.net/dongond/archive/2010/05/06/320243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不错的一首小诗</title><link>http://www.blogjava.net/dongond/archive/2010/05/04/320042.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Tue, 04 May 2010 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/05/04/320042.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/320042.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/05/04/320042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/320042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/320042.html</trackback:ping><description><![CDATA[<p align="center">&nbsp;热爱生命<br />
我不去想是否能够成功<br />
既然选择了远方<br />
便只顾风雨兼程 </p>
<p align="center">我不去想能否赢得爱情<br />
既然钟情于玫瑰<br />
就勇敢地吐露真诚</p>
<p align="center">我不去想身后会不会袭来寒风冷雨<br />
既然目标是地平线<br />
留给世界的只能是背影</p>
<p align="center">我不去想未来是平坦还是泥泞<br />
只要热爱生命<br />
一切，都在意料之中 <br />
</p>
  <img src ="http://www.blogjava.net/dongond/aggbug/320042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-05-04 14:12 <a href="http://www.blogjava.net/dongond/archive/2010/05/04/320042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于GridBagLayout网络上一篇很好的文章</title><link>http://www.blogjava.net/dongond/archive/2010/05/01/319864.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Sat, 01 May 2010 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/05/01/319864.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/319864.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/05/01/319864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/319864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/319864.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/dongond/archive/2010/05/01/319864.html'>阅读全文</a><img src ="http://www.blogjava.net/dongond/aggbug/319864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-05-01 22:26 <a href="http://www.blogjava.net/dongond/archive/2010/05/01/319864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于有模式和无模式对话框</title><link>http://www.blogjava.net/dongond/archive/2010/04/07/317661.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Wed, 07 Apr 2010 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/04/07/317661.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/317661.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/04/07/317661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/317661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/317661.html</trackback:ping><description><![CDATA[做GUI用到对话框，上网查了下解释，有篇文章是对着MFC来的，说的挺好，转过来~~<br />
<br />
非模态对话框与模态对话框相比有下列不同之处：&nbsp;<br />
非模态对话框的模板必须具有Visible风格，否则对话框将不可见，而模态对话框则无需&nbsp;<br />
设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框，而不管&nbsp;<br />
对话框是否具有Visible风格。&nbsp;<br />
非模态对话框对象是用new操作符在堆中动态创建的，而不是以成员变量的形式嵌入到别&nbsp;<br />
的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一&nbsp;<br />
个指向对话框类的指针成员变量，通过该指针可访问对话框对象。&nbsp;<br />
通过调用CDialog::Create函数来启动对话框，而不是CDialog::DoModal，这是模态对话&nbsp;<br />
框的关键所在。由于Create函数不会启动新的消息循环，对话框与应用程序共用同一个&nbsp;<br />
消息循环，这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回，&nbsp;<br />
而DoModal是在对话框被关闭后才返回的。众所周知，在MFC程序中，窗口对象的生存期&nbsp;<br />
应长于对应的窗口，也就是说，不能在未关闭屏幕上窗口的情况下先把对应的窗口对象&nbsp;<br />
删除掉。由于在Create返回后，不能确定对话框是否已关闭，这样也就无法确定对话框&nbsp;<br />
对象的生存期，因此只好在堆中构建对话框对象，而不能以局部变量的形式来构建之。&nbsp;<br />
&nbsp;<br />
必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用C&nbsp;<br />
Wnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog&nbsp;<br />
&#8758;<em>:OnCancel函数均调用EndDialog，故程序员必须编写自己的OnOK和OnCancel函数并且在&nbsp;</em><br />
函数中调用DestroyWindow来关闭对话框。&nbsp;<br />
因为是用new操作符构建非模态对话框对象，因此必须在对话框关闭后，用delete操作符&nbsp;<br />
删除对话框对象。在屏幕上一个窗口被删除后，框架会调用CWnd::PostNcDestroy，这是&nbsp;<br />
一个虚拟函数，程序可以在该函数中完成删除窗口对象的工作，具体代码如下&nbsp;<br />
void&nbsp;CModelessDialog::PostNcDestroy&nbsp;<br />
{&nbsp;<br />
delete&nbsp;this;&nbsp;//删除对象本身&nbsp;<br />
}&nbsp;<br />
这样，在删除屏幕上的对话框后，对话框对象将被自动删除。拥有者对象就不必显式的&nbsp;<br />
调用delete来删除对话框对象了。&nbsp;<br />
必须有一个标志表明非模态对话框是否是打开的。这样做的原因是用户有可能在打开一&nbsp;<br />
个模态对话框的情况下，又一次选择打开命令。程序根据标志来决定是打开一个新的对&nbsp;<br />
话框，还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象&nbsp;<br />
的指针作为这种标志，当对话框关闭时，给该指针赋NULL值，以表明对话框对象已不存&nbsp;<br />
在了。 <br />
<img src ="http://www.blogjava.net/dongond/aggbug/317661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-04-07 20:25 <a href="http://www.blogjava.net/dongond/archive/2010/04/07/317661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）从File类开始java IO 系统介绍</title><link>http://www.blogjava.net/dongond/archive/2010/03/30/316883.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Mon, 29 Mar 2010 17:03:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/03/30/316883.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/316883.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/03/30/316883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/316883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/316883.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 无论学习那种语言都难免要接触到文件系统，要经常和文件打交道。Java当然也不例外，有些网友觉得IO的设计很烦琐，有的时候我也有这样的感觉，其实用的熟练了，倒是觉得这个东西还是挺方便的。在介绍Java IO之前首先介绍一下非常重要的一个类File。&nbsp;&nbsp;<a href='http://www.blogjava.net/dongond/archive/2010/03/30/316883.html'>阅读全文</a><img src ="http://www.blogjava.net/dongond/aggbug/316883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-03-30 01:03 <a href="http://www.blogjava.net/dongond/archive/2010/03/30/316883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享一个JTree实现资源管理器的程序代码</title><link>http://www.blogjava.net/dongond/archive/2010/03/30/316882.html</link><dc:creator>轻帆向南</dc:creator><author>轻帆向南</author><pubDate>Mon, 29 Mar 2010 16:58:00 GMT</pubDate><guid>http://www.blogjava.net/dongond/archive/2010/03/30/316882.html</guid><wfw:comment>http://www.blogjava.net/dongond/comments/316882.html</wfw:comment><comments>http://www.blogjava.net/dongond/archive/2010/03/30/316882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dongond/comments/commentRss/316882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dongond/services/trackbacks/316882.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 做东西的时候需要实现资源管理器树形目录。正好在网上搜到这么个源代码，当边用边学习了 :)&nbsp;&nbsp;1import&nbsp;java.awt.*;&nbsp;&nbsp;2import&nbsp;java.awt.event.*;&nbsp;&nbsp;3import&nbsp;java.io.*;&nbsp;&nbsp;4import&nbsp;java.uti...&nbsp;&nbsp;<a href='http://www.blogjava.net/dongond/archive/2010/03/30/316882.html'>阅读全文</a><img src ="http://www.blogjava.net/dongond/aggbug/316882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dongond/" target="_blank">轻帆向南</a> 2010-03-30 00:58 <a href="http://www.blogjava.net/dongond/archive/2010/03/30/316882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>