??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产成人久久综合一区77 ,含羞草国产亚洲精品岁国产精品,亚洲日产2021三区http://www.tkk7.com/zhpeng/category/12722.html<font filter:glow(color=#ffff00,strength=5)>--zhpeng</font>zh-cnWed, 28 Feb 2007 03:50:16 GMTWed, 28 Feb 2007 03:50:16 GMT60Java试规范http://www.tkk7.com/zhpeng/archive/2006/08/19/64480.html心随我动心随我动Sat, 19 Aug 2006 00:32:00 GMThttp://www.tkk7.com/zhpeng/archive/2006/08/19/64480.htmlhttp://www.tkk7.com/zhpeng/comments/64480.htmlhttp://www.tkk7.com/zhpeng/archive/2006/08/19/64480.html#Feedback0http://www.tkk7.com/zhpeng/comments/commentRss/64480.htmlhttp://www.tkk7.com/zhpeng/services/trackbacks/64480.html 1 、未使用(?span lang="EN-US">)代码

。存在未使用的私有静态字D?span lang="EN-US">

。带有不必要的修饰符的借口

。目前没有用的U有字段

。未使用的变?span lang="EN-US">

。无需的参?span lang="EN-US">

。显C导入的java.lang?span lang="EN-US">

。目前没有用的U有Ҏ

2 、编码标?span lang="EN-US">

。一行语句中声明了多U类型的变量

。物理位|不在一L同名组成员 ?span lang="EN-US">

。从一个抽象类库中的构造器调用的抽象方?span lang="EN-US">

。包括大?span lang="EN-US">case语句?span lang="EN-US">switch语句

。除了第一个之外的mainQ)函数

。直接弹出的Exceptioncd

?span lang="EN-US">catch语句?span lang="EN-US">Exception或?span lang="EN-US">RuntimeException

。直接弹出的Error

。没有在接口中定义的帔R

。长整数应该使用‘L?/span>代替写字母‘l?

3 、初始化

。没有显式初始化的静态字D?span lang="EN-US">

。没有显式初始化每个数据成员的构造器

。编译代码中可能的漏z?span lang="EN-US">

。存在错误的case?span lang="EN-US">switch语句

。程序体为空?span lang="EN-US">for语句

。程序体为空?span lang="EN-US">if语句

。需要重载的Ҏ

。应该用等号代?span lang="EN-US">==

。程序体为空?span lang="EN-US">else语句

。强制{换ؓ较低_ֺ的主要数据类?span lang="EN-US">

。在switch子句中的文本标识

?span lang="EN-US">if条g中的变量赋?span lang="EN-US">

。缺?span lang="EN-US">default子句中的switch语句

。存在嵌套赋?span lang="EN-US">

。比较QҎ

。@环控制变量在循环内部被突然改?span lang="EN-US">

。方法参数名U和cL员名U冲H?span lang="EN-US">

。可能与字符串串联؜淆的+操作W?span lang="EN-US">

4 、面向对象编E?span lang="EN-US">

。承的静态成员函数被隐藏

。可能嵌套过qcd

。承的实例变量被隐?span lang="EN-US">

。被重蝲privateҎ

。内部的cd不可见或外部的类库不相关

。某个实列变量ؓpublic或在package?span lang="EN-US">

。没有在一开始列出的public?span lang="EN-US">packageҎ和数?span lang="EN-US">

。不?span lang="EN-US">abstract或实现比较通常的接?span lang="EN-US">

。命名惯?span lang="EN-US">

。一个类名称不符合标?span lang="EN-US">

。一个接口名UCW合标准

。一个列外名UCW合标准

。一U方法名UCW合标准

。一个静态字D名UCW合标准

。一个静态方法名UCW合标准

。一U方法参数名UCW合标准

。一个实列字D不W合标准

。一个本地变量名UCW合标准

。一个最l静态字D中包含写字母

。一个返回布值的Ҏ使用"is"或?span lang="EN-US">"has"前缀

。一个接口成员字D包含小写字?span lang="EN-US">

。用一个非惯例的变量名U?span lang="EN-US">

5 、优?span lang="EN-US">

。一?span lang="EN-US">finally模块中存在未关闭的流

。用一?span lang="EN-US">for循环代替System.arrarycopy()拯数组

。存在没有必要的instanceof

。存在没有必要的强制变量cd转换

。可以用一个羃写的赋D?span lang="EN-US">

。常量字W串使用StringBuffer代替String

。@环条件过于复?span lang="EN-US">

。取反操作符使用q于频繁

6 、回?span lang="EN-US">

?span lang="EN-US">finalize()没有调用super.finally()

。最l方法的最后模块没有调?span lang="EN-US">super.finalize()

?span lang="EN-US">finalize()被显C?span lang="EN-US">

。在主要类型{换成StringӞ使用了不必要的时变?span lang="EN-US">

。在应该使用long[]的位|用了Date[]

7 ?span lang="EN-US">javadoc注释

。误用了Javadoc标签

?span lang="EN-US">Javadoc和普通注释之间区分不明显

8 、线E?span lang="EN-US">

。?span lang="EN-US">synchronizedQ降低了性能

9 、全局静态分?span lang="EN-US">

。过度访?span lang="EN-US">package-private字段

。过度访?span lang="EN-US">package-privateҎ

。过度访?span lang="EN-US">package-privatecd

。过度访?span lang="EN-US">public/protected字段

。过度访?span lang="EN-US">public/protectedҎ

。过度访?span lang="EN-US">public/protectedcd

。没有用全局package-private字段

。没有用全局package-privateҎ

。没有用全局package-privatecd

。没有用全局public/protected字段

。没有用全局public/protectedҎ

。没有用全局public/protectedcd

10 、企业版java beans(EJB)

?span lang="EN-US">beancd没有定义成ؓpublic

?span lang="EN-US">beancd被错误定义成?span lang="EN-US">abstract

?span lang="EN-US">beancd被错误定义成?span lang="EN-US">final

?span lang="EN-US">beancd实现一?span lang="EN-US">ejbCreate()Ҏ

?span lang="EN-US">beancd错误定义finalizeҎ

?span lang="EN-US">ejbCreate()讉K控制W没有定义成?span lang="EN-US">public

?span lang="EN-US">SessionBean中的ejbCreate()没有q回void

。定位方法的修饰W没有定义成?span lang="EN-US">public

。定位方法的q回cd不是一个主键,也不是主键的c集

?span lang="EN-US">ejbPostCreate()有一个非public的访问控制修饰符

?span lang="EN-US">ejbPostCreate()没有q回cdvoid

11 、杂?span lang="EN-US">

。成员字D隐藏在成员Ҏ?span lang="EN-US">

。@环记数器无法递增

?span lang="EN-US">for循环中没有包含布条?span lang="EN-US">

。存在的clone()Ҏ没有调用super.clone()

?span lang="EN-US">for语句~少代码模块

。方法参数得到赋?/span>

心随我动 2006-08-19 08:32 发表评论
]]>
Java服务器端~程安全必读http://www.tkk7.com/zhpeng/archive/2006/08/18/64230.html心随我动心随我动Thu, 17 Aug 2006 16:19:00 GMThttp://www.tkk7.com/zhpeng/archive/2006/08/18/64230.htmlhttp://www.tkk7.com/zhpeng/comments/64230.htmlhttp://www.tkk7.com/zhpeng/archive/2006/08/18/64230.html#Feedback0http://www.tkk7.com/zhpeng/comments/commentRss/64230.htmlhttp://www.tkk7.com/zhpeng/services/trackbacks/64230.html阅读全文

心随我动 2006-08-18 00:19 发表评论
]]>
Java中的常用Ҏhttp://www.tkk7.com/zhpeng/archive/2006/08/14/63444.html心随我动心随我动Mon, 14 Aug 2006 04:40:00 GMThttp://www.tkk7.com/zhpeng/archive/2006/08/14/63444.htmlhttp://www.tkk7.com/zhpeng/comments/63444.htmlhttp://www.tkk7.com/zhpeng/archive/2006/08/14/63444.html#Feedback0http://www.tkk7.com/zhpeng/comments/commentRss/63444.htmlhttp://www.tkk7.com/zhpeng/services/trackbacks/63444.html阅读全文

心随我动 2006-08-14 12:40 发表评论
]]>
一个理解wait()与notify()的例?/title><link>http://www.tkk7.com/zhpeng/archive/2006/08/06/62087.html</link><dc:creator>心随我动</dc:creator><author>心随我动</author><pubDate>Sun, 06 Aug 2006 14:30:00 GMT</pubDate><guid>http://www.tkk7.com/zhpeng/archive/2006/08/06/62087.html</guid><wfw:comment>http://www.tkk7.com/zhpeng/comments/62087.html</wfw:comment><comments>http://www.tkk7.com/zhpeng/archive/2006/08/06/62087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhpeng/comments/commentRss/62087.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhpeng/services/trackbacks/62087.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">下面是我原来?span lang="EN-US">CSDN</span>论坛上看到的一个脓子,涉及到同?span lang="EN-US">,wait(),notify()</span>{概늚理解Q我试着Ҏ原来的一些回复和<span lang="EN-US">Think in Java</span>上的相关概念?span lang="EN-US">wait()</span>?span lang="EN-US">notify()</span>q两个方法剖析了一下,Ƣ迎指教<span lang="EN-US">.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  问题如下Q?span lang="EN-US"><o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">//</span> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">分析q段E序Qƈ解释一下,着重讲?span lang="EN-US">synchronized</span>?span lang="EN-US">wait(),notify </span>谢谢Q?span lang="EN-US"><br />class ThreadA <br />{<br />  public static void main(String[] args) <br />  {<br />    ThreadB b=new ThreadB();<br />    b.start();<br />    System.out.println("b is start....");<br />    synchronized(b)//</span>括号里的<span lang="EN-US">b</span>是什么意?span lang="EN-US">,</span>起什么作?span lang="EN-US">?<br />    {<br />      try<br />      {<br /> System.out.println("Waiting for b to complete...");<br /> b.wait();//</span>q一句是什么意思,I竟让谁<span lang="EN-US">wait?<br />        System.out.println("Completed.Now back to main thread");<br />      }catch (InterruptedException e){}<br />    }<br />    System.out.println("Total is :"+b.total);<br />   }<br />}<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> <br />class ThreadB extends Thread<br />{<br />  int total;<br />  public void run()<br />  {<br />    synchronized(this)<br />    {<br />      System.out.println("ThreadB is running..");<br />      for (int i=0;i<100;i++ )<br />      {<br />        total +=i;<br />        System.out.println("total is "+total);<br />      }<br />      notify();<br />    }<br />  }<br />}<o:p></o:p></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  要分析这个程?span lang="EN-US">,</span>首先要理?span lang="EN-US">notify()</span>?span lang="EN-US">wait(),</span>Z么在前几天纪录线E的时候没有纪录这两个Ҏ?span lang="EN-US">,</span>因ؓq两个方法本来就不属?span lang="EN-US">Thread</span>c?span lang="EN-US">,</span>而是属于最底层?span lang="EN-US">object</span>基础cȝ<span lang="EN-US">,</span>也就是说不光?span lang="EN-US">Thread</span>Q每个对象都?span lang="EN-US">notify</span>?span lang="EN-US">wait</span>的功能,Z么?因ؓ他们是用来操U锁?span lang="EN-US">,</span>而每个对象都有锁<span lang="EN-US">,</span>锁是每个对象的基<span lang="EN-US">,</span>既然锁是基础?span lang="EN-US">,</span>那么操纵锁的Ҏ当然也是最基础?span lang="EN-US">.<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  再往下看之前?span lang="EN-US">,</span>首先最好复习一?span lang="EN-US">Think in Java</span>??xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US">14.3.1</span></st1:chsdate>中第<span lang="EN-US">3</span>部分内容Q等待和通知<span lang="EN-US">,</span>也就?span lang="EN-US">wait()</span>?span lang="EN-US">notify</span>?span lang="EN-US">.<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  按照<span lang="EN-US">Think in Java</span>中的解释<span lang="EN-US">:"wait()</span>允许我们线E置入“睡眠”状态,同时又“积极”地{待条g发生改变<span lang="EN-US">.</span>而且只有在一?span lang="EN-US">notify()</span>?span lang="EN-US">notifyAll()</span>发生变化的时候,U程才会被唤醒,q检查条件是否有?span lang="EN-US">."<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  我们来解释一下这句话<span lang="EN-US">.<br /></span>  <span lang="EN-US">"wait()</span>允许我们线E置入“睡眠”状?span lang="EN-US">",</span>也就是说<span lang="EN-US">,wait</span>也是让当前线E阻塞的<span lang="EN-US">,</span>q一点和<span lang="EN-US">sleep</span>或?span lang="EN-US">suspend</span>是相同的<span lang="EN-US">.</span>那和<span lang="EN-US">sleep,suspend</span>有什么区别呢<span lang="EN-US">?<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  区别在于<span lang="EN-US">"(wait)</span>同时又“积极”地{待条g发生改变<span lang="EN-US">",</span>q一点很关键<span lang="EN-US">,sleep</span>?span lang="EN-US">suspend</span>无法做到<span lang="EN-US">.</span>因ؓ我们有时候需要通过同步Q?span lang="EN-US">synchronized</span>Q的帮助来防止线E之间的冲突Q而一旦用同?span lang="EN-US">,</span>p锁定对象Q也是获取对象?span lang="EN-US">,</span>其它要用该对象锁的U程都只能排队等着<span lang="EN-US">,</span>{到同步Ҏ或者同步块里的E序全部q行完才有机?span lang="EN-US">.</span>在同步方法和同步块中<span lang="EN-US">,</span>无论<span lang="EN-US">sleep()</span>q是<span lang="EN-US">suspend()</span>都不可能自己被调用的时候解除锁?span lang="EN-US">,</span>他们都霸占着正在使用的对象锁不放<span lang="EN-US">.<br /></span>  ?span lang="EN-US">wait</span>却可?span lang="EN-US">,</span>它可以让同步Ҏ或者同步块暂时攑ּ对象?span lang="EN-US">,</span>而将它暂时让l其它需要对象锁的h<span lang="EN-US">(</span>q里应该是程序块<span lang="EN-US">,</span>或线E?span lang="EN-US">)</span>?span lang="EN-US">,</span>q意味着可在执行<span lang="EN-US">wait()</span>期间调用U程对象中的其他同步Ҏ<span lang="EN-US">!</span>在其它情况下<span lang="EN-US">(sleep</span>?span lang="EN-US">,suspend</span>?span lang="EN-US">),</span>q是不可能的<span lang="EN-US">.<br /></span>  但是注意我前面说?span lang="EN-US">,</span>只是暂时攑ּ对象?span lang="EN-US">,</span>暂时l其它线E?span lang="EN-US">,</span>?span lang="EN-US">wait</span>所在的U程q是要把q个对象锁收回来的呀<span lang="EN-US">.wait</span>什?span lang="EN-US">?</span>是<span lang="EN-US">wait</span>别h用完了还l我啊!<span lang="EN-US"><br /></span>  ?span lang="EN-US">,</span>那怎么把对象锁收回来呢<span lang="EN-US">?<br /></span>  W一U方?span lang="EN-US">,</span>限定借出ȝ旉<span lang="EN-US">.</span>?span lang="EN-US">wait()</span>中设|参?span lang="EN-US">,</span>比如<span lang="EN-US">wait(1000),</span>以毫Uؓ单位<span lang="EN-US">,</span>p明我只借出?span lang="EN-US">1</span>U中<span lang="EN-US">,</span>一U钟之后<span lang="EN-US">,</span>我自动收?span lang="EN-US">.<br /></span>  W二U方?span lang="EN-US">,</span>让借出ȝ人通知?span lang="EN-US">,</span>他用完了<span lang="EN-US">,</span>要还l我?span lang="EN-US">.</span>q时<span lang="EN-US">,</span>我马上就收回?span lang="EN-US">.</span>?span lang="EN-US">,</span>假如我设?span lang="EN-US">1</span>时之后收回<span lang="EN-US">,</span>别h只用了半时完?span lang="EN-US">,</span>那怎么办呢<span lang="EN-US">?</span>?span lang="EN-US">!</span>当然用完了就收回?span lang="EN-US">,</span>q管我设的是多长旉?span lang="EN-US">.<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  那么别h怎么通知我呢<span lang="EN-US">?</span>怿大家都可以想C<span lang="EN-US">,notify(),</span>q就是最后一句话<span lang="EN-US">"</span>而且只有在一?span lang="EN-US">notify()</span>?span lang="EN-US">notifyAll()</span>发生变化的时候,U程才会被唤?span lang="EN-US">"</span>的意思了<span lang="EN-US">.<br /></span>  因此<span lang="EN-US">,</span>我们可将一?span lang="EN-US">wait()</span>?span lang="EN-US">notify()</span>|入M同步Ҏ或同步块内部Q无论在那个c里是否准备q行涉及U程的处理。而且实际?span lang="EN-US">,</span>我们也只能在同步Ҏ或者同步块里面调用<span lang="EN-US">wait()</span>?span lang="EN-US">notify().<o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 200%; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"> <span style="FONT-SIZE: 10pt; COLOR: #646464; LINE-HEIGHT: 200%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">  q个时候我们来解释上面的程?span lang="EN-US">,</span>直是易如反掌?span lang="EN-US">.<o:p></o:p></span></span> </p> <span style="FONT-SIZE: 10pt; COLOR: #646464; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">  <span lang="EN-US">synchronized(b){...}</span>Q的意思是定义一个同步块<span lang="EN-US">,</span>使用<span lang="EN-US">b</span>作ؓ资源锁?span lang="EN-US">b.wait();</span>的意思是临时释放锁,q塞当前线E?span lang="EN-US">,</span>好让其他使用同一把锁的线E有Z执行<span lang="EN-US">,</span>在这里要用同一把锁的就?span lang="EN-US">b</span>U程本n<span lang="EN-US">.</span>q个U程在执行到一定地方后?span lang="EN-US">notify()</span>通知<span lang="EN-US">wait</span>的线E?span lang="EN-US">,</span>锁已l用?span lang="EN-US">,</span>?span lang="EN-US">notify()</span>所在的同步块运行完之后<span lang="EN-US">,wait</span>所在的U程可以l执?span lang="EN-US">.</span></span> <img src ="http://www.tkk7.com/zhpeng/aggbug/62087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhpeng/" target="_blank">心随我动</a> 2006-08-06 22:30 <a href="http://www.tkk7.com/zhpeng/archive/2006/08/06/62087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java栈与堆的思?/title><link>http://www.tkk7.com/zhpeng/archive/2006/08/03/61603.html</link><dc:creator>心随我动</dc:creator><author>心随我动</author><pubDate>Thu, 03 Aug 2006 14:04:00 GMT</pubDate><guid>http://www.tkk7.com/zhpeng/archive/2006/08/03/61603.html</guid><wfw:comment>http://www.tkk7.com/zhpeng/comments/61603.html</wfw:comment><comments>http://www.tkk7.com/zhpeng/archive/2006/08/03/61603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhpeng/comments/commentRss/61603.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhpeng/services/trackbacks/61603.html</trackback:ping><description><![CDATA[ <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #646464; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">    1. </span> <span style="FONT-SIZE: 10pt; COLOR: #646464; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">?span lang="EN-US">(stack)</span>与堆<span lang="EN-US">(heap)</span>都是<span lang="EN-US">Java</span>用来?span lang="EN-US">Ram</span>中存放数据的地方。与<span lang="EN-US">C++</span>不同Q?span lang="EN-US">Java</span>自动理栈和堆,E序员不能直接地讄栈或堆?span lang="EN-US"><br /></span>  <span lang="EN-US">2. </span>栈的优势是,存取速度比堆要快Q仅ơ于直接位于<span lang="EN-US">CPU</span>中的寄存器。但~点是,存在栈中的数据大与生存期必L定的,~Z灉|性。另外,栈数据可以共享,详见W?span lang="EN-US">3</span>炏V堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器Q?span lang="EN-US">Java</span>的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动态分配内存,存取速度较慢?span lang="EN-US"><br /></span>  <span lang="EN-US">3. Java</span>中的数据cd有两U?span lang="EN-US"><br /></span>  一U是基本cd<span lang="EN-US">(primitive types), </span>共有<span lang="EN-US">8</span>U,?span lang="EN-US">int, short, long, byte, float, double, boolean, char(</span>注意Qƈ没有<span lang="EN-US">string</span>的基本类?span lang="EN-US">)</span>。这U类型的定义是通过诸如<span lang="EN-US">int a = 3; long b = <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chmetcnv w:st="on" unitname="l" sourcevalue="255" hasspace="False" negative="False" numbertype="1" tcsc="0">255L</st1:chmetcnv>;</span>的Ş式来定义的,UCؓ自动变量。值得注意的是Q自动变量存的是字面|不是cȝ实例Q即不是cȝ引用Q这里ƈ没有cȝ存在。如<span lang="EN-US">int a = 3; </span>q里?span lang="EN-US">a</span>是一个指?span lang="EN-US">int</span>cd的引用,指向<span lang="EN-US">3</span>q个字面倹{这些字面值的数据Q由于大可知,生存期可?span lang="EN-US">(</span>q些字面值固定定义在某个E序块里面,E序块退出后Q字D值就消失?span lang="EN-US">)</span>Q出于追求速度的原因,存在于栈中?span lang="EN-US"><br /></span>  另外Q栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定?span lang="EN-US"><br /></span>  <span lang="EN-US">int a = 3; <br /></span>  <span lang="EN-US">int b = 3</span>Q?span lang="EN-US"><br /></span>  ~译器先处理<span lang="EN-US">int a = 3</span>Q首先它会在栈中创徏一个变量ؓ<span lang="EN-US">a</span>的引用,然后查找有没有字面gؓ<span lang="EN-US">3</span>的地址Q没扑ֈQ就开辟一个存?span lang="EN-US">3</span>q个字面值的地址Q然后将<span lang="EN-US">a</span>指向<span lang="EN-US">3</span>的地址。接着处理<span lang="EN-US">int b = 3</span>Q在创徏?span lang="EN-US">b</span>的引用变量后Q由于在栈中已经?span lang="EN-US">3</span>q个字面|便将<span lang="EN-US">b</span>直接指向<span lang="EN-US">3</span>的地址。这P出C<span lang="EN-US">a</span>?span lang="EN-US">b</span>同时均指?span lang="EN-US">3</span>的情c?span lang="EN-US"><br /></span>  特别注意的是Q这U字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了q个对象的内部状态,那么另一个对象引用变量也卛_反映个变化。相反,通过字面值的引用来修改其|不会D另一个指向此字面值的引用的g跟着改变的情c如上例Q我们定义完<span lang="EN-US">a</span>?span lang="EN-US"> b</span>的值后Q再?span lang="EN-US">a=4</span>Q那么,<span lang="EN-US">b</span>不会{于<span lang="EN-US">4</span>Q还是等?span lang="EN-US">3</span>。在~译器内部,遇到<span lang="EN-US">a=4</span>Q时Q它׃重新搜烦栈中是否?span lang="EN-US">4</span>的字面|如果没有Q重新开辟地址存放<span lang="EN-US">4</span>的|如果已经有了Q则直接?span lang="EN-US">a</span>指向q个地址。因?span lang="EN-US">a</span>值的改变不会影响?span lang="EN-US">b</span>的倹{?span lang="EN-US"><br /></span>  另一U是包装cL据,?span lang="EN-US">Integer, String, Double</span>{将相应的基本数据类型包装v来的cR这些类数据全部存在于堆中,<span lang="EN-US">Java</span>?span lang="EN-US">new()</span>语句来显C地告诉~译器,在运行时才根据需要动态创建,因此比较灉|Q但~点是要占用更多的时间?span lang="EN-US"><br /></span>  <span lang="EN-US">4. String</span>是一个特D的包装cL据。即可以?span lang="EN-US">String str = new String("abc");</span>的Ş式来创徏Q也可以?span lang="EN-US">String str = "abc"</span>Q的形式来创?span lang="EN-US">(</span>作ؓҎQ在<span lang="EN-US">JDK 5.0</span>之前Q你从未见过<span lang="EN-US">Integer i = 3;</span>的表辑ּQ因为类与字面值是不能通用的,除了<span lang="EN-US">String</span>。而在<span lang="EN-US">JDK 5.0</span>中,q种表达式是可以的!因ؓ~译器在后台q行<span lang="EN-US">Integer i = new Integer(3)</span>的{?span lang="EN-US">)</span>。前者是规范的类的创E,卛_<span lang="EN-US">Java</span>中,一切都是对象,而对象是cȝ实例Q全部通过<span lang="EN-US">new()</span>的Ş式来创徏?span lang="EN-US">Java </span>中的有些c,?span lang="EN-US">DateFormat</span>c,可以通过该类?span lang="EN-US">getInstance()</span>Ҏ来返回一个新创徏的类Q似乎违反了此原则。其实不然。该c运用了单例模式来返回类的实例,只不q这个实例是在该cd部通过<span lang="EN-US">new()</span>来创建的Q?span lang="EN-US">getInstance()</span>向外部隐藏了此细节。那Z么在<span lang="EN-US">String str = "abc"</span>Q中Qƈ没有通过<span lang="EN-US">new()</span>来创建实例,是不是违反了上述原则Q其实没有?span lang="EN-US"><br /></span>  <span lang="EN-US">5. </span>关于<span lang="EN-US">String str = "abc"</span>的内部工作?span lang="EN-US">Java</span>内部此语句转化Z下几个步骤:<span lang="EN-US"><br /></span>  <span lang="EN-US">(1)</span>先定义一个名?span lang="EN-US">str</span>的对<span lang="EN-US">String</span>cȝ对象引用变量Q?span lang="EN-US">String str</span>Q?span lang="EN-US"><br /></span>  <span lang="EN-US">(2)</span>在栈中查找有没有存放gؓ<span lang="EN-US">"abc"</span>的地址Q如果没有,则开辟一个存攑֭面gؓ<span lang="EN-US">"abc"</span>的地址Q接着创徏一个新?span lang="EN-US">String</span>cȝ对象<span lang="EN-US">o</span>Qƈ?span lang="EN-US">o </span>的字W串值指向这个地址Q而且在栈中这个地址旁边Cq个引用的对?span lang="EN-US">o</span>。如果已l有了gؓ<span lang="EN-US">"abc"</span>的地址Q则查找对象<span lang="EN-US">o</span>Qƈq回<span lang="EN-US">o</span>的地址?span lang="EN-US"><br /></span>  <span lang="EN-US">(3)</span>?span lang="EN-US">str</span>指向对象<span lang="EN-US">o</span>的地址?span lang="EN-US"><br /></span>  值得注意的是Q一?span lang="EN-US">String</span>cM字符串值都是直接存值的。但?span lang="EN-US">String str = "abc"</span>Q这U场合下Q其字符串值却是保存了一个指向存在栈中数据的引用Q?span lang="EN-US"><br /></span>  Z更好地说明这个问题,我们可以通过以下的几个代码进行验证?span lang="EN-US"><br /></span>  <span lang="EN-US">String str1 = "abc";<br /></span>  <span lang="EN-US">String str2 = "abc";<br /></span>  <span lang="EN-US">System.out.println(str1==str2);  //true<br /></span>  注意Q我们这里ƈ不用<span lang="EN-US">str1.equals(str2)</span>Q的方式Q因比较两个字W串的值是否相{?span lang="EN-US">==</span>PҎ<span lang="EN-US">JDK</span>的说明,只有在两个引用都指向了同一个对象时才返回真倹{而我们在q里要看的是Q?span lang="EN-US">str1</span>?span lang="EN-US">str2</span>是否都指向了同一个对象?span lang="EN-US"><br /></span>  l果说明Q?span lang="EN-US">JVM</span>创徏了两个引?span lang="EN-US">str1</span>?span lang="EN-US">str2</span>Q但只创Z一个对象,而且两个引用都指向了q个对象?span lang="EN-US"><br /></span>  我们再来更进一步,以上代码改成:<span lang="EN-US"><br /></span>  <span lang="EN-US">String str1 = "abc";<br /></span>  <span lang="EN-US">String str2 = "abc";<br /></span>  <span lang="EN-US">str1 = "bcd";<br /></span>  <span lang="EN-US">System.out.println(str1 + "," + str2);  //bcd, abc<br /></span>  <span lang="EN-US">System.out.println(str1==str2);  //false<br /></span>  q就是说Q赋值的变化D了类对象引用的变化,<span lang="EN-US">str1</span>指向了另外一个新对象Q?span lang="EN-US">str2</span>仍旧指向原来的对象。上例中Q当我们?span lang="EN-US">str1</span>的值改?span lang="EN-US">"bcd"</span>Ӟ<span lang="EN-US">JVM</span>发现在栈中没有存放该值的地址Q便开辟了q个地址Qƈ创徏了一个新的对象,其字W串的值指向这个地址?span lang="EN-US"><br /></span>  事实上,<span lang="EN-US">String</span>c被设计成ؓ不可改变<span lang="EN-US">(immutable)</span>的类。如果你要改变其|可以Q但<span lang="EN-US">JVM</span>在运行时Ҏ新值悄悄创Z一个新对象Q然后将q个对象的地址q回l原来类的引用。这个创E虽说是完全自动q行的,但它毕竟占用了更多的旉。在Ҏ间要求比较敏感的环境中,会带有一定的不良影响?span lang="EN-US"><br /></span>  再修改原来代码:<span lang="EN-US"><br /></span>  <span lang="EN-US">String str1 = "abc";<br /></span>  <span lang="EN-US">String str2 = "abc";<br /></span>  <span lang="EN-US">str1 = "bcd";<br /></span>  <span lang="EN-US">String str3 = str1;<br /></span>  <span lang="EN-US">System.out.println(str3);  //bcd<br /></span>  <span lang="EN-US">String str4 = "bcd";<br /></span>  <span lang="EN-US">System.out.println(str1 == str4);  //true<br /></span>  <span lang="EN-US">str3 </span>q个对象的引用直接指?span lang="EN-US">str1</span>所指向的对?span lang="EN-US">(</span>注意Q?span lang="EN-US">str3</span>q没有创建新对象<span lang="EN-US">)</span>。当<span lang="EN-US">str1</span>改完其值后Q再创徏一?span lang="EN-US">String</span>的引?span lang="EN-US">str4</span>Qƈ指向?span lang="EN-US">str1</span>修改D创建的新的对象。可以发玎ͼq回<span lang="EN-US">str4</span>也没有创建新的对象,从而再ơ实现栈中数据的׃n?span lang="EN-US"><br /></span>  我们再接着看以下的代码?span lang="EN-US"><br /></span>  <span lang="EN-US">String str1 = new String("abc");<br /></span>  <span lang="EN-US">String str2 = "abc";<br /></span>  <span lang="EN-US">System.out.println(str1==str2);  //false<br /></span>  创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?span lang="EN-US"><br /></span>  <span lang="EN-US">String str1 = "abc";<br /></span>  <span lang="EN-US">String str2 = new String("abc");<br /></span>  <span lang="EN-US">System.out.println(str1==str2);  //false<br /></span>  创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?span lang="EN-US"><br /></span>  以上两段代码说明Q只要是?span lang="EN-US">new()</span>来新建对象的Q都会在堆中创徏Q而且其字W串是单独存值的Q即使与栈中的数据相同,也不会与栈中的数据共享?span lang="EN-US"><br /></span>  <span lang="EN-US">6. </span>数据cd包装cȝg可修攏V不仅仅?span lang="EN-US">String</span>cȝg可修改,所有的数据cd包装c都不能更改其内部的倹{?span lang="EN-US"><br /></span>  <span lang="EN-US">7. </span>l论与徏议:<span lang="EN-US"><br /></span>  <span lang="EN-US">(1)</span>我们在用诸?span lang="EN-US">String str = "abc"</span>Q的格式定义cLQL惛_然地认ؓQ我们创Z<span lang="EN-US">String</span>cȝ对象<span lang="EN-US">str</span>。担心陷阱!对象可能q没有被创徏Q唯一可以肯定的是Q指?span lang="EN-US"> String</span>cȝ引用被创Z。至于这个引用到底是否指向了一个新的对象,必须Ҏ上下文来考虑Q除非你通过<span lang="EN-US">new()</span>Ҏ来显要地创徏一个新的对象。因此,更ؓ准确的说法是Q我们创Z一个指?span lang="EN-US">String</span>cȝ对象的引用变?span lang="EN-US">str</span>Q这个对象引用变量指向了某个gؓ<span lang="EN-US">"abc"</span>?span lang="EN-US">String</span>cR清醒地认识到这一点对排除E序中难以发现的<span lang="EN-US">bug</span>是很有帮助的?span lang="EN-US"><br /></span>  <span lang="EN-US">(2)</span>使用<span lang="EN-US">String str = "abc"</span>Q的方式Q可以在一定程度上提高E序的运行速度Q因?span lang="EN-US">JVM</span>会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对?span lang="EN-US">String str = new String("abc")</span>Q的代码Q则一概在堆中创徏新对象,而不其字符串值是否相{,是否有必要创建新对象Q从而加重了E序的负担。这个思想应该是n元模式的思想Q但<span lang="EN-US">JDK</span>的内部在q里实现是否应用了这个模式,不得而知?span lang="EN-US"><br /></span>  <span lang="EN-US">(3)</span>当比较包装类里面的数值是否相{时Q用<span lang="EN-US">equals()</span>ҎQ当试两个包装cȝ引用是否指向同一个对象时Q用<span lang="EN-US">==</span>?span lang="EN-US"><br /></span>  <span lang="EN-US">(4)</span>׃<span lang="EN-US">String</span>cȝ<span lang="EN-US">immutable</span>性质Q当<span lang="EN-US">String</span>变量需要经常变换其值时Q应该考虑使用<span lang="EN-US">StringBuffer</span>c,以提高程序效率?/span> <img src ="http://www.tkk7.com/zhpeng/aggbug/61603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhpeng/" target="_blank">心随我动</a> 2006-08-03 22:04 <a href="http://www.tkk7.com/zhpeng/archive/2006/08/03/61603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java是传D是传引用http://www.tkk7.com/zhpeng/archive/2006/08/02/61396.html心随我动心随我动Wed, 02 Aug 2006 13:09:00 GMThttp://www.tkk7.com/zhpeng/archive/2006/08/02/61396.htmlhttp://www.tkk7.com/zhpeng/comments/61396.htmlhttp://www.tkk7.com/zhpeng/archive/2006/08/02/61396.html#Feedback1http://www.tkk7.com/zhpeng/comments/commentRss/61396.htmlhttp://www.tkk7.com/zhpeng/services/trackbacks/61396.html阅读全文

心随我动 2006-08-02 21:09 发表评论
]]>
JDBC优化数据库连?IBMhttp://www.tkk7.com/zhpeng/archive/2006/07/25/60091.html心随我动心随我动Tue, 25 Jul 2006 15:53:00 GMThttp://www.tkk7.com/zhpeng/archive/2006/07/25/60091.htmlhttp://www.tkk7.com/zhpeng/comments/60091.htmlhttp://www.tkk7.com/zhpeng/archive/2006/07/25/60091.html#Feedback0http://www.tkk7.com/zhpeng/comments/commentRss/60091.htmlhttp://www.tkk7.com/zhpeng/services/trackbacks/60091.html  方式
  介绍在把企业数据桥接到无U移动设备时建立 JDBC q接的一条简单原则,q可以帮助您使解x案具有更好的可扩展性和更高效的性能?/p>

  q接?/strong>
  M应用E序都必d讉Kzd的数据库q接Q然后才能访问数据库。数据库q接是一个很占资源且 I/O 开销很大的操作,q且如果每次想用数据库q接旉必须创徏它,那么它将会成为您的性能瓉?/p>

  例如Q如果您使用 Java servletQJava servlet 通过 init() Ҏ创徏q在其生命周期结束时被销毁(通过 destroy() ҎQ)的方式,您是虽然避免了每?servlet 被实例化旉新徏立连接。这样一U方式会明显地降低应用程序的性能。完成相同功能的更好的途径是用“连接池QConnection PoolQ”,您可以在q接池中初始化多个连接(q且参数可以?XML 配置文g中读取)?/p>

  q接本n׃l集合对象和一个在整个hq程中ɘq接保持打开的用戯求组成。创接池的关键是在数据库讉K代码中用如下一些块Qtry{}.. catch{}... finally{}..。然后您使用 close() Ҏ来确认连接确实被q回Cq接池而不是被d关闭了。在“finally{}”块中指?close() Ҏ使得执行q程中发生的异常会被捕获刎ͼq且该语句仍被执??q接q回到连接池Q这防止了应用E序中“连接泄漏(connection leakQ”的发生?/p>

  以下是构Z?JDBC q接的示例:

Connection con = null;
try {  ds = (DataSource)myContext.lookup("<specify JDBC driver>");
  pooledCon = ds.getConnection("scott", "tiger");
 // Processing Code goes here
} catch (Exception ignored) {
 // catch JNDI or JDBC exceptions here
} finally {
 if(pooledCon != null)
   pooledCon.close();
}

  使用 PreparedStatement
  Z认ؓ PreparedStatement 对象的效率比多个 Statement 对象更高Q尤其是如果您必dơ执行同一条语句而差别仅在于参数不同时更是如此。PreparedStatement 允许您将 SQL 语句“编译”一ơ(管q种~译W一ơ要消耗较多的旉Q,然后它保存在高速缓存中Q从而实现有效的重用。同时它也提供了可读性更好的代码?/p>

  另一个额外的优势是由驱动E序完成的对用户传递给语句的字W串的自动{义。D例来_q意味着当您试图字W串“D'Marco”插入到一个基于字W的数据域(它可能是 VARCHAR, VARCHAR2, CHAR {)中时QSQL 语句不会在遇到第一个撇h׃生灾难性的p|?/p>

  使用 PreparedStatement 对象时的另一个良好习惯是调用对象自n?close() Ҏ来“关闭对象”,q个Ҏ被用来q行 SQL 语句。这会关闭Q何与正在执行?SQL 语句相关联的游标Q这样就能防止打开的游标把数据库弄得十分凌乱?/p>

  以下是一个创?PreparedSatement 的示例:

PreparedStatement sqlstmt = dbCon.prepareStatement("select *
from table1 where field_1=?");
sqlstmt.setInt(1, 12);
ResultSet rs = sqlstmt.executeQuery();
// close the resultset statement to avoid hanging cursors in database
sqlstmt.close();
// processing of new statement
sqlstmt = dbCon.prepareStatement("select * from table2 where field_2 = ?");
// repeat creating the result set

  恰当地利用事?br />  在更新动态数据库表和数据时常怼遗忘的一个方面,是在向过一个表CZ个逻辑事务的表更新或插入数据时Q这个事务应该反映到所有的表中Q或者在到事务p|Ӟ通过“回滚”该事务而在每一个表中都没有反映?/p>

  一些核心的 JDBC 包支持了四种事务隔离模式Qtransaction isolation modeQ,q些模式允许E序指定它们想事务表现出怎样的行为。大多数E序都至支持两U模式:“读取提交(read committedQ”(~省|和“可序列化的QserializableQ”。当不可重复d应该允许在多个查询之间由一个事务作出的修改对于另一个事务可见时Q请使用“读取提交”;要由另一个事务作出的修改在一个查询运行时成ؓ可见的,请用象读取(phantom readQ。当您需要一个跨多个操作前后完全一致的数据库视图时Q就应该使用更ؓ严格的“可序列化的”设|。把q接的自动提交设|ؓ“假”(autocommit = "false"Q,Cq一Ҏ很有用的?/p>

  以下是构Z个连接ƈ讄其各个属性参数的CZQ?/p>

Connection con = null;
try {
 dtsr = (DataSource <the JDBC driver you use>");
 pConn = dtsr.getConnection("<specify login>", "<specify password>");
 pConn.setAutoCommit(false); // transaction are not committed uponm execution

 pConn.setTransactionIsolation(
 Connection.TRANSACTION_SERIALIZABLE);
 // pConn is pooled connection
 pConn.commit();
} catch (Exception ignored) {
 try { pConnn.rollback(); } catch (SQLException esgl) {}
} finally {
 if(pConn != null) {
    pConn.setAutoCommit(true); //reset autocommit
   pConn.close();
 }
}

  您也可以利用一个可选的 JDBC ??JTAQJava Transaction APIQ,它允许容易地和完全独立的事务服务器进行集成?/p>

心随我动 2006-07-25 23:53 发表评论
]]>
վ֩ģ壺 һ| ִӲˬִֿƵ| ˬAëƬѿ| õӰ߹ۿ| ѹվ߹ۿ15| ޹㽶| 99Ʒѹۿ| þþùƷһ| 18Ůȴ| ޻ɫƵ| 鶹һѲվ| ޾Ʒ˾þþþ| ѵվ߹ۿ| ŷ޾Ʒ˾þԻ| ˬýôƵ| պһ | 99þþþƷѹۿ| պƷav| 99߾ƷƵۿ| ˵վ| ձһ | Ʒһ16| ۺɫӰ| ѹۿƵվ| Ʒպþ| һ| ƷƵѲ| þۺ³³| 쿴ѸӰ| ƵƵ| Ůbbbbbbbbb| ŮƷþþþþþ| ŷɫƷƵ| ҹþþþƷӰԺ| ëƬֻ߿| ҹƷƬѹۿ| ޳Ļ| vavaպ߹ۿ| VAһ| avպۺһ| AVҹӰԺʦӰԺ|