??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲Av无码精品色午夜,亚洲av日韩av无码,在线亚洲人成电影网站色wwwhttp://www.tkk7.com/kangdy/category/47814.html我就像AK47里打出去的子式V目标TMD永远在前斏V我只能TMD拼命向前?/description>zh-cnFri, 25 Nov 2011 09:21:12 GMTFri, 25 Nov 2011 09:21:12 GMT60JAXB向Xml非根节点d一个或多个属?/title><link>http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 23 Nov 2011 06:33:00 GMT</pubDate><guid>http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html</guid><wfw:comment>http://www.tkk7.com/kangdy/comments/364635.html</wfw:comment><comments>http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kangdy/comments/commentRss/364635.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kangdy/services/trackbacks/364635.html</trackback:ping><description><![CDATA[JAXB 向Xml非根节点d一个或多个属性,直接上代码,关于JAXB的相x解可查阅JAVA API?br /><br /><span style="color: red;">原创文章Q{载请注明出处?/span><a href="http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html">http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html</a><br /><br />code1: colorsc?nbsp; 根节?br /><fieldset><legend>code1</legend><div>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlElement;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "Colors")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Colors {<br />    <br />    @XmlElement(name = "red",nillable=true)<br />    private Red red;<br />    <br />    @XmlElement(name = "blue",nillable=true)<br />    private Blue blue;<br /><br />    public Red getRed() {<br />        return red;<br />    }<br /><br />    public Blue getBlue() {<br />        return blue;<br />    }<br /><br />    public void setRed(Red red) {<br />        this.red = red;<br />    }<br /><br />    public void setBlue(Blue blue) {<br />        this.blue = blue;<br />    }<br />}</div></fieldset><br />code2:  Redc?nbsp; 子节?br /><fieldset><legend>code2</legend>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlAttribute;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "red")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Red {<br />    <br />    private String value;<br />    <br />    @XmlAttribute(name = "att1")<br />    private String att;<br />    <br />    public String getValue() {<br />        return value;<br />    }<br />    <br />    public void setValue(String value) {<br />        this.value = value;<br />    }<br /><br />    public String getAtt() {<br />        return att;<br />    }<br /><br />    public void setAtt(String att) {<br />        this.att = att;<br />    }<br />    <br />}<br /><br /></fieldset><br />code3:  c?Blue 子节?br /><fieldset><legend>code3</legend><div>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlAttribute;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "blue")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Blue {<br />    private String value;<br />    <br />    @XmlAttribute(name = "att2")<br />    private String att2;<br />    <br />    @XmlAttribute(name = "att1")<br />    private String att;<br />    <br />    public String getAtt() {<br />        return att;<br />    }<br /><br />    public void setAtt(String att) {<br />        this.att = att;<br />    }<br /><br />    public String getValue() {<br />        return value;<br />    }<br /><br />    public void setValue(String value) {<br />        this.value = value;<br />    }<br /><br />    public String getAtt2() {<br />        return att2;<br />    }<br /><br />    public void setAtt2(String att2) {<br />        this.att2 = att2;<br />    }<br />}</div></fieldset><br />code4: mainc?br /><fieldset><legend>code4</legend><div>package com.kangdy.test;<br /><br />import java.io.StringWriter;<br /><br />import javax.xml.bind.JAXBContext;<br />import javax.xml.bind.Marshaller;<br /><br />public class Jaxbtest {<br />    public static void main(String[] args) throws Exception {<br /><br />        StringWriter writer = new StringWriter();<br />        JAXBContext jc = JAXBContext.newInstance(Colors.class);<br />        Marshaller ma = jc.createMarshaller();<br />        ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);<br />        <br />        Colors colors = new Colors();<br />        Red red = new Red();<br />        red.setAtt("att-red");<br />        red.setValue("red");<br />        Blue blue = new Blue();<br />        blue.setValue("blue");<br />        blue.setAtt("att-blue");<br />        blue.setAtt2("blue-att2");<br />        colors.setRed(red);<br />        colors.setBlue(blue);<br />        <br />        ma.marshal(colors, writer);<br />        System.out.println(writer.toString());<br /><br />    }<br />}</div></fieldset><br />q行l果Q?br /><fieldset><legend>l果</legend><div><?xml version="1.0" encoding="UTF-8" standalone="yes"?><br /><Colors><br />    <red att1="att-red"><br />        <value>red</value><br />    </red><br />    <blue att1="att-blue" att2="blue-att2"><br />        <value>blue</value><br />    </blue><br /></Colors></div></fieldset><img src ="http://www.tkk7.com/kangdy/aggbug/364635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kangdy/" target="_blank">AK47</a> 2011-11-23 14:33 <a href="http://www.tkk7.com/kangdy/archive/2011/11/23/364635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重新认识Java finallyhttp://www.tkk7.com/kangdy/archive/2011/11/01/362456.htmlAK47AK47Tue, 01 Nov 2011 08:56:00 GMThttp://www.tkk7.com/kangdy/archive/2011/11/01/362456.htmlhttp://www.tkk7.com/kangdy/comments/362456.htmlhttp://www.tkk7.com/kangdy/archive/2011/11/01/362456.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/362456.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/362456.html以下是{贴内容:

1 . JAVA finally字句的异怸失和q回D盖解?/strong>
原帖地址 Q?br />http://blog.csdn.net/sureyonder/article/details/5560538
转脓(chung)
Java虚拟机在每个try语句块和与其相关的catch子句的结?处都?#8220;调用”finally子句的子例程。实际上Qfinally子句在方法内部的表现很象“微型子例E?#8221;。finally子句正常l束后-指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行return、continue、break{情况,隶属于这个finally子句的微型子例程执行“q回”操作。程序在W一ơ调用微型子例程的地方l执行后面的语句?br />
finally“微型子例E?#8221;不等同于Ҏ(gu)函数的调用,finally子句都是在同一个栈内执行的Q微型子例程?#8220;q回”操作也不会涉及到Ҏ(gu)退栈,仅仅是ɽE序计数器pc跌{到同一个方法的一个不同的位置l箋执行?br />一 异常丢失
    public static void exceptionLost()  
     {  
       try  
       {  
         try  
         {  
           throw new Exception( "exception in try" );  
         }  
         finally  
         {  
           throw new Exception( "exception in finally" );  
         }  
       }  
       catch( Exception e )  
       {  
         System.out.println( e );  
       }  
     }  

exceptionLost()的输出结果是“exception in finally”Q而不是try块中抛出的异常,q是JAVA异常机制的一个瑕疵-异常丢失?br />
在字节码中,throw语句不是原子性操作。在较老的JDK中,exceptionLost()中try块的throw语句分解为几步操作:
1) 把Exception("exception in try")对象引用存储C个局部变量中
  astore_2  // pop the reference to the thrown exception, store into local variable 2
2) 调用finally微型子程?br />3) 把局部变量中的Exception("exception in try")对象引用push到操作数栈顶Q然后抛出异?br />  aload_2  // push the reference to the thrown exception from local variable 2

  athrow   // throw the exception

如果finally通过break、return、continueQ或者抛出异常而退出,那么上面的第Q步׃会执行?br />
在JDK1.6中,通过字节码我们可以看刎ͼfinally子句作ؓ一U特D的catch来实现的Q下面是exceptionLost()Ҏ(gu)的异常表Q?br />
Exception tableQ?br />  from   to   target  type
   0     10    10     any
 0     21    21     Class java/lang/Exception

finally可以捕获?行到9行之间抛出的Mcd(any)的异常,q新抛出捕L异常Q或者抛Z个自己构造的新异常,q个新异常就会覆盖try语句块中的异常?br />二 q回D?br />
    public static int getValue()  
     {  
       int value = 0;  
         
       try  
       {  
         value = 100;  
           
         return value;  
       }  
       finally  
       {  
         value = 200;  
       }  
     }  

q个Ҏ(gu)的返回值是100q是200?l果?00?br />在字节码中,return语句不是原子性操作,它会把getValue()中的return语句分解为几步操作:
1) 把value值存储到一个局部变?q里命名为temp)中:
   iload_0   // push local variable 0 - the 100
   istore_2   //  pop an int (the 100), store into local varaible 2
2) 调用finally微型子程?br />3) 把局部变?指temp)的值push到操作数栈顶Q然后返回到调用Ҏ(gu)
     iload_2  // push local varaible 2 - the 100
   ireturn      // return int on top of the stack - the 100: return 100

׃return语句在返回之前会把返回g存到一个时的局部变量中Q所以在finally子句内对value重新赋g会媄响返回倹{?br />
了解finally子句内在的一些知识,我们能够了解finally能够做什么和不能够做什么,q样会帮助我们正用finally子句?/div>

2 . 关于 Java ?finally 语句块的深度辨析
原帖地址 Q?a href=" http://www.ibm.com/developerworks/cn/java/j-lo-finally/index.html?ca=drs-">
http://www.ibm.com/developerworks/cn/java/j-lo-finally/index.html?ca=drs-
转脓(chung)
关于 Java 虚拟机是如何~译 finally 语句块的问题Q有兴趣的读者可以参?span style="color: #008000;">?The JavaTM Virtual Machine Specification, Second Edition 》中 7.13 ?Compiling finally。那里详l介l了 Java 虚拟机是如何~译 finally 语句块。实际上QJava 虚拟Z?finally 语句块作?subroutineQ对于这?subroutine 不知该如何翻译ؓ好,q脆׃译了,免得产生歧义和误解。)直接插入?try 语句块或?catch 语句块的控制转移语句之前。但是,q有另外一个不可忽视的因素Q那是在执?subroutineQ也是 finally 语句块)之前Qtry 或?catch 语句块会保留其返回值到本地变量表(Local Variable TableQ中。待 subroutine 执行完毕之后Q再恢复保留的返回值到操作数栈中,然后通过 return 或?throw 语句其q回l该Ҏ(gu)的调用者(invokerQ?/span>h意,前文中我们曾l提到过 return、throw ?break、continue 的区别,对于q条规则Q保留返回|Q只适用?return ?throw 语句Q不适用?break ?continue 语句Q因为它们根本就没有q回倹{?/span>


AK47 2011-11-01 16:56 发表评论
]]>
(转脓(chung))BigInteger ?BigDecimal http://www.tkk7.com/kangdy/archive/2010/12/10/340257.htmlAK47AK47Fri, 10 Dec 2010 06:16:00 GMThttp://www.tkk7.com/kangdy/archive/2010/12/10/340257.htmlhttp://www.tkk7.com/kangdy/comments/340257.htmlhttp://www.tkk7.com/kangdy/archive/2010/12/10/340257.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/340257.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/340257.html高精度数?/strong>
Java 提供了两个类专门用于q行高精度运BigInteger ?BigDecimal Q尽它们可大致划分C装器相同的cd里,但两者都没有对应的主cdQ这两个c都有自q一pdҎ(gu)Q类g我们针对ȝ型执行的操作Q也是说能?int 或float 做的事情Q用BigInteger和BigDecimal 一样可以做Q只是必L用方法调用,而不是用运符。此外由于牵涉更多,所以运速度会慢一Ҏ(gu)M我们牺牲了速度Q但换来了精度?/p>

高精度QҎ(gu)BigDecimal

一些非整数|如几元和几分q样的小敎ͼ需要很_。QҎ(gu)不是_|所以用它们会D舍入误差。因此,使用点数来试图表示象货币量q样的精数量不是一个好的想法。用QҎ(gu)来进行美元和分计算会得到灾难性的后果。QҎ(gu)最好用来表C量DcL|q类g一开始就不怎么_?br />     ?JDK 1.3 PJava 开发h员就有了另一U数DC法来表C非整数QBigDecimal。BigDecimal 是标准的c,在编译器中不需要特D支持,它可以表CZQ意精度的数Qƈ对它们进行计。在内部Q可以用L_ֺM范围的值和一个换因子来表示 BigDecimalQ换因子表C左Ud数点多少位,从而得到所期望范围内的倹{因此,?BigDecimal 表示的数的Ş式ؓ unscaledValue*10-scale?br /> 用于加、减、乘和除的方法给  BigDecimal 值提供了术q算。由?BigDecimal 对象是不可变的,q些Ҏ(gu)中的每一个都会生新?BigDecimal 对象。因此,因ؓ创徏对象的开销QBigDecimal 不适合于大量的数学计算Q但设计它的目的是用来精地表示数。如果?zhn)正在L一U能_表示如货币量q样的数|?BigDecimal 可以很好地胜任该d?br /> 如Q点类型一PBigDecimal 也有一些o人奇怪的行ؓ。尤其在使用 equals() Ҏ(gu)来检数g间是否相{时要小心。equals() Ҏ(gu)认ؓQ两个表C同一个数但换g同(例如Q?00.00 ?nbsp; 100.000Q的 BigDecimal 值是不相{的。然而,compareTo() Ҏ(gu)会认两个数是相等的,所以在从数g比较两个  BigDecimal 值时Q应该?compareTo() 而不?equals()?br /> 另外q有一些情形,L_ֺ的小数运仍不能表示_l果。例如,1 除以 9 会生无限@环的数 .111111...。出于这个原因,在进行除法运时QBigDecimal 可以让?zhn)昑ּ地控制舍入。movePointLeft() Ҏ(gu)支持 10 的幂ơ方的精除法?br /> 对于 BigDecimalQ有几个可用的构造函数。其中一个构造函C双精度QҎ(gu)作ؓ输入Q另一个以整数和换因子作入,q有一个以数?String 表示作ؓ输入。要心使用  BigDecimal(double) 构造函敎ͼ 因ؓ如果不了解它Q会在计过E中产生舍入误差。请使用Z整数?String 的构造函数?br /> 如果使用 BigDecimal(double) 构造函C恰当Q在传递给 JDBC setBigDecimal() Ҏ(gu)Ӟ会造成g很奇怪的 JDBC 驱动E序中的异常。例如,考虑以下 JDBC 代码Q该代码希望数?0.01 存储到小数字D:
  PreparedStatement ps =connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
  ps.setString(1, "penny");
  ps.setBigDecimal(2, new BigDecimal(0.01));
  ps.executeUpdate();
     在执行这D似乎无害的代码时会抛出一些o惑不解的异常Q这取决于具体的 JDBC 驱动E序Q,因ؓ 0.01 的双_ֺq似gD大的换算|q可能会?JDBC 驱动E序或数据库感到qh。JDBC 驱动E序会生异常,但可能不会说明代码实际上错在哪里Q除非意识到二进制QҎ(gu)的局限性。相反,使用 BigDecimal("0.01") ?BigDecimal(1, 2) 构?BigDecimal 来避免这c问题, 因ؓq两U方法都可以_地表C小数?br />  

code :

import java.math.BigDecimal;
/** * *
* <p>Title: 开?开?lt;/p>
* * <p>Description: opeansource</p>
* * <p>Copyright: Copyright (c) 2004</p>
* * <p>Company: ?h</p>
* * @author HaiTang Ming
* * @version 1.0 */
public class BigDecimalUtil { 
//默认除法q算_ֺ,及即保留数点多位 
private static final int DEF_DIV_SCALE = 2; 
//q个cM能实例化 
private BigDecimalUtil (){   } 
/**   
  * * 提供_的加法运?nbsp;  
  * * @param v1 被加?nbsp;  
  * * @param v2 加数   
  * * @return 两个参数的和   
  * */ 
public static double add(double v1,double v2){   
  BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  return (b1.add(b2)).doubleValue(); 

/**

  *提供_的减法运?nbsp;
  * * @param v1 被减?nbsp;
  * * @param v2 减数 
  * * @return 两个参数的差
  **/ 
public static double sub(double v1,double v2){   
  BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  return (b1.subtract(b2)).doubleValue(); 

/**   
  * * 提供_的乘法运?nbsp;  
  * * @param v1 被乘?nbsp;  
  * * @param v2 乘数   
  * * @return 两个参数的积   
  * */
public static double mul(double v1,double v2){   
  BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  return (b1.multiply(b2)).doubleValue(); 

/**   
  * * 提供Q相对)_的除法运,当发生除不尽的情冉|Q精到   
  * * 数点以后多位Q以后的数字四舍五入?nbsp;  
  * * @param v1 被除?nbsp;  
  * * @param v2 除数   
  * * @return 两个参数的商   
  * */ 
public static double div(double v1,double v2){   
  return div(v1,v2,DEF_DIV_SCALE); 

/**   
  * * 提供Q相对)_的除法运。当发生除不的情况Ӟ由scale参数?nbsp;  
  * * 定精度,以后的数字四舍五入?nbsp;  
  * * @param v1 被除?nbsp;
  * @param v2 除数   
  * * @param scale 表示表示需要精到数点以后几位?nbsp;  
  * * @return 两个参数的商   
  * */ 
public static double div(double v1,double v2,int scale){   
  if(scale<0){     
   throw new IllegalArgumentException("The scale must be a positive integer or zero");   
  }   
  BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  return (b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)).doubleValue(); 

/**   
  * * 提供_的小C四舍五入处理?nbsp;  
  * * @param v 需要四舍五入的数字   
  * * @param scale 数点后保留几位   
  * * @return 四舍五入后的l果   
  * */ 
public static double round(double v,int scale){ 
  if(scale<0){     
   throw new IllegalArgumentException("The scale must be a positive integer or zero");
  }   
  BigDecimal b = new BigDecimal(Double.toString(v));   
  BigDecimal one = new BigDecimal("1");   
  return (b.divide(one,scale,BigDecimal.ROUND_HALF_UP)).doubleValue(); 
}   
public static void main(String[] args){   
  System.out.println(add(234.44,534.90));
 
  double a = 123.345678;   
  double d = round(a,2);   
  System.out.println("round("+a+",2)--->"+d); 
}
}

高精度整数BigInteger

BigInteger支持L_ֺ的整敎ͼ也就是说我们可精表CZQ意大的整数|同时在运过E中不会丢失M信息;
在BigIntegercM有所有的基本术q算Ҏ(gu)Q如加、减、乘、除Q以及可能会用到的位q算如或、异或、非、左UR右Uȝ。下面是一些方法的例子Q当Ӟ如果要有更多的用方法,可以查阅java api ?/p>

code :public class BigIntegerTest { 
public BigIntegerTest() {   } 
/**   
  * * 试BigInteger
  * */ 
public static void testBigInteger() {   
  BigInteger bi = new BigInteger("888");   
  //multiply :乘法   
  BigInteger result = bi.multiply(new BigInteger("2"));   
  System.out.println(result);   
  //divide : 除法   
  result = bi.divide(new BigInteger("2"));   
  System.out.println(result);   
  //add : 加法   
  result = bi.add(new BigInteger("232"));   
  System.out.println(result);   
  //subtract :减法   
  result = bi.subtract(new BigInteger("23122"));   
  System.out.println(result);   
  result = bi.shiftRight(2);   
  System.out.println(result); 
}   
public static void main(String[] args) {   
  testBigInteger(); 
}
}
原脓(chung)地址Q?/font>http://dev.firnow.com/course/3_program/java/javaxl/2008914 /142796_2.html

AK47 2010-12-10 14:16 发表评论
]]>
(转脓(chung)) 大整数相加Q超q了long的范_你要怎么做!http://www.tkk7.com/kangdy/archive/2010/12/10/340256.htmlAK47AK47Fri, 10 Dec 2010 06:06:00 GMThttp://www.tkk7.com/kangdy/archive/2010/12/10/340256.htmlhttp://www.tkk7.com/kangdy/comments/340256.htmlhttp://www.tkk7.com/kangdy/archive/2010/12/10/340256.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/340256.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/340256.html 

引用Q?/legend>

 q个只能够用字符串的形式来处理了Q因机能够处理的最大是long型,本文以字W串的Ş式来q行大数据的相加,理论上只要你的内存允许,相加多大的数都可以?/p>

/**

 * 大整数相加Q?/p>

 * 题目要求Q如果系l要使用大整数Q超qlong的范_Q请你设计一个数据结构来存储q种

 * 大型数字以及设计一U算法来实现大整数的加法运?/p>

 * @author Administrator

 *

 */

public class VeryBigNumAdd {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       /*

       String a="1223232";

       for(int i=a.length()-1;i>=0;i--)

       {

           System.out.print(a.charAt(i));

       }

       */

       VeryBigNumAdd vbn=new VeryBigNumAdd();

       String a="123453243455535634535252345234677576252241234123523453664563634";

       String b="123453243455535634535252345234677576252241234123523453664563634";

       String result=vbn.doAdd(a,b);

       System.out.println("result:"+result);

    }

    /**

     *

     * @param a 加数字符?

     * @param b 加数字符?

     * @return l果字符?/p>

     * 分析Q?/span>

     * 1、取得两个字W串的长?/span>

     * 2、把两个的长度做比较Qƈ得出较长的长度,及较短的长度

     * 3、把长度较短的加数字W串Q在左面?Q之与较长的字W串一样长

     * 4、从最高位Q一个个数的取出来相加,当然首先得{换ؓ整型

     * 5、设|进位,如果两个数相加及加上q位大于{于10Qƈ且这不是最左边一个字W相加,相加l果{于

     *    Q取?Q取?Q进位)Q?0Qƈ把进位设?Q如果没有大?0Q就把进位设?Q如些@环,?/span>

     *    相加的结果以字符串的形式l合hQ就得到最后的l果

     */

    String doAdd(String a,String b)

    {

       String str="";

       int lenA=a.length();

       int lenB=b.length();

       int maxLen=(lenA>lenB) ? lenA : lenB;

       int minLen=(lenA<lenB) ? lenA : lenB;

       String strTmp="";

       for(int i=maxLen-minLen;i>0;i--)

       {

           strTmp+="0";

       }

       //把长度调整到相同

       if(maxLen==lenA)

       {

           b=strTmp+b;

       }else

           a=strTmp+a;

       int JW=0;//q位

       for(int i=maxLen-1;i>=0;i--)

       {        

           int tempA=Integer.parseInt(String.valueOf(a.charAt(i)));

           int tempB=Integer.parseInt(String.valueOf(b.charAt(i)));

           int temp;

           if(tempA+tempB+JW>=10 && i!=0)

           {

              temp=tempA+tempB+JW-10;

              JW=1;

           }

           else

           {

              temp=tempA+tempB+JW;

              JW=0;

           }        

           str=String.valueOf(temp)+str;        

       }

       return str;

    }

 

}

 

原帖地址Q?http://blog.csdn.net/fenglibing/archive/2007/08/23/1756773.aspx

    
    其实java 本n也提供了api ,java.math.BigInteger;import java.math.BigDecimal; 也可以实现?/p>

code :

package com.kangdy.test;

import java.math.BigInteger;
import java.math.BigDecimal;

public class NumberTest {
 public static void main(String args[]){
  BigInteger b1= new BigInteger("2222222222222222222222222");
  BigInteger b2= new BigInteger("8888888888888888888888888");
  BigDecimal b3 = new BigDecimal("66666666666666666666666666");
  BigDecimal b4 = new BigDecimal("9999999999999999999999999999");
  System.out.println(b1.add(b2).toString());
  System.out.println(b3.add(b4).toString());
 }
}

q里只是l出单的例子?br />




AK47 2010-12-10 14:06 发表评论
]]>
数字金额的中文大写转化http://www.tkk7.com/kangdy/archive/2010/11/02/336802.htmlAK47AK47Tue, 02 Nov 2010 06:59:00 GMThttp://www.tkk7.com/kangdy/archive/2010/11/02/336802.htmlhttp://www.tkk7.com/kangdy/comments/336802.htmlhttp://www.tkk7.com/kangdy/archive/2010/11/02/336802.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/336802.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/336802.html 当时没想那么多,仅仅惛_应该把数拆开然后d单位的一个大致的设计思\?br /> 而那个面试官一个劲儿的问我用啥法。那个题最后也没答上,回来后比较郁P
在网上搜了一下。这个答案还真不。不q觉得有一U设计还比较靠谱?br /> 大概是这P
 * 先将整数与小数部分分开Q计小数部分,角分q保?br />  * 整数部分长度不12位,前面?补?br />  * 整数部分分?部分。高4位代表亿Q中间的是万Q其余分别代表千Q百Q十Q个
 * 定一个方法拼出每一部分丌Ӏ?br />  * 最后整C数部分合成?/span>
自己实现了一下,以下是代码?br />
code :

package com.kangdy.test;
/**
 * 数字金额转化成大?br />  * 先将整数与小数部分分开Q计小数部分,角分q保?br />  * 整数部分长度不12位,前面?补?br />  * 整数部分分?部分。高4位代表亿Q中间的是万Q其余分别代表千Q百Q十Q个
 * 定一个方法拼出每一部分丌Ӏ?br />  * 最后整C数部分合成?br />  * @author dkang
 *
 */
public class NumberToString {

 String numberStr;

 public static final String unit[] = { "", "?, "?, "?, "?, "? };

 public static final String unit2[] = { "?, "?, "? };

 public static final String numStr[] = { "?, "?, "?, "?, "?, "?, "?,
   "?, "?, "? };

 /**
  * 字符串长度不?2位用0补
  *
  * @param str
  * @return
  */
 private String additionalZero(String str) {
  StringBuffer strb = new StringBuffer();
  if (str.length() < 12) {
   int size = 12 - str.length();
   for (int i = 0; i < size; i++) {
    strb.append("0");
   }
  }
  return strb.append(str).toString();
 }

 /**
  * 递归拆分数字成字W串
  *
  * @param value
  * @param strBuffer
  * @return
  */
 private String decomposeNumberToString(int value, StringBuffer strBuffer) {
  int quotient = 0;
  quotient = value / 10;
  if (quotient != 0) {
   decomposeNumberToString(quotient, strBuffer);
  }
  int remaider = value % 10;
  strBuffer.append(remaider + ",");
  return strBuffer.toString().substring(0,
    strBuffer.toString().length() - 1);
 }

 /**
  * 使用循环拆分数字成字W串
  *
  * @param value
  * @return
  */
 private String decomposeNumberToString2(int value) {
  StringBuilder strBuilder = new StringBuilder();
  int quotient = value;
  int remaider = 0;
  while (quotient != 0) {
   remaider = quotient % 10;
   strBuilder.append(remaider + ",");
   quotient = quotient / 10;
  }
  strBuilder.deleteCharAt(strBuilder.lastIndexOf(","));
  return strBuilder.reverse().toString();
 }

 /**
  * d单位
  *
  * @param temp
  * @return
  */
 private String addUnits(String temp) {
  StringBuffer sb = new StringBuffer();
  String str[] = temp.split(",");
  String tempStr = temp.replace(",", "");
  if (tempStr.contains("000")) {
   return sb.append(resplaceNumToStr(str[0]) + unit[3]).toString();
  } else if (tempStr.contains("00")) {
   if (tempStr.charAt(3) == '0') {
    return sb.append(resplaceNumToStr(str[0]) + unit[3]).append(
      resplaceNumToStr(str[1]) + unit[2]).toString();
   } else {
    return sb.append(resplaceNumToStr(str[0]) + unit[3]).append(
      numStr[0]).append(resplaceNumToStr(str[3])).toString();
   }
  } else {
   for (int i = 0; i < str.length; i++) {
    sb.append(resplaceNumToStr(str[i]));
    if (!str[i].equals("0")) {
     sb.append(unit[str.length - (i + 1)]);
    }
   }
  }
  return sb.toString();
 }

 /**
  * 数字替换
  *
  * @param str
  * @return
  */
 private String resplaceNumToStr(String str) {
  try {
   int num = Integer.parseInt(str);
   return numStr[num];
  } catch (Exception e) {
   e.printStackTrace();
  }
  return "";
 }

 /**
  * ?位长度的数字转化成字W串
  *
  * @param number
  * @param i
  * @return
  */
 private String transformNumberToString(String number, int i) {
  StringBuffer strBuffer = new StringBuffer();
  StringBuilder strBuilder = new StringBuilder();
  try {
   int num = Integer.parseInt(number);
   if (num != 0) {
    String s1 = decomposeNumberToString(num, strBuffer);
    strBuilder.append(addUnits(s1));
    if (i == 1) {
     strBuilder.append(unit[5]);
    } else if (i == 2)
     strBuilder.append(unit[4]);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return strBuilder.toString();
 }

 /**
  * 得到最l结?br />   *
  * @param str
  * @return
  */
 public String IntegrationResultString(String str) {
  StringBuffer strBuffer = new StringBuffer();
  String numStr[] = null;
  if (str.indexOf(".") != -1) {
   numStr = str.split("\\.");
  } else {
   return strBuffer.append(createIntegerPartsResult(str)).toString();
  }
  String fractionalStr = createFractionalPartsResult(numStr[1]);
  String integerStr = createIntegerPartsResult(numStr[0]);
  return strBuffer.append(integerStr).append(fractionalStr).toString();
 }

 private String createIntegerPartsResult(String integer) {
  StringBuffer strBuffer = new StringBuffer();
  String temp = additionalZero(integer);
  String str1 = temp.substring(0, 4);
  strBuffer.append(transformNumberToString(str1, 1));
  String str2 = temp.substring(4, 8);
  strBuffer.append(transformNumberToString(str2, 2));
  String str3 = temp.substring(8, temp.length());
  strBuffer.append(transformNumberToString(str3, 3) + unit2[0]);
  return strBuffer.toString();
 }

 private String createFractionalPartsResult(String fractionalStr) {
  StringBuilder strB = new StringBuilder();
  String s1 = fractionalStr.substring(0, 1);
  String s2 = fractionalStr.substring(1, fractionalStr.length());
  if (!s1.equals("0")) {
   strB.append(resplaceNumToStr(s1) + unit2[1]);
  }
  if (!s2.equals("0")) {
   strB.append(resplaceNumToStr(s2) + unit2[2]);
  }
  return strB.toString();
 }

 public static void main(String args[]) {
  NumberToString test = new NumberToString();
  String str = "200123004054.11";
  System.out.println(test.IntegrationResultString(str));
 }
}





AK47 2010-11-02 14:59 发表评论
]]>
cd对象的初始化http://www.tkk7.com/kangdy/archive/2010/07/14/326094.htmlAK47AK47Wed, 14 Jul 2010 08:18:00 GMThttp://www.tkk7.com/kangdy/archive/2010/07/14/326094.htmlhttp://www.tkk7.com/kangdy/comments/326094.htmlhttp://www.tkk7.com/kangdy/archive/2010/07/14/326094.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/326094.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/326094.htmlcȝ生命周期
Q分载,链接Q初始化
如图Q?br />


1Q装载:查找q装载类型的二进制数?br /> 2Q连接:执行验证Q准备,和解析(可选)
         a) 验证Q确保导入类型正?br />          b) 准备Qؓcd量分配内存,q将其初始化为默认?br />          c) 解析Q把cd中的W号引用转换成直接引?br /> 3Q初始化Q把cd量初始化为默认初?br />

      随着Java虚拟载了一个类Qƈ执行了一些它选择q行的验证之后,cd可以q入准备?br /> D了。在准备阶段QJava虚拟Zؓcd量分配内存,讄默认初始|但在到达初始化阶D之前,
cd量都没有被初始化为真正的初始倹{?在准备阶D|不会执行Java代码的?在准备阶D,?br /> 拟机把给cd量新分配的内存根据类型设|ؓ默认倹{?/p>

 Z准备让一个类或者接口被"首次d"使用Q最后一个步骤就是初始化Q也是为类变量      
赋予正确的初始倹{这里的”正确”初始值指的是E序员希望这个类变量所具备的v始倹{正
的初始值是和在准备阶段赋予的默认初始值对比而言的。前面说q,Ҏ(gu)cd的不同,cd
量已l被赋予了默认初始倹{而正的初始值是Ҏ(gu)E序员制定的主观计划面生成的?/p>


在Java代码中,一个正的初始值是通过cd量初始化语句或者静态初始化语句l出的?br />  1Q一个类变量初始化语句是变量声明后面的等号和表达式:
 2Q静态初始化语句是一个以static开头的E序?br />
 example : 
    public class Example1 {
     
     // cd量初始化语句
     static int value = (int) (Math.random()*6.0);
     
     // 静态初始化语句
     static{
      System.out.println("this is example");
     }
    }
所有的cd量初始化语句和类型的静态初始化器都被Java~译器收集在—vQ放到——个Ҏ(gu)
的方法中。对于类来说Q这个方法被UCcd始化Ҏ(gu)Q对于接口来_它被UCؓ接口初始?br /> Ҏ(gu)。在cd接口的Javaclass文g中,q个Ҏ(gu)被称?#8221;<clinit>”。通常的JavaE序Ҏ(gu)是无?br /> 调用q个<clinit>Ҏ(gu)的。这U方法只能被Java虚拟?/p>

clinit>()Ҏ(gu)
    前面说过QJava~译器把cd量初始化语句和静态初始化句的代码都攑ֈclass文g?br /> <clinit>()Ҏ(gu)中,序按照它们在cL者接门声明中出现的顺序?br />  example:
  public class Example1 {
    static int width;
    static int height = (int) (Math.random()*6.0);

    static{
     width = (int) (Math.random()*3.0);
    }
 }
java ~译器生成下?lt;clinit>Ҏ(gu)Q?br /> 0 invokestatic java.lang.Math.random
3 ldc2_w 6.0 (double)
6 dmul
7 d2i
8 putstatic Example1.height
11 invokestatic java.lang.Math.random
14 ldc2_w 3.0 (double) 17 dmul
18 d2i
19 putstatic Example1.width
22 return

clinit Ҏ(gu)首先执行唯一的类变量初始化语句初始化heght,然后在静态初始化语句?br /> 初始化width(虽然它声明在height之前Q但那仅仅是声明了类变量而不是类变量初始化语?.

 

除接口以外,初始化一个类之前必须保证其直接超cd被初始化Qƈ且该初始化过E是?Jvm 保证U程安全的?br /> 另外Qƈ非所有的c都会拥有一?<clinit>() Ҏ(gu)?br /> 1Q如果类没有声明Mcd量,也没有静态初始化语句Q那么它不会?lt;clinit>()Ҏ(gu)?br /> 2Q如果声明了cd量但是没有用类变量初始化语句或者静态初始化语句初始它们Q那么类不会?lt;clinit>()Ҏ(gu)?nbsp;
   example:
      public class example{
       static int val;
      }
    
3Q如果类仅包含静?final 变量的类变量初始化语句,q且cd量初始化语句是编译时帔R表达式,cM会有<clinit>()Ҏ(gu)?br />     exampleQ?br />     public class Example {
     static final String str ="abc";
     static final int value = 100;
    }
q种情况java~译器把 str ?value 被看做是帔RQjvm会直接用该cȝ帔R池或者在字节码中直接存放帔R倹{该cM会被加蝲?br />  
如果接口不包含在~译时解析成帔R的字D初始化语句Q接口中包含一?lt;clinit>()Ҏ(gu)?br /> example:
 interface Example{
  int i =5;
  int hoursOfSleep = (int) (Math.random()*3.0);
  
 }
字段hoursOfSleep会被攑֜<clinit>()Ҏ(gu)中(比较诡异Q?Q它被看作类变量?/span>Q,而字Di被看作是~译时常量特D处?JAVA语法规定Q接口中的变量默认自动隐含是public static final)?br />  java ~译器生成下?lt;clinit>Ҏ(gu)Q?br /> 0 invokestatic java.lang.Math.random
3 ldc2_w 3.0 (double)
6 dmul
7 d2i
8 putstatic Example.hoursOfSleep
11 return

d使用和被动?br />     在前面讲q,Java虚拟机在首次d使用cd时初始化它们。只?U活动被认ؓ是主动
用:
 1)创徏cȝ新实例,
 2)调用cM声明的静态方法,
 3)操作cL者接口中声明的非帔R静态字D,
 4)调用JavaAPI中特定的反射Ҏ(gu)
 5)初始化一个类的子c?
 6)以及指定一个类作ؓJava虚拟机启动时的初始化cR?br />  
   使用一个非帔R的静态字D只有当cL者接口的声明了q个字段时才是主动用、比如,
cM声明的字D可能会被子cd用;接口中声明的字段可能会被子接口或者实Cq个接口?br /> cd用。对于子cR子接口和实现接口的cL_q就是被动?使用它们q不会触?br /> 它们的初始化)。下面的例子说明了这个原理:

class NewParement{
 static int hoursOfSleep = (int) (Math.random()*3.0);
 
 static{
  System.out.println("new parement is initialized.");
 }
}

class NewbornBaby extends NewParement{
 static int hoursOfCry = (int) (Math.random()*2.0);
 
 static{
  System.out.println("new bornBaby is initialized.");
 }
}


public class Example1 {
 
 public static void main(String[] args){
  int hours = NewbornBaby.hoursOfSleep;
  System.out.println(hours);
 }
 static{
  System.out.println("example1 is initialized.");
 }
 
}
q行l果Q?
example1 is initialized.
new parement is initialized.
0
NewbornBaby 没有被初始化Q也没有被加载?br />

对象的生命周?br />
        当java虚拟机创Z个新的类实例时不明的q是隐含的,首先要在堆中Z存对象的实例变量分配内存Q包含所有在对象cM和它类?br /> 声明的变量(包括隐藏的实例变量)都要分配内存。其ơ赋默认初|最后赋予正的初始倹{?/p>

java~译器ؓ每个c都臛_生成一个实例初始化Ҏ(gu) "<init>()"与构造方法相对应?/p>

如果构造方法调用同一个类中的另一个构造方?构造方法重?Q它对应的init<>():
1)一个同cinit<>()调用?br /> 2)对应构造方法体代码的调用?br /> 如果构造方法不是通过this()调用开始,且对象不是Object 它对应的init<>():
1)一个超cinit<>()调用?br /> 2)L实例变量初始化代码调用?br /> 3)对应构造方法体代码的调用?br /> 如果上述对象是ObjectQ则LW一条。如果构造方法明用super()首先调用对应类init<>()其余不变?br /> 下面的例子详l说明了实例变量初始?摘自Java Language Specification)
class Point{
 int x,y;
 Point(){x=1;y=1;}
}
class ColoredPoint extends Point{
 int color = OxFF00FF;
}
class Test{
 public static void main(String[] args){
  ColoredPoint cp = new ColoredPoint();
  System.out.println(cp.color);
 }
}
首先Qؓ新的ColoredPoint实例分配内存I间Q以存储实例变量x,y和colorQ然后将q些变量初始化成默认?br /> 在这个例子中都是0?br /> 接下来调用无参数的ColoredPoint(),׃ColorPoint没有声明构造方法,java~译器会自动提供如下的构造方
法:ColoredPoint(){super();}?br /> 该构造方法然后调用无参数的Point(),而Point()没有昄的超c,~译器会提供一个对其无参数的构造方法的
隐式调用QPoint(){super();x=1;y=1}?br /> 因此会调用到Object();ObjectcL有超c,x递归调用会终止。接下来会调用ObjectM实例初始化语?br /> 及Q何实例变量初始化语句?br /> 接着执行Object()׃ObjectcM未声明这L构造方法。因此编译器会提供默认的构造方法object(){}?br /> 但是执行该构造方法不会生Q何媄响,然后q回?br /> 接下来执行Pointcd例变量初始化语句。当q个q程发生Ӟx,y的声明没有提供Q何初始化表达式,因此q个
步骤未采取Q何动?x,y 仍ؓ0)Q?br /> 接下来执行Point构造方法体Q将x,y赋gؓ1?br /> 接下来会执行cColoredPoint的实例变量初始化语句。把color赋?xFF00FFQ最后执行ColoredPoint构造方法体
余下的部?super()调用之后的部?Q碰巧没有Q何语句,因此不需要进一步的动作Q初始化完成?/p>

与C++不同的是Q在创徏新的cd例期_java~程语言不会为方法分z来指定变更的规则。如果调用的Ҏ(gu)在被
初始化对象的子类中重写,那么是用重写的Ҏ(gu)。甚x对象被完全初始化前也是如此。编译和q行下面的例?br /> class Super{
 Super(){printThree();}
 void printThree{System.out.println("Three");}
}
class Test extends Super{
 int three = (int)Math.PI; // That is 3
 public static void main(String args[]){
  Test t = new Test();
  t.printThree();
 }
 void printThree(){System.out.println(three);}
}
输出Q?br /> 0
3
q表明SupercM的printThree()没有被执行。而是调用的Test中的printThree()?br />

 

 
 



AK47 2010-07-14 16:18 发表评论
]]>
Java虚拟Zpȝ?/title><link>http://www.tkk7.com/kangdy/archive/2010/07/06/325357.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Tue, 06 Jul 2010 05:47:00 GMT</pubDate><guid>http://www.tkk7.com/kangdy/archive/2010/07/06/325357.html</guid><wfw:comment>http://www.tkk7.com/kangdy/comments/325357.html</wfw:comment><comments>http://www.tkk7.com/kangdy/archive/2010/07/06/325357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kangdy/comments/commentRss/325357.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kangdy/services/trackbacks/325357.html</trackback:ping><description><![CDATA[<p>Java虚拟Zpȝ?br /> <br /> <br /> <img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/kangdy/27014_1263615671XiXS.jpg" /></p> <p><strong>Ҏ(gu)?/strong><br />          在Java虚拟ZQ被装蝲cd的信息存储在一个逻辑上被UCؓҎ(gu)区的内存中?br />  当虚拟机装蝲某个cdӞ它用类装蝲器定位相应的class文gQ?->dq个class文gQ一个线性的二进制流Q?>它传入虚拟?-><br />  虚拟机提取类型信息,q将信息存入Ҏ(gu)区,<span style="color: red">cd中的c(静态)变量也存储在Ҏ(gu)?/span>.<br />  Ҏ(gu)区特点:<br />  1)所有线E共享方法区。它是线E安全的?br />  2)Ҏ(gu)区大不是固定的。虚拟机Ҏ(gu)需要自行调整?br />  3)Ҏ(gu)区可以被垃圾回收?br />  对于每个被装载的cdQ虚拟机会在Ҏ(gu)Z存储以下信息?br />  <br />  1)cd的基本信?<br />      a)cd的全限定?br />      b)cd的直接超cd限定?除非q个cd是java.lang.Objet,它没类)?br />      c)cd是类cdq是接口cd(是说是一个类q是一个接??br />      d)cd的访问修饰符(public ,abstract或final的某个子c?<br />      e)M直接接口的全限定名的有序列表?br />      <br />  2)该类型的帔R?br />    虚拟机必Mؓ每个被装载的cdl护一个常量池。常量池是该类型所用常量的一个有序集合,<br />    包括直接帔R(stringQinteger,floating point帔R)和对其他cd、字D和Ҏ(gu)的符号引用?br />    池中的数据项像数组一h通过索引讉K的。因为常量池存储了相应类型所用到的所有类型?br />    字段和方法的W号引用Q所以它在JavaE序的动态连接中L核心的作用?br />    <br />  3)字段信息<br />    cd中声明的每一个字D,Ҏ(gu)Z必须保存下面的信息,字段在类或接口中声明的顺序也必须保存?br />    字段名,字段cdQ字D修饰符(public private protected static final {?<br />    <br />  4)Ҏ(gu)信息<br />    cd中声明的每一个方法,Ҏ(gu)Z必须保存下面的信息,Ҏ(gu)在类或接口中声明的顺序也必须保存?br />    Ҏ(gu)名,q回值类型,参数数量和类?按声明顺?Q方法修饰符(public private protected static final {?<br />    如果Ҏ(gu)不是抽象的或本地的还必须保存Q方法字节码Q操作数栈和该方法在栈针中局部变量的大小Q异常表?br />    <br />  5)除了帔R以外的所有类(静?变量<br />    q里主要说下~译时常量:<span style="color: red">是那些用final声明以及~译时已知的值初始化的类变量(例如Qstatic final int val =5)<br />    每个~译时常量的cd都会复制它所有常量到它自q帔R池中或者它的字节码中(通常情况下编译时直接替换字节??/span><br />    <br />  6)一个到cclassLoader的引?br />    指向ClassLoadercȝ引用  每个cd被装载的时候,虚拟机必跟t它是由启动c装载器<br />    q是q戯定义c装载器装蝲的。如果是用户自定义类装蝲器装载的Q那么虚拟机必须在类<br />    型信息中存储对该装蝲器的引用Q这是作为方法表中的cd数据的一部分保存的?br />    虚拟Z在动态连按期间用这个信息。当某个cd引用另一个类型的时候,虚拟Zh装蝲<br />    发v引用cd的类装蝲器来装蝲被引用的cd。这个动态连接的q程Q对于虚拟机分离命名I间<br />    的方式也是至关重要的。ؓ了能够正地执行动态连接以及维护多个命名空_虚拟机需要在?br />    法表中得知每个类都是由哪个类装蝲器装载的?br />    <br />  7)一个到Classcȝ引用<br />     指向Classcȝ引用  <span style="color: red">对于每一个被装蝲的类?不管是类q是接口)Q虚拟机都会相应Cؓ<br />     它创Z个java.langQClasscȝ实例QClass实例攑֜内存中的堆区Q,</span>而且虚拟必须以某U方式把q个实例的引用存储在Ҏ(gu)?br />     <br />        Z可能提高访问效率,设计者必Ml设计存储在Ҏ(gu)Z的类型信息的数据l构Q因此,<br /> 除了以上时论的原始类型信息,实现中还可能包括其他数据l构以加快访问原始数据的速度Q比如方法表?br /> 虚拟机对每个装蝲的非抽象c,都生成一个方法表Q把它作为类信息的一部分保存在方法区。方法表是一个数l,<br /> 它的元素是所有它的实例可能被调用的实例方法的直接引用Q包括那些从类l承q来的实例方法:(对于抽象cd接口Q方法表没有什么帮<br /> 助,因ؓE序决不会生成它们的实例?q行时可以通过Ҏ(gu)表快速搜d对象中调用的实例Ҏ(gu)?br />  <br /> Ҏ(gu)Z用的例子</p> <p> class Lava{<br />   private int speed = 5;<br />  <br />   void flow(){<br />   <br />   }<br />  <br />  }</p> <p> public class Volcano {<br />   <br />   public static void main(String args[]){<br />    <br />    Lava lava = new Lava();<br />    <br />    lava.flow();<br />   }<br />  }</p> <p>  1)虚拟机在Ҏ(gu)区查找Volcanoq个名字Q未果,载入volcano.class文gQƈ提取相应信息<br />    存入Ҏ(gu)区?br />   2)虚拟机开始执行VolcanocMmain()Ҏ(gu)的字节码的时候,管Lavac还没被装蝲Q?br />   但是和大多数(也许所?虚拟机实CP它不会等到把E序中用到的所有类都装载后才开<br />   始运行程序。恰好相反,它只在需要时才装载相应的cR?br />   3)main()的第一条指令告知虚拟机为列在常量池W一的cd配够的内存。所以虚拟机<br />   使用指向Volcano帔R池的指针扑ֈW一,发现它是一个对LavacȝW号引用Q然后它?yu)检?br />   Ҏ(gu)区,看LavacL否已l被装蝲了?br />   4)当虚拟机发现q没有装载过名ؓ"Lava"的类Ӟ它就开始查扑ƈ装蝲文g“Lava.class”Q?br />   q把从读入的二进制数据中提取的类型信息放在方法区中?br />   5)虚拟Z一个直接指向方法区LavacL据的指针来替换常量池W—项(是那个<br />   字符?#8220;Lava”)——以后就可以用这个指针来快速地讉KLavacM。这个替换过E称为常量池<br />   解析Q即把常量池中的W号引用替换为直接引用:q是通过在方法区中搜索被引用的元素实?br />   的,在这期间可能又需要装载其他类。在q里Q我们替换掉W号引用?#8220;直接引用”是一个本<br />   地指针?br />   6)虚拟机准备ؓ一个新的Lava对象分配内存。此Ӟ它又需要方法区中的信息。还?br />   得刚刚放到Volcanocd量池W——项的指针吗?现在虚拟机用它来讉KLavacd信息(此前刚放<br />   到方法区中的)Q找出其中记录的q样一个信息:一个Lava对象需要分配多堆I间?<br />   7)虚拟机确定一个Lava对象大小后,在堆上分配I间Qƈ把这个对象实例变量speed初始化ؓ默认初始?<br />   8)当把新生成的Lava对象的引用压到栈中,main()Ҏ(gu)的第一条指令也完成?指o通过q个引用<br />   调用Java代码(该代码把speed变量初始化ؓ正确初始?).另外用这个引用调用Lava对象引用的flow()Ҏ(gu)?/p> <p><strong>?/strong><br />         每个java虚拟机实例都有一个方法区以及一个堆Q一个javaE序独占一个java虚拟机实例,而每个javaE序都有自己的堆I间Q它们不会彼此干?但同一个javaE序的多个线E共享一个堆I间。这U情况下要考虑多线E访问同步问题?br />  <br /> <strong>Java?br /> </strong>        一个新U程被创建时Q都会得到自qPC寄存器和一个java栈,虚拟Zؓ每个U程开辟内存区。这些内存区是私有的QQ何线E不能访问其他线E的PC寄存器和java栈。java栈L存储该线E中javaҎ(gu)的调用状态。包括它的局部变量,被调用时传进来的参数Q它的返回|以及q算的中间结果等。java栈是p多栈帧或者说帧组成,一个栈帧包含一个javaҎ(gu)的调用状态,当线E调用javaҎ(gu)Ӟ虚拟机压入一个新的栈帧到该线E的java栈中。当Ҏ(gu)q回Ӟq个栈被从java栈中弹出q抛弃?br /> <strong>.本地Ҏ(gu)?br /> </strong>         M本地Ҏ(gu)接口都会使用某种本地Ҏ(gu)饯。当U程调用JavaҎ(gu)Ӟ虚拟Z创徏一个新的栈帧井压hJava栈?br /> 然而当它调用的是本地方法时Q虚拟机会保持Java栈不变,不再在线E的Java栈中压h新的帧,虚拟机只是简单地动态连?br /> q直接调用指定的本地Ҏ(gu)。可以把q看做是虚拟机利用本地方法来动态扩展自己?/p> <img src ="http://www.tkk7.com/kangdy/aggbug/325357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kangdy/" target="_blank">AK47</a> 2010-07-06 13:47 <a href="http://www.tkk7.com/kangdy/archive/2010/07/06/325357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://dqcjlb.com" target="_blank">պĻƷһ</a>| <a href="http://bomilon.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://laxdz.com" target="_blank">þùƷȰ׽</a>| <a href="http://zzyqr.com" target="_blank">һŮ</a>| <a href="http://qimiaodh.com" target="_blank">й߹ۿѹ</a>| <a href="http://22222xxx.com" target="_blank">ۺϾþ123</a>| <a href="http://www-188588.com" target="_blank">þѶƷ˾</a>| <a href="http://327www.com" target="_blank">7777þĻ</a>| <a href="http://w6626.com" target="_blank">222www߹ۿ</a>| <a href="http://yzddcpj.com" target="_blank">ҹþþþƷӰԺ</a>| <a href="http://www-175345.com" target="_blank">Ѹվ߹ۿ</a>| <a href="http://koukoub.com" target="_blank">һɫþ88޾Ʒۺ</a>| <a href="http://6132423.com" target="_blank">Ů糱ëƬѲ</a>| <a href="http://3688008.com" target="_blank">AVרAV</a>| <a href="http://7766qq.com" target="_blank">ˬֻڵƵ</a>| <a href="http://426366.com" target="_blank">һëƬ</a>| <a href="http://57az.com" target="_blank">AVþþƷ</a>| <a href="http://hkcdk.com" target="_blank">þòþüƵ7</a>| <a href="http://blcvs.com" target="_blank">޲122021鶹</a>| <a href="http://8mav1007.com" target="_blank">Ʒþһ</a>| <a href="http://yuntuzy.com" target="_blank">޳avƬ</a>| <a href="http://58f8.com" target="_blank">޾ƷóƬ?V߲</a>| <a href="http://52xdc.com" target="_blank">99ƷȫѹۿƵ..</a>| <a href="http://www-xg5777.com" target="_blank">þþþ޾ƷС˵</a>| <a href="http://yqstickers.com" target="_blank">ѻɫƵ</a>| <a href="http://vo168.com" target="_blank">avר߹ۿ</a>| <a href="http://ahtxjk.com" target="_blank">վWWW߹ۿ</a>| <a href="http://7299jj.com" target="_blank">òֻƵ</a>| <a href="http://guanxianedu.com" target="_blank">www߹ۿ</a>| <a href="http://532342.com" target="_blank">99߹ۿƵվ</a>| <a href="http://7766qq.com" target="_blank">˳ھþۺվ</a>| <a href="http://mmm19.com" target="_blank">Ƶһ</a>| <a href="http://hbjinmaitang.com" target="_blank">ƷƵ׽Ƶ</a>| <a href="http://nibayuan.com" target="_blank">2020Ʒۺ</a>| <a href="http://xamxx.com" target="_blank">ۺС˵</a>| <a href="http://tyfinland.com" target="_blank">ʮ߹ۿӰ</a>| <a href="http://339258.com" target="_blank">պŷAVҹҹ</a>| <a href="http://dsdkg.com" target="_blank">avһԿ</a>| <a href="http://32-k.com" target="_blank">AVר벻</a>| <a href="http://xabcjzx.com" target="_blank">޹һ</a>| <a href="http://1212777.com" target="_blank">߹ۿվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>