??xml version="1.0" encoding="utf-8" standalone="yes"?>在线91精品亚洲网站精品成人,亚洲精品动漫在线,4338×亚洲全国最大色成网站http://www.tkk7.com/alinglau36/category/38703.htmlone platform thousands thinkingzh-cnFri, 27 Oct 2017 22:21:12 GMTFri, 27 Oct 2017 22:21:12 GMT60newInstance() ?new 有什么区别?(?http://www.tkk7.com/alinglau36/archive/2011/04/14/348306.htmllaulauThu, 14 Apr 2011 09:37:00 GMThttp://www.tkk7.com/alinglau36/archive/2011/04/14/348306.htmlhttp://www.tkk7.com/alinglau36/comments/348306.htmlhttp://www.tkk7.com/alinglau36/archive/2011/04/14/348306.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/348306.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/348306.html 用newInstance与用new是区别的Q区别在于创建对象的方式不一P前者是使用cd载机Ӟ那么Z么会(x)有两U创建对象方式?q个p从可伸羃、可扩展Q可重用{Y件思想上解释了?
Java中工厂模式经怋用newInstance来创建对象,因此从ؓ(f)什么要使用工厂模式上也可以扑ֈ具体{案?
例如Q?
Class c = Class.forName(“A”);factory = (AInterface)c.newInstance();
其中AInterface是A的接口,如果下面q样写,你可能会(x)理解Q?
String className = "A";Class c = Class.forName(className);factory = (AInterface)c.newInstance();
q一步,如果下面写,你可能会(x)理解Q?
String className = readfromXMlConfig;//从xml 配置文g中获得字W串Class c = Class.forName(className);factory = (AInterface)c.newInstance();
上面代码消灭了AcdUͼ优点Q无论AcL么变化Q上qC码不变,甚至可以更换A的兄弟类B , C , D....{,只要他们l承Ainterface可以?
从jvm的角度看Q我们用new的时候,q个要new的类可以没有加蝲Q?
但是使用newInstance时候,必M证:(x)1、这个类已经加蝲Q?、这个类已经q接了。而完成上面两个步骤的正是class的静态方法forNameQ)Ҏ(gu)Q这个静态方法调用了启动cd载器Q就是加载j(lu)ava API的那个加载器Q?/span>?
有了上面jvm上的理解Q那么我们可以这栯QnewInstance实际上是把newq个方式分解Z?卻I首先调用class的加载方法加载某个类Q然后实例化?
q样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灉|性,提供l了我们降耦的手段?

[补充:]
newInstance: q型。低效率。只能调用无参构造?
new: 强类型。相寚w效。能调用Mpublic构造?
newInstance()是实现IOC、反、面Ҏ(gu)口编E??依赖倒置 {技术方法的必然选择Qnew 只能实现具体cȝ实例化,不适合于接口编E?
里面是通过q个cȝ默认构造函数构Z一个对象,如果没有默认构造函数就抛出InstantiationException, 如果没有讉K默认构造函数的权限抛出IllegalAccessException

lau 2011-04-14 17:37 发表评论
]]>
Java正则表达?/title><link>http://www.tkk7.com/alinglau36/archive/2010/10/11/334448.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 11 Oct 2010 08:41:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2010/10/11/334448.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/334448.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2010/10/11/334448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/334448.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/334448.html</trackback:ping><description><![CDATA[<p>知识:(x){} 定义了一个范围  [] 定义了一个字W类 () 定义了一个组 <br /> *前面出现0ơ以?nbsp;  + 前面匚w一ơ以上 ?前面出现0ơ或一?/p> <p><br /> <span style="font-size: medium; color: #0000ff;">1).字符Q?/span> <br /> x------字符x <br /> ""-----反斜?<br /> "0n----十进制数 (0 <= n <= 7) <br /> "0nn---十进制数0nn (0 <= n <= 7) <br /> "0mnn--十进制数0mnn (0 <= m <= 3,0 <= n <= 7) <br /> "xhh---十六q制?0xhh <br /> ""uhhh-十六q制?0uhhh <br /> "t-----制表W?('"u0009') 2) <br /> "n-----换行W?('"u000A') <br /> "r----- 回RW?('"u000D') <br /> "e----- escW号 ('"u001B') <br /> "cx---- x 对应的控制符 <br /> <span style="font-size: medium; color: #0000ff;">2).字符c:(x) </span><br /> [abc] a, b, ?c (单字W串) <br /> [^abc] 除了 a, b, ?c 之外的Q意字W?否定) <br /> [a-zA-Z] 从a ?z ?从A ?ZQ包括a,z,A,ZQ?范围) <br /> [a-d[m-p]] 从a ?d, ?从m ?p: [a-dm-p] (q) <br /> [a-z&&[def]] d, e, ?f (交集) <br /> [a-z&&[^bc]] 从a ?z, ?b ?c 除外: [ad-z] (子集) <br /> [a-z&&[^m-p]] 从a ?z, 不包括从 m ?p: [a-lq-z](子集) <br /> <span style="font-size: medium; color: #0000ff;">3).预定义字W序?:</span> <br /> . L字符 (也可能不包括行结束符) <br /> "d 数字: [0-9] <br /> "D 非数? [^0-9] <br /> "s I字W? [ "t"n"x0B"f"r](A whitespace character) <br /> "S 非空字符: [^"s] <br /> "w 单字字符: [a-zA-Z_0-9] <br /> "W 非单字字W? [^"w] <br /> <span style="font-size: medium; color: #0000ff;">4).POSIX 字符c?(US-ASCII only) :</span> <br /> "p{Lower} 写字母字符: [a-z] <br /> "p{Upper} 大写字母字符:[A-Z] <br /> "p{ASCII} 所?ASCII:["x00-"x7F] <br /> "p{Alpha} 单个字母字符:["p{Lower}"p{Upper}] <br /> "p{Digit} 十进制数: [0-9] <br /> "p{Alnum} 单个字符:["p{Alpha}"p{Digit}] <br /> "p{Punct} 标点W号: 包括 !"#$%&'()*+,-./:;<=>?@["]^_`{|}~ <br /> "p{Graph} 可视字符: ["p{Alnum}"p{Punct}] <br /> "p{Print} 可打印字W? ["p{Graph}] <br /> "p{Blank} I格或制表符: [ "t] <br /> "p{Cntrl} 控制字符: ["x00-"x1F"x7F] <br /> "p{XDigit} 十六q制? [0-9a-fA-F] <br /> "p{Space} I字W? [ "t"n"x0B"f"r] <br /> <span style="font-size: medium; color: #0000ff;">5). Unicode 字符c?</span> <br /> "p{InGreek} 希腊语种的字W?(simple block) <br /> "p{Lu} 大写字母 (simple category) <br /> "p{Sc} 货币W号 <br /> "P{InGreek} 除希腊语U字W外的Q意字W?(negation) <br /> ["p{L}&&[^"p{Lu}]] 除大写字母外的Q意字W?(subtraction) <br /> <span style="font-size: medium; color: #0000ff;">6). 边界匚w?</span> <br /> ^ 一行的开?<br /> $ 一行的l束 <br /> "b 单词边界 <br /> "B 非单词边?<br /> "A 输入的开?<br /> "G 当前匚w的结?<br /> "Z The end of the input but for the final terminator, if any <br /> "z 输入的结?<br /> <span style="font-size: medium; color: #0000ff;">6).Greedy quantifiers 贪婪匚w量词:</span> <br /> X? X不出现或出现一?(Ҏ(gu)字符"?"与{0,1}是相{的) <br /> X* X不出现或出现多次 (Ҏ(gu)字符"*"与{0,}是相{的) <br /> X+ X臛_出现一?(Ҏ(gu)字符"+"?{1,}是相{的) <br /> X{n} X出现n?<br /> X{n,} X臛_出现n?<br /> X{n,m} X臛_出现nơ,但不?x)超qm?<br /> <span style="font-size: medium; color: #0000ff;">7).Reluctant quantifiers:</span> <br /> X?? X, 不出现或出现一?<br /> X*? X, 不出现或出现多次 <br /> X+? X, 臛_出现一?<br /> X{n}? X, 出现n?<br /> X{n,}? X, 臛_出现n?<br /> X{n,m}? X, 臛_出现nơ,但不?x)超qm?<br /> <span style="font-size: medium; color: #0000ff;">8).Possessive quantifiers:</span> <br /> X?+ X, 不出现或出现一?<br /> X*+ X, 不出现或出现多次 <br /> X++ X, 臛_出现一?<br /> X{n}+ X, 出现n?<br /> X{n,}+ X, 臛_出现n?<br /> X{n,m}+ X, 臛_出现nơ,但不?x)超qm?<br /> <span style="font-size: medium; color: #0000ff;">9).逻辑q算W?</span> <br /> XY Y跟在X后面 <br /> X|Y X ?Y <br /> (X) X, as a capturing group <br /> <span style="font-size: medium; color: #0000ff;">10).反向引用:</span> <br /> "n Whatever the nth capturing group matched <br /> <span style="font-size: medium; color: #0000ff;">11).Quotation:</span> <br /> " 引用后面的字W?<br /> "Q 引用所有的字符直到 "E 出现 <br /> "E l束?"Q 开始的引用 <br /> <span style="font-size: medium; color: #0000ff;">12).Special constructs (non-capturing):</span> <br /> (?:X) X, as a non-capturing group <br /> (?idmsux-idmsux) 匚w标志开?<br /> (?idmsux-idmsux:X) X, as a non-capturing group with the given flags on <br /> (?=X) X, via zero-width positive lookahead - off <br /> (?!X) X, via zero-width negative lookahead <br /> (? <=X) X, via zero-width positive lookbehind <br /> (?(? > X) X, as an independent, non-capturing group </p> <hr /> <p><br /> <span style="font-size: medium; color: #0000ff;">1).Backslashes, escapes, and quoting</span> <br /> ? 斜杠字符('"')用来转义Q就像上面的表中定义的那P如果不这样做的话可能?x)?歧义。因此,表达?"匚w 单个反斜杠,表达?{匚w单个左花括号?如果把反斜杠攑֜没有定义转移构造的M字母W号前面都会(x)发生错误Q这些将被保? C后的正则表达式中扩展。反斜杠可以攑֜M 非字母符号前面,即它没有定义{义构造也不会(x)发生错误? 在java语言规范中指出,在java代码中自W串中的反斜杠是必要的,不管用于Unicode?义,q是用于普通的字符转义。因此, Z保持正则表达式的完整性,在java字符串中要写两个反斜杠。例如,在正则表辑ּ 中字W?"b'代表退|'""b'则代表单词边界?"(hello")'是无效的Qƈ且会(x)产生~译 旉误,你必ȝ '""(hello"")'来匹?hello)?<br /> <span style="font-size: medium; color: #0000ff;">2).Character Classes</span> <br /> 字符cd以出现在其他字符cd部,q且可以由ƈ操作W和与操作符(&&)l成。ƈ集操 作结果是Q其中的L字符Q肯定在臛_其中操作C臛_出现q一ơ?交集的结果包括各个操作数中同时出现的L字符?<br /> 字符cL作符的优先如下Q(从高CQ?<br /> 1 文字转义 "x <br /> 2 集合 [...] <br /> 3 范围 a-z <br /> 4 q [a-e][i-u] <br /> 5 交集 [a-z&&[aeiou]] <br /> h意各个字W类的有效字W集。例如,在字W类中,正则表达?失去了它的特别含?Q?变成了元字符的范围指C?<br /> <span style="font-size: medium; color: #0000ff;">3).Line terminators</span> <br /> 行结束符是一个或两个字符序列Q用来标识输入字W序列的一行的l束。下列都被认?是行l束W:(x) <br /> 换行W?('"n'), <br /> 回R换行W?(""r"n"), <br /> 回RW?('"r'), <br /> 下一?('"u0085'), <br /> 行分隔符 ('"u2028'), 或段分隔W?('"u2029). <br /> 如果ȀzM UNIX_LINES 模式Q唯一的行l束W就是换行符?<br /> 除非你指定了 DOTALL 标志Q否则正则表辑ּ.匚wM字符Q只有行l束W除外?<br /> 省情况Ӟ在整个输入队列中Q正则表辑ּ^?忽略行结束符Q只匚w开始和l束?<br /> 如果ȀzM MULTILINE 模式Q则^匚w输入的开始和所有行l束W之后,除了整个输入 的结束?<br /> 在MULTILINE 模式下,$匚w所有行l束W之前,和整个输入的l束?<br /> </p> <p><span style="font-size: medium; color: #0000ff;">4).Groups and capturing</span> <br /> 分组捕获通过从左到右的顺序,Ҏ(gu)括号的数量类排序。例如,在表辑ּ((A)(B(C)))中,有四个组Q?<br /> 1     ((A)(B(C))) <br /> 2     (A) <br /> 3     (B(C)) <br /> 4     (C) <br /> 0l代表整个表辑ּ?<br /> ? l捕获之所以如此命名,是因为在匚wq程中,输入序列的每一个与分组匚w的子? 列都?x)被保存h。通过向后引用Q被捕获的子序列可以在后面的表达式中被再ơ用。而且Q在匚w操作l束以后q可以通过匚w器重新找到。与一个分l关联的 被捕获到的输入通常是被保存的最q与q个分组相匹配的队列的子队列。如果一个分l被W二ơ求|即p|Q它的上一ơ被捕获的g?x)被保存h?<br /> 例如Q表辑ּ(a(b)?)+匚w"aba"Q?b"设ؓ(f)子分l。在开始匹配的时候,以前被捕L(fng)输入都将被清除。以(?开始的分组是完全的Q无需捕获的分l不?x)捕获Q何文本,也不?x)计分lL?/p> <p><span style="font-size: medium; color: #0000ff;">5).Unicode support</span> <br /> <br /> Unicode Technical Report #18: Unicode Regular Expression Guidelines通过d的语法改变实C更深层次的支持?<br /> 在java代码中,?u2014 q样的{义序列,java语言规范中?3.3提供了处理方??<br /> Z便于使用从文件或键盘d的unicode转义字符Q正则表辑ּ解析器也直接实现了这U{UR因此,字符?"u2014"?""u2014"虽然不相{,但是~译q同一U模式,可以匚w十六q制?x2014?<br /> ? Perl中,unicode块和分类被写?p,"P。如果输入有prop属性,"p{prop}会(x)匚wQ? ?P{prop}不?x)匹配。块通过前缀In指定Q作为在nMongolian之中。分c通过L的前~Is指定Q?"p{L} ?"p{IsL} 都引?Unicode 字母。块和分cd?被用在字符cȝ内部或外部?<br />   <br /> The Unicode Standard, Version 3.0指出了支持的块和分类。块的名字在W?4章和 Unicode CharacterDatabase中的 Blocks-3.txt 文g定义Q但I格被剔除了。例如Basic Latin"变成?nbsp; "BasicLatin"。分cȝ名字被定义在88,?-5?/p> <img src ="http://www.tkk7.com/alinglau36/aggbug/334448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2010-10-11 16:41 <a href="http://www.tkk7.com/alinglau36/archive/2010/10/11/334448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数组和List之间怺转换的方?/title><link>http://www.tkk7.com/alinglau36/archive/2010/04/02/317278.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Fri, 02 Apr 2010 03:24:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2010/04/02/317278.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/317278.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2010/04/02/317278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/317278.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/317278.html</trackback:ping><description><![CDATA[<h1> <a id="ctl04_TitleUrl" class="postTitle2" >关于数组和List之间怺转换的方?/a> </h1> <p>1.List转换成ؓ(f)数组。(q里的List是实体是ArrayList) </p> <p>调用ArrayList的toArrayҎ(gu)?</p> <p>toArray </p> <p>public T[] toArray(T[] a)q回一个按照正的序包含此列表中所有元素的数组Q返回数l的q行时类型就是指定数l的q行时类型。如果列表能攑օ指定的数l,则返回放入此列表? 素的数组。否则,根据指定数l的q行时类型和此列表的大小分配一个新的数l?</p> <p>如果指定的数l能容纳列表q有剩余I间Q即数组的元素比列表的多Q,那么?x)将数组中紧跟在集合末尾的元素设|ؓ(f) null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含M null 元素时才有用?</p> <p>指定者:(x) </p> <p>接口 Collection 中的 toArray </p> <p>指定者:(x) </p> <p>接口 List 中的 toArray </p> <p>覆盖Q?</p> <p>c?AbstractCollection 中的 toArray </p> <p>参数Q?</p> <p>a - 要存储列表元素的数组Q如果它_大的话;否则Q它是一个ؓ(f)存储列表元素而分配的、具有相同运行时cd的新数组?</p> <p>q回Q?</p> <p>包含列表元素的数l?</p> <p>抛出Q?</p> <p>ArrayStoreException - 如果 a 的运行时cd不是此列表中每个元素的运行时cd的超cd?</p> <p><br /> 具体用法Q?</p> <p>List list = new ArrayList(); </p> <p>list.add("1"); </p> <p>list.add("2"); </p> <p>final int size = list.size(); </p> <p>String[] arr = (String[])list.toArray(new String[size]); </p> <p><br /> 2.数组转换成ؓ(f)List?</p> <p>调用Arrays的asListҎ(gu). </p> <p>asList </p> <p>public static List asList(T... a)q回一个受指定数组支持的固定大的列表。(对返回列表的更改?#8220;直写”到数l。)此方法同 Collection.toArray 一P充当了基于数l的 API 与基?collection ?API 之间的桥梁。返回的列表是可序列化的Qƈ且实C RandomAccess?</p> <p>此方法还提供了一个创建固定长度的列表的便h法,该列表被初始化ؓ(f)包含多个元素Q?</p> <p><br /> List stooges = Arrays.asList("Larry", "Moe", "Curly"); </p> <p><br /> 参数Q?</p> <p>a - 支持列表的数l?</p> <p>q回Q?</p> <p>指定数组的列表视图?</p> <p>另请参见Q?</p> <p>Collection.toArray() </p> <p><br /> 具体用法: </p> <p>String[] arr = new String[] {"1", "2"}; </p> <p>List list = Arrays.asList(arr);  </p> <p>-------------------------------------------------------------------------------------------------------------------------------</p> <p><strong>Arrays.asList is a feature every Java developer should know about. It'll save you from writing code like:</strong></p> <p><strong>List<Foo> foolist = new ArrayList<Foo>();<br /> foolist.add(foo);<br /> return foolist;</strong></p> <p><strong>or maybe</strong></p> <p><strong>if(map.containsKey(id)){<br />       map.get(id).add(foo);<br /> }else{<br />       List<Foo> foolist = new ArrayList<Foo>();<br />       foolist.add(foo);<br />       map.put(id, foo);<br /> }</strong></p> <p><strong>and allow you to write code like:</strong></p> <p><strong>return Arrays.asList(foo);</strong></p> <p><strong>and</strong></p> <p><strong>if(map.containsKey(id))<br />       map.get(id).add(foo);<br /> else<br />       map.put(id, Arrays.asList(foo));</strong></p> <p><strong>Update: I didn't notice that Arrays.asList returns a List that can't be added too. When you try to call add on the returned List, you'll get an UnsupportedOperationException in AbstractList.add. That seemed lame to me, but the List interface does say that add is an "optional operation". For the lists to be mutable, the above code snippets have to be changed to something like:</strong></p> <p><strong>return new ArrayList<Foo>(Arrays.asList(foo));</strong></p> <p><strong>and</strong></p> <p><strong>if(map.containsKey(id))<br />       map.get(id).add(foo);<br /> else<br />       map.put(id, new ArrayList<Foo>(Arrays.asList(foo)));</strong></p> <p><strong>Update: Of course, the more pathalogical example of what Arrays.asList saves you from is:</strong></p> <p><strong>List<Foo> foolist = new ArrayList<Foo>(fooarray.length);<br /> for(int i=0,n=fooarray.length; i<n; i++){<br />       foolist.add(fooarray[i]);<br /> }</strong></p> <p><strong>or</strong></p> <p><strong>List<Foo> foolist = new ArrayList<Foo>(fooarray.length);<br /> for(Foo f : fooarray){<br />       foolist.add(f);<br /> }</strong></p> <p><strong>because that becomes just:</strong></p> <p><strong>List<Foo> foolist = Arrays.asList(fooarray);</strong></p> <img src ="http://www.tkk7.com/alinglau36/aggbug/317278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2010-04-02 11:24 <a href="http://www.tkk7.com/alinglau36/archive/2010/04/02/317278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>错误汇?/title><link>http://www.tkk7.com/alinglau36/archive/2010/03/31/317100.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Wed, 31 Mar 2010 14:11:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2010/03/31/317100.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/317100.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2010/03/31/317100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/317100.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/317100.html</trackback:ping><description><![CDATA[<strong>4.5. 错误</strong><br /> <br /> java.lang.AbstractMethodError<br /> <br /> 抽象Ҏ(gu)错误。当应用试图调用抽象Ҏ(gu)时抛出?br /> <br /> java.lang.AssertionError<br /> <br /> 断言错。用来指CZ个断ap|的情c(din)?br /> <br /> java.lang.ClassCircularityError<br /> <br /> cd@环依赖错误。在初始化一个类Ӟ若检到cM间@环依赖则抛出该异常?br /> <br /> java.lang.ClassFormatError<br /> <br /> cL式错误。当Java虚拟图从一个文件中dJavac,而检到该文件的内容不符合类的有效格式时抛出?br /> <br /> java.lang.Error<br /> <br /> 错误。是所有错误的基类Q用于标识严重的E序q行问题。这些问题通常描述一些不应被应用E序捕获的反常情c(din)?br /> <br /> java.lang.ExceptionInInitializerError<br /> <br /> 初始化程序错误。当执行一个类的静态初始化E序的过E中Q发生了异常时抛出。静态初始化E序是指直接包含于类中的static语句Dc(din)?br /> <br /> java.lang.IllegalAccessError<br /> <br /> q法讉K错误。当一个应用试图访问、修Ҏ(gu)个类的域QF(tun)ieldQ或者调用其Ҏ(gu)Q但是又q反域或Ҏ(gu)的可见性声明,则抛异常?br /> <br /> java.lang.IncompatibleClassChangeError<br /> <br /> 不兼容的cd化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时Q抛异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新~译而直接运行的情况下,Ҏ(gu)引发该错误?br /> <br /> java.lang.InstantiationError<br /> <br /> 实例化错误。当一个应用试N过Java的new操作W构造一个抽象类或者接口时抛出该异?<br /> <br /> java.lang.InternalError<br /> <br /> 内部错误。用于指CJava虚拟机发生了内部错误?br /> <br /> java.lang.LinkageError<br /> <br /> 链接错误。该错误?qing)其所有子cLC某个类依赖于另外一些类Q在该类~译之后Q被依赖的类改变了其cd义而没有重新编译所有的c,q而引发错误的情况?br /> <br /> java.lang.NoClassDefFoundError<br /> <br /> 未找到类定义错误。当Java虚拟机或者类装蝲器试囑֮例化某个c,而找不到该类的定义时抛出该错误?br /> <br /> java.lang.NoSuchFieldError<br /> <br /> 域不存在错误。当应用试图讉K或者修Ҏ(gu)cȝ某个域,而该cȝ定义中没有该域的定义时抛错误?br /> <br /> java.lang.NoSuchMethodError<br /> <br /> Ҏ(gu)不存在错误。当应用试图调用某类的某个方法,而该cȝ定义中没有该Ҏ(gu)的定义时抛出该错误?br /> <br /> java.lang.OutOfMemoryError<br /> <br /> 内存不错误。当可用内存不以让Java虚拟机分配给一个对象时抛出该错误?br /> <br /> java.lang.StackOverflowError<br /> <br /> 堆栈溢出错误。当一个应用递归调用的层ơ太p导致堆栈溢出时抛出该错误?br /> <br /> java.lang.ThreadDeath<br /> <br /> U程l束。当调用ThreadcȝstopҎ(gu)时抛错误Q用于指C线E结束?br /> <br /> java.lang.UnknownError<br /> <br /> 未知错误。用于指CJava虚拟机发生了未知严重错误的情c(din)?br /> <br /> java.lang.UnsatisfiedLinkError<br /> <br /> 未满的链接错误。当Java虚拟机未扑ֈ某个cȝ声明为nativeҎ(gu)的本a定义时抛出?br /> <br /> java.lang.UnsupportedClassVersionError<br /> <br /> 不支持的cȝ本错误。当Java虚拟图从d某个cLӞ但是发现该文件的丅R次版本号不被当前Java虚拟机支持的时候,抛出该错误?br /> <br /> java.lang.VerifyError<br /> <br /> 验证错误。当验证器检到某个cL件中存在内部不兼Ҏ(gu)者安全问题时抛出该错误?br /> <br /> java.lang.VirtualMachineError<br /> <br /> 虚拟机错误。用于指C拟机被破坏或者l执行操作所需的资源不的情况?br /> <strong>4.6. 注解W号cd</strong><br /> <br /> java.lang.Deprecated<br /> <br /> 被废弃。用于指C出于安全或者有了更好的替代Ҏ(gu){原因而不鼓励再用的E序元素。当使用或者在未废弃的代码中覆盖被声明为Deprecated的程序元素时Q编译器?x)发告?br /> <br /> java.lang.Override<br /> <br /> 覆盖。用于指C某个类的方法被声明求覆盖其父类的同一Ҏ(gu)的情c(din)如果一个方法被声明覆盖cdQ而没有真正覆盖其父类的同一Ҏ(gu)Q那么编译器必须产生一个错误信息?br /> <br /> java.lang.SuppressWarnings<br /> <br /> 消除警告。用于指C在被注解的E序元素中消除某些特定的命名警告。该注解大多用于深深地被嵌套的元素上? <img src ="http://www.tkk7.com/alinglau36/aggbug/317100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2010-03-31 22:11 <a href="http://www.tkk7.com/alinglau36/archive/2010/03/31/317100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java enum 学习(fn)http://www.tkk7.com/alinglau36/archive/2009/12/21/306821.htmllaulauMon, 21 Dec 2009 08:41:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/12/21/306821.htmlhttp://www.tkk7.com/alinglau36/comments/306821.htmlhttp://www.tkk7.com/alinglau36/archive/2009/12/21/306821.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/306821.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/306821.html阅读全文

lau 2009-12-21 16:41 发表评论
]]>
|络~程之同步,dQ异步,非阻?/title><link>http://www.tkk7.com/alinglau36/archive/2009/06/11/281399.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Thu, 11 Jun 2009 03:26:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2009/06/11/281399.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/281399.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2009/06/11/281399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/281399.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/281399.html</trackback:ping><description><![CDATA[<p><font color="#ff0000">{案一Q?br /> </font>1.异步传输 <br /> <br /> 通常Q异步传输是以字Wؓ(f)传输单位Q每个字 W都要附?1 位v始位?1 位停止位Q以标记一个字W的开始和l束Qƈ以此实现数据传输同步。所谓异步传输是指字W与字符(一个字W结束到下一个字W开?之间的时间间隔是可变的, q不需要严格地限制它们的时间关pRv始位对应于二q制?0Q以低电(sh)qC,占用 1 位宽度。停止位对应于二q制?1Q以高电(sh)qC,占用 1~2 位宽度。一个字W占?5~8位,具体取决于数据所采用的字W集。例如,甉|码字Wؓ(f) 5 位、ASCII码字Wؓ(f) 7 位、汉字码则ؓ(f)8 位。此外,q要附加 1 位奇偶校验位Q可以选择奇校验或偶校验方式对该字W实施简单的差错控制。发送端与接收端除了采用相同的数据格?字符的位数、停止位的位数、有无校验位? 校验方式{?外,q应当采用相同的传输速率。典型的速率有:(x)9 600 b/s?9.2kb/s?6kb/s{?<br /> <br /> 异步传输又称? h式异步通信方式Q其优点是简单、可靠,适用于面向字W的、低速的异步通信场合。例如,计算ZModem之间的通信是采用q种方式。它的缺Ҏ(gu)通信 开销大,每传输一个字W都要额外附??位,通信效率比较低。例如,在用Modem上网Ӟ普遍感觉速度很慢Q除了传输速率低之外,与通信开销大、? 信效率低也密切相兟?<br /> <br /> <br /> -------------------------------------------------------------------------------- <br /> <br /> 2. 同步传输 <br /> <br /> ? 常,同步传输是以数据块ؓ(f)传输单位。每个数据块的头部和N都要附加一个特D的字符或比特序列,标记一个数据块的开始和l束Q一般还要附加一个校验序? (?6位或32位CRC校验?Q以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的旉? pR?nbsp;<br /> <br /> <font color="#ff0000">{案二:(x)<br /> </font><font color="#000000">误详细一些,本h比较弱智Q谢谢各? <br /> ---------------------------------------------------------------  <br />  <br /> 同步是阻塞模式,异步是非d模式? <br /> ---------------------------------------------------------------  <br />  <br /> 我的理解Q同步是指两个线E的q行是相关的Q其中一个线E要d{待另外一个线E的q行。异步的意思是两个U程毫无相关Q自p行自q? <br />  <br /> 不知寚wQ楼下说  <br /> ---------------------------------------------------------------  <br />  <br /> 同步是指Q发送方发出数据后,{接收方发回响应以后才发下一个数据包的通讯方式? <br /> 异步是指Q发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式? <br />  <br /> CSDN上有讨论q?  <br /> http://expert.csdn.net/Expert/topic/2646/2646592.xml?temp=.3842584  <br /> http://expert.csdn.net/Expert/topic/2659/2659726.xml?temp=.1480219  <br /> ---------------------------------------------------------------  <br />  <br /> 举个不太恰当的例?像:  <br /> SendMessage(...)  <br /> TRACE0("just  like  send");  <br />  <br /> PostMessage(...)  <br /> TRACE0("just  like  WSASend  using  overlapped");  <br />  <br /> SendMessage是调用的时候不q回,{消息响应后才执行TRACE0,q就是同?  <br /> PostMessage是调用后马上q回,不用消息响应执行TRACE0,q就是异?<br /> <br /> <font color="#ff0000">{案三:(x)<br /> </font> </font></p> <div><font color="#000000"><a href="mhtml:%3E%3Cimg%20height=" return="" bbimg(this)?="" 13?="" src="mhtml:%20onmousewheel=" onload="javascript :if(this.width border='0' title='点击在新H口查看原始囄' onload='java_script_:if(this.width>500)this.width=500'>screen.width-500)this.style.width=screen.width-500;"> 同步和异步的区别</a> </font></div> <p><font color="#000000"> 举个例子Q普通B/S模式Q同步)AJAX技术(异步Q?br /> 同步Q提交请?>{待服务器处?>处理完毕q回 q个期间客户端浏览器不能qQ何事<br /> 异步: h通过事g触发->服务器处理(q是览器仍然可以作其他事情Q?>处理完毕<br /> --------------------------------------------------------------------------------------------------------------------<br /> 同步是你叫我去吃饭Q我听到了就和你d饭;如果没有听到Q你׃停的叫,直到我告诉你听到了,才一起去吃饭?br /> 异步是你叫我,然后自己d饭,我得到消息后可能立即赎ͼ也可能等C班才d饭?/font></p> <p><font color="#000000">所以,要我请你吃饭q同步的方法,要请我吃饭就用异步的Ҏ(gu)Q这样你可以省钱?br /> --------------------------------------------------------------------------------------------------------------------<br /> 举个例子 打电(sh)话时同步 发消息是异步</font></p> <p><font color="#000000"><br /> </font></p> <p>同步Q函数没有执行完不返回,U程被挂?</p> <p>dQ没有收完数据函Cq回Q线E也被挂?/p> <p>异步Q函数立卌回,通过事g或是信号通知调用?/p> <p>非阻塞:(x)函数立即q回Q通过select通知调用?/p> <p>q样看来异步和非d有什么区别呢Q?/p> <p>异步=非阻塞?</p> <p>同步是在操作pȝ层面上,d是在套接字上Q?/p> <p>Reactor是同?Proactor是异步?</p> <p><strong>回答Q?/strong></p> <p>同步、异步、阻塞和非阻塞的概念</p> <p>  在进行网l编E时Q我们常常见到同步、异步、阻塞和非阻塞四U调用方式。这些方式彼此概念ƈ不好理解。下面是我对q些术语的理解?/p> <p><strong>同步</strong><br /> 所谓同步,是在发Z个功能调用时Q在没有得到l果之前Q该调用׃q回。按照这个定义,? 实绝大多数函数都是同步调用(例如sin, isdigit{)。但是一般而言Q我们在说同步、异步的时候,Ҏ(gu)那些需要其他部件协作或者需要一定时间完成的d。最常见的例子就? SendMessage。该函数发送一个消息给某个H口Q在Ҏ(gu)处理完消息之前,q个函数不返回。当Ҏ(gu)处理完毕以后Q该函数才把消息处理函数所q回? LRESULTD回给调用者?/p> <p><strong>异步</strong><br /> 异步的概念和同步相对。当一个异步过E调用发出后Q调用者不能立d到结果。实际处理这个调? 的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocketcMؓ(f)例(注意QCSocket从CAsyncSocketzQ但是v功能已经由异步{化ؓ(f)同步Q,当一个客L(fng)通过调用 Connect函数发出一个连接请求后Q调用者线E立d以朝下运行。当q接真正建立h以后Qsocket底层?x)发送一个消息通知该对象。这里提到执? 部g和调用者通过三种途径q回l果Q状态、通知和回调。可以用哪一U依赖于执行部g的实玎ͼ除非执行部g提供多种选择Q否则不受调用者控制。如果执行部 件用状态来通知Q那么调用者就需要每隔一定时间检查一ơ,效率很低(有些初学多线E编E的人,dƢ用一个@环去查某个变量的|q其实是一U很严重 的错误)。如果是使用通知的方式,效率则很高,因ؓ(f)执行部g几乎不需要做额外的操作。至于回调函敎ͼ其实和通知没太多区别?/p> <p><strong>d</strong><br /> d调用是指调用l果q回之前Q当前线E会(x)被挂赗函数只有在得到l果之后才会(x)q回。有Z? ?x)把d调用和同步调用等同v来,实际上他是不同的。对于同 步调用来_(d)很多时候当前线E还是激zȝQ只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数Q如果缓冲区中没有数 据,q个函数׃(x)一直等待,直到有数据才q回。而此Ӟ当前U程q会(x)l箋处理各种各样的消息。如果主H口和调用函数在同一个线E中Q除非你在特D的界面? 作函C调用Q其实主界面q是应该可以h。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函敎ͼ则当前线E就?x)被挂vQ直到有数据为止?/p> <p><strong>非阻?/strong><br /> 非阻塞和d的概늛对应Q指在不能立d到结果之前,该函C?x)阻塞当前线E,而会(x)立刻q回?/p> <p>  对象的阻塞模式和d函数调用<br /> 对象是否处于d模式和函数是不是d调用有很强的相关性,但是q不是一一对应的。阻塞对象上可以? 非阻塞的调用方式Q我们可以通过一定的API去轮询状 态,在适当的时候调用阻塞函敎ͼ可以避免阻塞。而对于非d对象Q调用特D的函数也可以进入阻塞调用。函数select是q样的一个例子?/p> <img src ="http://www.tkk7.com/alinglau36/aggbug/281399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2009-06-11 11:26 <a href="http://www.tkk7.com/alinglau36/archive/2009/06/11/281399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringUtils工具cȝ常用Ҏ(gu)http://www.tkk7.com/alinglau36/archive/2009/04/10/264885.htmllaulauFri, 10 Apr 2009 09:03:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/04/10/264885.htmlhttp://www.tkk7.com/alinglau36/comments/264885.htmlhttp://www.tkk7.com/alinglau36/archive/2009/04/10/264885.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/264885.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/264885.html

StringUtils工具cȝ常用Ҏ(gu)

关键? stringutils

StringUtils Ҏ(gu)的操作对象是 java.lang.String cd的对象,?JDK 提供?String cd操作Ҏ(gu)的补充,q且?null 安全?卛_果输入参?String ?null 则不?x)抛?nbsp; NullPointerException Q而是做了相应处理Q例如,如果输入?null 则返回也? null {,具体可以查看源代??br />
除了构造器Q?span style="font-family: verdana,geneva;">StringUtils
中一共有130多个Ҏ(gu)Qƈ且都?static 的,所以我们可以这栯?StringUtils.xxx()

下面分别对一些常用方法做要介l:(x)

1. public static boolean isEmpty(String str)
   判断某字W串是否为空Qؓ(f)I的标准?str==null ?str.length()==0
   下面?StringUtils 判断是否为空的示例:(x)

StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true

StringUtils.isEmpty(" ") = false
//注意?StringUtils 中空g非空处理
StringUtils.isEmpty("   ") = false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false

2. public static boolean isNotEmpty(String str)
   判断某字W串是否非空Q等?!isEmpty(String str)
   下面是示例:(x)

      StringUtils.isNotEmpty(null) = false
      StringUtils.isNotEmpty("") = false
      StringUtils.isNotEmpty(" ") = true
      StringUtils.isNotEmpty("         ") = true
      StringUtils.isNotEmpty("bob") = true
      StringUtils.isNotEmpty(" bob ") = true

3. public static boolean isBlank(String str)
   判断某字W串是否为空或长度ؓ(f)0或由I白W?span style="font-family: verdana,geneva;">(whitespace)
构成
   下面是示例:(x)
      StringUtils.isBlank(null) = true
      StringUtils.isBlank("") = true
      StringUtils.isBlank(" ") = true
      StringUtils.isBlank("        ") = true
      StringUtils.isBlank(""t "n "f "r") = true
  //对于制表W、换行符、换늬和回车符

      StringUtils.isBlank()   //均识为空白符
      StringUtils.isBlank(""b") = false   //""b"为单词边界符
      StringUtils.isBlank("bob") = false
      StringUtils.isBlank(" bob ") = false


4. public static boolean isNotBlank(String str)
   判断某字W串是否不ؓ(f)IZ长度不ؓ(f)0且不q白符(whitespace) 构成Q等?!isBlank(String str)
   下面是示例:(x)

      StringUtils.isNotBlank(null) = false
      StringUtils.isNotBlank("") = false
      StringUtils.isNotBlank(" ") = false
      StringUtils.isNotBlank("         ") = false
      StringUtils.isNotBlank(""t "n "f "r") = false
      StringUtils.isNotBlank(""b") = true
      StringUtils.isNotBlank("bob") = true
      StringUtils.isNotBlank(" bob ") = true

5. public static String trim(String str)
   L字符串两端的控制W?span style="font-family: verdana,geneva;">(control characters, char <= 32)
, 如果输入?null 则返?span style="font-family: verdana,geneva;">null
   下面是示例:(x)
      StringUtils.trim(null) = null
      StringUtils.trim("") = ""
      StringUtils.trim(" ") = ""
      StringUtils.trim("  "b "t "n "f "r    ") = ""
      StringUtils.trim("     "n"tss   "b") = "ss"
      StringUtils.trim(" d   d dd     ") = "d   d dd"
      StringUtils.trim("dd     ") = "dd"
      StringUtils.trim("     dd       ") = "dd"

6. public static String trimToNull(String str)
   L字符串两端的控制W?span style="font-family: verdana,geneva;">(control characters, char <= 32)
,如果变ؓ(f) null ?"Q则q回 null
   下面是示例:(x)
      StringUtils.trimToNull(null) = null
      StringUtils.trimToNull("") = null
      StringUtils.trimToNull(" ") = null
      StringUtils.trimToNull("     "b "t "n "f "r    ") = null
      StringUtils.trimToNull("     "n"tss   "b") = "ss"
      StringUtils.trimToNull(" d   d dd     ") = "d   d dd"
      StringUtils.trimToNull("dd     ") = "dd"
      StringUtils.trimToNull("     dd       ") = "dd"

7. public static String trimToEmpty(String str)
   L字符串两端的控制W?span style="font-family: verdana,geneva;">(control characters, char <= 32)
,如果变ؓ(f) null ?"" Q则q回 ""
   下面是示例:(x)
      StringUtils.trimToEmpty(null) = ""
      StringUtils.trimToEmpty("") = ""
      StringUtils.trimToEmpty(" ") = ""
      StringUtils.trimToEmpty("     "b "t "n "f "r    ") = ""
      StringUtils.trimToEmpty("     "n"tss   "b") = "ss"
      StringUtils.trimToEmpty(" d   d dd     ") = "d   d dd"
      StringUtils.trimToEmpty("dd     ") = "dd"
      StringUtils.trimToEmpty("     dd       ") = "dd"

8. public static String strip(String str)

   L字符串两端的I白W?span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)
Q如果输入ؓ(f) null 则返?null
   下面是示?注意?span style="color: #0000ff; font-family: verdana,geneva;"> trim() 的区?Q?br />       StringUtils.strip(null) = null
      StringUtils.strip("") = ""
      StringUtils.strip(" ") = ""
      StringUtils.strip("     "b "t "n "f "r    ") = ""b"
      StringUtils.strip("     "n"tss   "b") = "ss   "b"
      StringUtils.strip(" d   d dd     ") = "d   d dd"
      StringUtils.strip("dd     ") = "dd"
      StringUtils.strip("     dd       ") = "dd"

9. public static String stripToNull(String str)
   L字符串两端的I白W?span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)
Q如果变? null ?"Q则q回 null
   下面是示?注意?trimToNull() 的区?Q?br />       StringUtils.stripToNull(null) = null
      StringUtils.stripToNull("") = null
      StringUtils.stripToNull(" ") = null
      StringUtils.stripToNull("     "b "t "n "f "r    ") = ""b"
      StringUtils.stripToNull("     "n"tss   "b") = "ss   "b"
      StringUtils.stripToNull(" d   d dd     ") = "d   d dd"
      StringUtils.stripToNull("dd     ") = "dd"
      StringUtils.stripToNull("     dd       ") = "dd"

10. public static String stripToEmpty(String str)
    L字符串两端的I白W?span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)
Q如果变?span style="font-family: verdana,geneva;"> null ?span style="font-family: verdana,geneva;">"" Q则q回""
    下面是示?注意?trimToEmpty() 的区?Q?br />       StringUtils.stripToNull(null) = ""
      StringUtils.stripToNull("") = ""
      StringUtils.stripToNull(" ") = ""
      StringUtils.stripToNull("     "b "t "n "f "r    ") = ""b"
      StringUtils.stripToNull("     "n"tss   "b") = "ss   "b"
      StringUtils.stripToNull(" d   d dd     ") = "d   d dd"
      StringUtils.stripToNull("dd     ") = "dd"
      StringUtils.stripToNull("     dd       ") = "dd"

以下Ҏ(gu)只介l其功能Q不再D例:(x)
11. public static String strip(String str, String stripChars)
   L str 两端的在 stripChars 中的字符?br />    如果 str ?null 或等?span style="font-family: verdana,geneva;">""
Q则q回它本w;
   如果 stripChars ?null ?span style="font-family: verdana,geneva;">"" Q则q回 strip(String str) ?br />
12. public static String stripStart(String str, String stripChars)
    ?1怼Q去?span style="font-family: verdana,geneva;"> str 前端的在 stripChars 中的字符?br />
13. public static String stripEnd(String str, String stripChars)
    ?1怼Q去?str 末端的在 stripChars 中的字符?br />
14. public static String[] stripAll(String[] strs)
    对字W串数组中的每个字符串进? strip(String str) Q然后返回?br />     如果 strs ?null ?strs 长度?Q则q回 strs 本n

15. public static String[] stripAll(String[] strs, String stripChars)
    对字W串数组中的每个字符串进?strip(String str, String stripChars) Q然后返回?br />     如果 strs ?null ?strs 长度?Q则q回 strs 本n

16. public static boolean equals(String str1, String str2)
    比较两个字符串是否相{,如果两个均ؓ(f)I则也认为相{?br />
17. public static boolean equalsIgnoreCase(String str1, String str2)
    比较两个字符串是否相{,不区分大写Q如果两个均为空则也认ؓ(f)相等?br />
18. public static int indexOf(String str, char searchChar)
    q回字符 searchChar 在字W串 str 中第一ơ出现的位置?br />     如果 searchChar 没有?str 中出现则q回-1Q?br />     如果 str ?null ?"" Q则也返?1

19. public static int indexOf(String str, char searchChar, int startPos)
    q回字符 searchChar ?startPos 开始在字符?str 中第一ơ出现的位置?br />     如果?startPos 开?searchChar 没有?span style="font-family: verdana,geneva;"> str 中出现则q回-1Q?br />     如果 str ?null ?"" Q则也返?1

20. public static int indexOf(String str, String searchStr)
    q回字符? searchStr 在字W串 str 中第一ơ出现的位置?br />     如果 str ?null ?searchStr ?null 则返?1Q?br />     如果 searchStr ?"" ,?span style="font-family: verdana,geneva;"> str Z?null Q则q回0Q?br />     如果 searchStr 不在 str 中,则返?1

21. public static int ordinalIndexOf(String str, String searchStr, int ordinal)
    q回字符?searchStr 在字W串 str 中第 ordinal ơ出现的位置?br />     如果 str=null ?searchStr=null ?ordinal<=0 则返?1
    举例(*代表L字符?Q?br />       StringUtils.ordinalIndexOf(null, *, *) = -1
      StringUtils.ordinalIndexOf(*, null, *) = -1
      StringUtils.ordinalIndexOf("", "", *) = 0
      StringUtils.ordinalIndexOf("aabaabaa", "a", 1) = 0
      StringUtils.ordinalIndexOf("aabaabaa", "a", 2) = 1
      StringUtils.ordinalIndexOf("aabaabaa", "b", 1) = 2
      StringUtils.ordinalIndexOf("aabaabaa", "b", 2) = 5
      StringUtils.ordinalIndexOf("aabaabaa", "ab", 1) = 1
      StringUtils.ordinalIndexOf("aabaabaa", "ab", 2) = 4
      StringUtils.ordinalIndexOf("aabaabaa", "bc", 1) = -1
      StringUtils.ordinalIndexOf("aabaabaa", "", 1) = 0
      StringUtils.ordinalIndexOf("aabaabaa", "", 2) = 0

22. public static int indexOf(String str, String searchStr, int startPos)
    q回字符?searchStr ?startPos 开始在字符?str 中第一ơ出现的位置?br />     举例(*代表L字符?Q?br />
      StringUtils.indexOf(null, *, *) = -1
      StringUtils.indexOf(*, null, *) = -1
      StringUtils.indexOf("", "", 0) = 0
      StringUtils.indexOf("aabaabaa", "a", 0) = 0
      StringUtils.indexOf("aabaabaa", "b", 0) = 2
      StringUtils.indexOf("aabaabaa", "ab", 0) = 1
      StringUtils.indexOf("aabaabaa", "b", 3) = 5
      StringUtils.indexOf("aabaabaa", "b", 9) = -1
      StringUtils.indexOf("aabaabaa", "b", -1) = 2
      StringUtils.indexOf("aabaabaa", "", 2) = 2
      StringUtils.indexOf("abc", "", 9) = 3

23. public static int lastIndexOf(String str, char searchChar)

    基本原理?8

24. public static int lastIndexOf(String str, char searchChar, int startPos)
    基本原理?9

25. public static int lastIndexOf(String str, String searchStr)
    基本原理?0

26. public static int lastIndexOf(String str, String searchStr, int startPos)
    基本原理?2

另附Q?br />
String ?split(String regex)   Ҏ(gu)的用?br /> 如果我们需要把某个字符串拆分ؓ(f)字符串数l,则通常?span style="font-family: verdana,geneva;"> split(String regex)
来实现?br />
例如Q?br />

Java代码 复制代码
  1. String str = "aa,bb,cc,dd";      
  2. String[] strArray = str.split(",");       
  3. System.out.println(strArray.length);      
  4.   for (int i = 0; i < strArray.length; i++) {      
  5.        System.out.println(strArray[i]);      
  6. }  
String str = "aa,bb,cc,dd";
String[] strArray = str.split(",");
System.out.println(strArray.length);
for (int i = 0; i < strArray.length; i++) {
System.out.println(strArray[i]);
}
 

l果为:(x)
4
aa
bb
cc
dd

如果Q?br /> String str = "aa.bb.cc.dd";
String[] strArray = str.split(".");


则结果ؓ(f)Q?

Z么结果不是我们所想的呢,原因是参?span style="font-family: verdana,geneva;"> String regex
是正则表辑ּ (regular expression) 而不是普通字W串Q?"." 在正则表辑ּ中有Ҏ(gu)含义Q表C匹配所有单个字W。如果要那样拆分Q我们必ȝ "." q行转义Q?span style="font-family: verdana,geneva;">String[] strArray = str.split(".") 修改?String[] strArray = str.split(""".") 卛_?br /> 另外有关 StringUtils 的详l?API 请参见官方网?span style="font-family: arial,helvetica,sans-serif;">: http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html



lau 2009-04-10 17:03 发表评论
]]>
javal典基础http://www.tkk7.com/alinglau36/archive/2009/03/30/262887.htmllaulauMon, 30 Mar 2009 06:55:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/30/262887.htmlhttp://www.tkk7.com/alinglau36/comments/262887.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/30/262887.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/262887.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/262887.html对于q个pd里的问题Q每个学Java的h都应该搞懂。当Ӟ如果只是学Java玩玩无所谓了。如果你认ؓ(f)自己已经越初学者了Q却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老脓(chung)?/font>

        问题一Q我声明了什么!

       String s = "Hello world!";

       许多人都做过q样的事情,但是Q我们到底声明了什么?回答通常是:(x)一个StringQ内Ҏ(gu)“Hello world!”。这hp的回答通常是概念不清的Ҏ(gu)。如果要准确的回{,一半的人大概会(x)回答错误?br /> q个语句声明的是一个指向对象的引用Q名?#8220;s”Q可以指向类型ؓ(f)String的Q何对象,目前指向"Hello world!"q个Stringcd的对?/strong>?/font>q就是真正发生的事情。我们ƈ没有声明一个String对象Q我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:(x)

      String string = s;

      我们是声明了另外一个只能指向String对象的引用,名ؓ(f)stringQƈ没有W二个对象生,stringq是指向原来那个对象Q也是Q和s指向同一个对象?br />
     
问题二:(x)"=="和equalsҎ(gu)I竟有什么区别?

      ==操作W专门用来比较变量的值是否相{。比较好理解的一Ҏ(gu)Q?br />       int a=10;
      int b=10;
      则a==b是true?br />       但不好理解的地方是:(x)
      String a=new String("foo");
      String b=new String("foo");
      则a==b返回false?br />
      Ҏ(gu)前一帖说q,对象变量其实是一个引用,它们的值是指向对象所在的内存地址Q而不是对象本w。a和b都用了new操作W,意味着在内存中生两个内容ؓ(f)"foo"的字W串Q既然是“两个”Q它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的|所以?=="操作W,l果?x)是false。诚Ӟa和b所指的对象Q它们的内容都是"foo"Q应该是“相等”Q?font color="#ff0000">但是
==操作Wƈ不涉?qing)到对象内容的比较?/strong>对象内容的比较,正是equalsҎ(gu)做的事?/strong>

      看一下Object对象的equalsҎ(gu)是如何实现的Q?br />       boolean equals(Object o){

      return this==o;

      }
      Object对象默认使用?=操作W。所以如果你自创的类没有覆盖equalsҎ(gu)Q那你的cM用equals和?=?x)得到同L(fng)l果。同样也可以看出QObject的equalsҎ(gu)没有辑ֈequalsҎ(gu)应该辑ֈ的目标:(x)比较两个对象内容是否相等。因为答案应该由cȝ创徏者决定,所以Object把这个Q务留l了cȝ创徏者?br />
      看一下一个极端的c:(x)
      Class Monster{
      private String content;
      ...
      boolean equals(Object another){ return true;}

      }
      我覆盖了equalsҎ(gu)。这个实C(x)D无论Monster实例内容如何Q它们之间的比较永远q回true?br />
所以当你是用equalsҎ(gu)判断对象的内Ҏ(gu)否相{,请不要想当然。因为可能你认ؓ(f)相等Q而这个类的作者不q样认ؓ(f)Q而类的equalsҎ(gu)的实现是׃掌握的。如果你需要用equalsҎ(gu)Q或者用Q何基于散列码的集合(HashSet,HashMap,HashTableQ,请察看一下java doc以确认这个类的equals逻辑是如何实现的?br />
      问题三:(x)String到底变了没有Q?/strong>

      没有。因为String被设计成不可?immutable)c,所以它的所有对象都是不可变对象。请看下列代码:(x)

      String s = "Hello";
      s = s + " world!";

      s所指向的对象是否改变了呢?从本pdW一的l论很容易导个结论。我们来看看发生了什么事情。在q段代码中,s原先指向一个String对象Q内Ҏ(gu)"Hello"Q然后我们对sq行?操作Q那么s所指向的那个对象是否发生了改变呢?{案是没有。这Ӟs不指向原来那个对象了Q而指向了另一个String对象Q内容ؓ(f)"Hello world!"Q原来那个对象还存在于内存之中,只是sq个引用变量不再指向它了?br /> 通过上面的说明,我们很容易导出另一个结论,如果l常对字W串q行各种各样的修改,或者说Q不可预见的修改Q那么用String来代表字W串的话?x)引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符Ԍ都需要一个String对象来表C。这Ӟ应该考虑使用StringBufferc,它允怿改,而不是每个不同的字符串都要生成一个新的对象。ƈ且,q两U类的对象{换十分容易?br /> 同时Q我们还可以知道Q如果要使用内容相同的字W串Q不必每ơ都new一个String。例如我们要在构造器中对一个名叫s的String引用变量q行初始化,把它讄为初始|应当q样做:(x)
      public class Demo {
         private String s;
         ...
         public Demo {
           s = "Initial Value";
         }
         ...
      }
      而非 s = new String("Initial Value");
      后者每ơ都?x)调用构造器Q生成新对象Q性能低下且内存开销大,q且没有意义Q因为String对象不可改变Q所以对于内容相同的字符Ԍ只要一个String对象来表C就可以了。也pQ多ơ调用上面的构造器创徏多个对象Q他们的Stringcd属性s都指向同一个对象?br /> 上面的结Zq样一个事实:(x)对于字符串常量,如果内容相同QJava认ؓ(f)它们代表同一个String对象。而用关键字new调用构造器QL?x)创Z个新的对象,无论内容是否相同?br /> 至于Z么要把Stringc设计成不可变类Q是它的用途决定的。其实不只StringQ很多Java标准cd中的c都是不可变的。在开发一个系l的时候,我们有时候也需要设计不可变c,来传递一l相关的|q也是面向对象思想的体现。不可变cL一些优点,比如因ؓ(f)它的对象是只ȝQ所以多U程q发讉K也不?x)有M问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表Q可能会(x)造成性能上的问题。所以Java标准cdq提供了一个可变版本,即StringBuffer?br />
      问题四:(x)final关键字到底修C什么?

      final使得被修饰的变量"不变"Q但是由于对象型变量的本质是“引用”Q?#8220;不变”也有了两U含义:(x)引用本n的不变,和引用指向的对象不变?br />
      引用本n的不变:(x)
      final StringBuffer a=new StringBuffer("immutable");
      final StringBuffer b=new StringBuffer("not immutable");
      a=b;//~译期错?br />
      引用指向的对象不变:(x)
      final StringBuffer a=new StringBuffer("immutable");
      a.append(" broken!"); //~译通过

      可见Q?font color="#ff0000">final只对引用?#8220;?#8221;(也即它所指向的那个对象的内存地址)有效Q它q引用只能指向初始指向的那个对象,改变它的指向?x)导致编译期错误。至于它所指向的对象的变化Qfinal是不负责的。这很类?=操作W:(x)==操作W只负责引用?#8220;?#8221;相等Q至于这个地址所指向的对象内Ҏ(gu)否相{,==操作W是不管的?br />

      理解final问题有很重要的含义。许多程序漏z都Z?---final只能保证引用永远指向固定对象Q不能保证那个对象的状态不变。在多线E的操作?一个对象会(x)被多个线E共享或修改Q一个线E对对象无意识的修改可能?x)导致另一个用此对象的线E崩溃。一个错误的解决Ҏ(gu)是在此对象新徏的时候把它声明ؓ(f)finalQ意图得它“永远不变”。其实那是徒劳的?br />
      问题五:(x)到底要怎么样初始化Q?/strong>

      本问题讨论变量的初始化,所以先来看一下Java中有哪些U类的变量?br />       1. cȝ属性,或者叫值域
      2. Ҏ(gu)里的局部变?br />       3. Ҏ(gu)的参?br />
      对于W一U变量,Java虚拟Z(x)自动q行初始化。如果给Z初始|则初始化初始倹{如果没有给出,则把它初始化cd变量的默认初始倹{?br />
      intcd变量默认初始gؓ(f)0
      floatcd变量默认初始gؓ(f)0.0f
      doublecd变量默认初始gؓ(f)0.0
      booleancd变量默认初始gؓ(f)false
      charcd变量默认初始gؓ(f)0(ASCII?
      longcd变量默认初始gؓ(f)0
      所有对象引用类型变量默认初始gؓ(f)nullQ即不指向Q何对象。注意数l本w也是对象,所以没有初始化的数l引用在自动初始化后其g是null?br />
      对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创徏实例的时候初始化Qstatic属性在cd载,也就是第一ơ用到这个类的时候初始化Q对于后来的实例的创建,不再ơ进行初始化?/font>q个问题?x)在以后的系列中q行详细讨论?br />
      对于W二U变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,~译器会(x)抗议。如果初始化的语句在try块中或if块中Q也必须要让它在W一ơ用前一定能够得到赋倹{也是_(d)把初始化语句攑֜只有if块的条g判断语句中编译器也会(x)抗议Q因为执行的时候可能不W合if后面的判断条Ӟ如此一来初始化语句׃?x)被执行了,q就q反了局部变量用前必须初始化的规定。但如果在else块中也有初始化语句,可以通过~译Q因为无论如何,L臛_一条初始化语句?x)被执行Q不?x)发生用前未被初始化的事情。对于try-catch也是一P如果只有在try块里才有初始化语句,~译部通过。如果在catch或finally里也有,则可以通过~译。MQ要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要Z化成什么值好Q就用上面的默认值吧Q?br />
      其实W三U变量和W二U本质上是一L(fng)Q都是方法中的局部变量。只不过作ؓ(f)参数Q肯定是被初始化q的Q传入的值就是初始|所以不需要初始化?br />
      问题六:(x)instanceof是什么东东?

      instanceof是Java的一个二元操作符Q和==Q?gt;Q?lt;是同一cM东。由于它是由字母l成的,所以也是Java的保留关键字。它的作用是试它左边的对象是否是它双的类的实例,q回booleancd的数据。D个例子:(x)

      String s = "I AM an Object!";
      boolean isObject = s instanceof Object;

      我们声明了一个String对象引用Q指向一个String对象Q然后用instancof来测试它所指向的对象是否是Objectcȝ一个实例,昄Q这是真的,所以返回trueQ也是isObject的gؓ(f)True?br /> instanceof有一些用处。比如我们写了一个处理̎单的pȝQ其中有q样三个c:(x)

      public class Bill {//省略l节}
      public class PhoneBill extends Bill {//省略l节}
      public class GasBill extends Bill {//省略l节}

      在处理程序里有一个方法,接受一个Billcd的对象,计算金额。假设两U̎单计方法不同,而传入的Bill对象可能是两U中的Q何一U,所以要用instanceof来判断:(x)

      public double calculate(Bill bill) {
         if (bill instanceof PhoneBill) {
           //计算?sh)话账?br />          }
         if (bill instanceof GasBill) {
           //计算燃气账单
         }
         ...
      }
      q样可以用一个方法处理两U子cR?br />
      然而,q种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实玎ͼq是面向对象变成应有的做法,避免回到l构化编E模式。只要提供两个名字和q回值都相同Q接受参数类型不同的Ҏ(gu)可以了Q?br />
      public double calculate(PhoneBill bill) {
         //计算?sh)话账?br />       }

      public double calculate(GasBill bill) {
         //计算燃气账单
      }

      所以,使用instanceof在绝大多数情况下q不是推荐的做法Q应当好好利用多态?/font>



lau 2009-03-30 14:55 发表评论
]]>
语言深入:java中究竟是传D是传引用http://www.tkk7.com/alinglau36/archive/2009/03/24/261747.htmllaulauTue, 24 Mar 2009 10:21:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/24/261747.htmlhttp://www.tkk7.com/alinglau36/comments/261747.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/24/261747.html#Feedback5http://www.tkk7.com/alinglau36/comments/commentRss/261747.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/261747.html首先Q推荐对Java有一定理解的同仁一本书《Practical Java》。在《Practical Java》中也有一个章节介lJava中关于传值和传引用的问题Q堪U经典。《Practical Java》在Java中,事实上底层工作原理不存在传引用的概念Q这也象《Practical Java》中所说的那样QJava中只有传倹{这句话理解h需要费一定的周折?/font>

      熟?zhn)C的程序员都用q指针,Ҏ(gu)针可谓爱之深恨之切。指针是指向一块内存地址的内存数据(有些拗口Q,也就是说指针本n是一个占?字节内存的intQ?2 位系l内Q,而这个int值恰恰又是另一块内存的地址。比?hello"q个字串Q存攑֜@0x0000F000q个地址到@0x0000F005q段内存区域内(包括0x00的结束字节)。而在@0x0000FFF0到@0x0000FFF03q四个字节内存放着一个intQ这个int的值是 @0x0000F000。这样就形成了一个指?hello"字串的指针?/font>

      在Java中,很多没有指针Q事实上Q在Java更深层次里,到处都是大师装好的_lu的指针?/font>Z更容易的讲解Java中关于类和类型的调用QJava中出Cg引用的说法。浅昄来说Q我们可以认为Java中的引用与C中的指针{效Q其实差别非帔R常大Q但是ؓ(f)了说明我们今天的问题Q把他们理解为等效是没有M问题的)?/font>

      所谓传引用的说法是Z更好的讲解调用方式。基于上面对指针的理解,我们不难看出Q指针其实也是一个int|所谓传引用Q我们是复制了复制了指针的intD行传递。ؓ(f)了便于理解,我们可以姑且把指针看作一U数据类型,透明化指针的intҎ(gu),从而提Z引用的概c(din)?/font>

      重申一遍:(x)Java中只有传倹{?/strong>

      1所谓传值和传引?/strong>

      传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设计者y妙的Ҏ(gu)针的操作q行了管理。事实上Q在懂C++的JavaE序员眼中,Java到处都是_lu的指针?br /> 下面举个单的例子Q说明什么是传|什么是传引用?br /> //?
void method1(){
int x=0;
this.change(x);
System.out.println(x);
}

void change(int i){
i=1;
}

      很显然的Q在mothod1中执行了change(x)后,x的值ƈ不会(x)因ؓ(f)changeҎ(gu)中将输入参数赋gؓ(f)1而变?Q也是说在执行change(x)后,x的值z依然?。这是因为x传递给change(int i)的是倹{这是最单的传倹{?br /> 同样的,q行一点简单的变化?br /> //?
void method1(){
StringBuffer x=new StringBuffer("Hello");
this.change(x);
System.out.println(x);
}

void change(StringBuffer i){
i.append(" world!");
}
      看v来没什么变化,但是q次mothed1中执行了change (x)后,x的g再是"Hello"了,而是变成?Hello world!"。这是因为x传递给change(i)的是x的引用。这是最l典的传引用?br /> g有些奇怪了Q两D늨序没有特别的不同Q可是ؓ(f)什么一个传的是D另一个传的是引用呢?......

      2非要搞清楚传D是传引用的问题吗Q?/strong>

      搞清楚这自然是有必要的,不然我也不需要写q么多了Q不q的没有到"非要"的地步?/font>


      首先Q如果我们不太关心什么是传g么是传引用,我们一栯写出漂亮的代码,但是q些代码在运行过E中可能?x)存在着极大的隐(zhn)。全局变量是让大家深恶痛绝Q又难以割舍Q的东西Q原因就是用全局变量要特别注意数据的保护。如果在多线E的E序里用全局变量直就{于跟自p不去。不了解传值和传引用的问题Q跟使用全局变量不考虑数据保护的罪q是不相上下下的Q甚x时候比它还要糟。你?x)莫名其妙,Z么我的返回参数没有v作用Qؓ(f)什么我传进ȝ参数变成了这?.....Q?br /> 一个例子:(x)
//?
void mothed1(){
int x=0;
int y=1;
switchValue(x,y);
System.out.println("x="+x);
System.out.println("y="+y);
}
void switchValue(int a,int b){

int c=a;
a=b;
b=c;
}
      上面是一个交换a,b值的函数Q看hg蛮正的Q但是这个函数永q也不会(x)完成你想要的工作?br />       q有一个例子:(x)
//?
StringBuffer a=new StringBuffer("I am a ");
StringBuffer b=a;
a.append("after append");
a=b;
System.out.println("a="+a);
在编E过E中Q经怼(x)遇到q种情况Q一个变量的D被(f)时改变一下,{用完之后再恢复到开始的倹{就好像上面的例子,aZ保持它的|使用b=a做赋|之后a被改变,再之后a把暂存在b里面的值取回来。这是我们一厢情愿的xQ而事实上Q这D代码执行后Q你?x)发现a的值已l改变了?br /> 以上是两个最单的例子Q真正的E序开发过E中Q比q要复杂的情冉|天都?x)遇到?/font>

      3cd和类

      Java 提出的思想Q在Java里面M东西都是cR但是Java里面同时q有单数据类型int,byte,char,booleanQ与q些数据cd相对应的cLIntegerQByteQCharacterQBooleanQ这样做依然不会(x)破坏Java关于M东西都是cȝ提法。这里提到数据类型和cM乎和我们要说的传值和传引用的问题无关Q但q是我们分L传值和传引用的基础?/font>

      4试图分L传D是传引用

      Z么是"试图分L"呢?很简单,传值和传引用的问题无处不在Q但是似乎还没有正统的给出标准,怎样的就是值拷贝调用,怎样的就是引用调用。面对这个问题,我们更多的应该是来自qxU篏对Java的理解?br />       回过头来Q我们分析一下上面的几个例子Q?br />       先看?Q即使你不明白ؓ(f)什么,但是你应该知道这样做肯定不会(x)改变x的倹{ؓ(f)了方便说明,我们l例子都加上行号?br /> //?
1 void method1(){
2   int x=0;
3   this.change(x);
4 }
5
6 void change(int i){
7 i=7;
8}
      让我们从内存的存储方式看一下x和I之间到底是什么关pR?br />       在执行到W?行的时候,变量x指向一个存攄int 0的内存地址?/font>

      变量x---->[存放?]

      执行W?行调用change(x)Ҏ(gu)的时候,内存中是q样的情形:(x)x把自己值在内存中复制一份,然后变量i指向q个被复制出来的0?/font>

      变量x---->[存放?]
                        ↓q行了一ơ值复?br />       变量x---->[存放?]

      q时候再执行到第7行的时候,变量i的被赋gؓ(f)7Q而这一步的操作已经跟x没有M关系了?/font>

      变量x---->[存放?]
             
      变量x---->[存放?]

      说到q里应该已经理解Z么change(x)不能改变x的g吧?因ؓ(f)q个例子是传值的?br /> 那么Q试着分析一下ؓ(f)什么例三中的switchValue()Ҏ(gu)不能完成变量g换的工作Q?br /> 再看??br /> //?
1void method1(){
2 StringBuffer x=new StringBuffer("Hello");
3 this.change(x);
4}
5
6void change(StringBuffer i){
7 i.append(" world!");
8}
      ?g和例1从代码上看不Z么差别,但是执行l果却是change(x)能改变x的倹{依然才从内存的存储角度来看看例2的蹊跷在哪里?br /> 在执行到W?行时候,同例1一Px指向一个存?Hello"的内存空间?/font>

      变量x---->[存放?Hello"]

      接下来执行第三行change(x)Q注意,q里׃?有了本质的不同:(x)调用change(x)Ӟ变量i也指向了x指向的内存空_(d)而不是指向x的一个拷贝?/font>

      变量x "
              -->[存放?Hello"]
      变量x /

      于是Q第7行对i调用appendҎ(gu)Q改变i指向的内存空间的|x的g随之改变了?/font>

      变量x "
              -->[q加?Hello World!"]
      变量x /

      Z么xD改变呢?因ؓ(f)q个例子是传引用的?br /> q几个例子是明白了,可是很多Z(x)开始有另一个疑问了Q这L(fng)来,到底什么时候是传的g么时候是传得引用呢?于是Q我们前面讲到的cd和类在这里就z上了用?strong>Q?font color="#ff0000">对于参数传递,如果是简单数据类型,那么它传递的是值拷贝,对于cȝ实例它传递的是类的引用。需要注意的是,q条规则只适用于参C递?/font>Z么这么说呢?我们看看q样一个例子:(x)
//?
String str="abcdefghijk";
str.replaceAll("b","B");
      q两句执行后Qstr的内容依然是"abcdefghijk"Q但是我们明明是对str操作的,Z么是q样的呢Q因为str的值究竟会(x)不会(x)被改变完全取决于replaceAllq个Ҏ(gu)是怎么实现的。类似的Q有q样一个例子:(x)
//?
1 void method1() {
2 StringBuffer x = new StringBuffer("Hello");
3 change1(x);
4 System.out.println(x);
5 }
6
7 void method2() {
8 StringBuffer x = new StringBuffer("Hello");
9 change2(x);
10 System.out.println(x);
11 }
12
13 void change1(StringBuffer sb) {
14 sb.append(" world!");
15 }
16
17 void change2(StringBuffer sb) {
18 sb = new StringBuffer("hi");
19 sb.append(" world!");
20 }
      调用method1()Q屏q打印结果ؓ(f)Q?Hello world!"
调用method2()Q我们认为结果应该是"hi world"Q因为sb传进来的是引用。可是实际执行的l果?Hello"Q?br /> Nchange2()又变成传gQ!其实change1()和change2()的确都是通过参数传入引用Q但是在Ҏ(gu)内部因ؓ(f)处理Ҏ(gu)的不同而ɾl果大相径庭。我们还是从内存的角度分析:(x)
执行method1()和change1()不用再多说了Q上面的例子已经讲解q,q里我们分析一下method2()和change2()?br />       E序执行到第8行,x指向一个存攄"Hello"的内存空间?/font>

      变量x---->[存放?Hello"]

      W?行调用change2Q将sb指向x指向的内存空_(d)也就是传入x的引用?/font>

      变量x "
              -->[存放?Hello"]
      变量x /

      到这里ؓ(f)止还没有什么异P接下来执?8行,q里出CcM传入值拷贝的变化Qnew Ҏ(gu)q没有改变sb指向内存的内容,而是在内从中开辟了一块新的空间存放串"hi"Q同时sb指向了这块空间?/font>

      变量x---->[存放?Hello"]
            ×原有的引用被切断
      变量x---->[另一块存?hi"的空间]

      接下来再对sbq行append已经和x没有M关系了?br /> 所以,q有一条不成规则的规则Q对于函数调用,最l效果是什么完全看函数内部的实现。比较标准的做法是如果会(x)改变引用的内容,则用void作ؓ(f)Ҏ(gu)q回|而不?x)改变引用内容的则在q回gq回新的倹{?br /> 虽然已经说了q么多,但是感觉传D是传引用的问题依然没有完全说清楚。因个问题本w就是很隑ֽUxȝ的问题,所以更多的理解要靠qx的积累和形成。下面几个例子,l大家尝试进行分析?br /> //?Q打印结果是什么?
public static void main(String[] args) {
int a;
int b;
StringBuffer c;
StringBuffer d;
a = 0;
b = a;
c = new StringBuffer("This is c");
d = c;

a = 2;
c.append("!!");

System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
System.out.println("d=" + d);
}

//?Q打印结果是什么?
public class Test{

        public static void main(String[] args) {

         StringBuffer sb = new StringBuffer("Hello ");

         System.out.println("Before change, sb = " + sb);

         changeData(sb);

         System.out.println("After changeData(n), sb = " + sb);

     }

     

        public static void changeData(StringBuffer strBuf) {

            StringBuffer sb2 = new StringBuffer("Hi ");

            strBuf = sb2;

            sb2.append("World!");

     }

}

如果本文Ҏ(gu)有帮助ƈ且要鼓励我的话,h描如下二l码支持本h的劳动成果,多谢了!




lau 2009-03-24 18:21 发表评论
]]>
System.getProperty()http://www.tkk7.com/alinglau36/archive/2009/03/16/260021.htmllaulauMon, 16 Mar 2009 06:54:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/16/260021.htmlhttp://www.tkk7.com/alinglau36/comments/260021.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/16/260021.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/260021.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/260021.htmlSystem.getProperty()
 1public class Information {   
 2    public static void main(String args[]) {   
 3        System.out.println("java_vendor:" + System.getProperty("java.vendor"));   
 4        System.out.println("java_vendor_url:"   
 5                + System.getProperty("java.vendor.url"));   
 6        System.out.println("java_home:" + System.getProperty("java.home"));   
 7        System.out.println("java_class_version:"   
 8                + System.getProperty("java.class.version"));   
 9        System.out.println("java_class_path:"   
10                + System.getProperty("java.class.path"));   
11        System.out.println("os_name:" + System.getProperty("os.name"));   
12        System.out.println("os_arch:" + System.getProperty("os.arch"));   
13        System.out.println("os_version:" + System.getProperty("os.version"));   
14        System.out.println("user_name:" + System.getProperty("user.name"));   
15        System.out.println("user_home:" + System.getProperty("user.home"));   
16        System.out.println("user_dir:" + System.getProperty("user.dir"));   
17        System.out.println("java_vm_specification_version:"   
18                + System.getProperty("java.vm.specification.version"));   
19        System.out.println("java_vm_specification_vendor:"   
20                + System.getProperty("java.vm.specification.vendor"));   
21        System.out.println("java_vm_specification_name:"   
22                + System.getProperty("java.vm.specification.name"));   
23        System.out.println("java_vm_version:"   
24                + System.getProperty("java.vm.version"));   
25        System.out.println("java_vm_vendor:"   
26                + System.getProperty("java.vm.vendor"));   
27        System.out   
28                .println("java_vm_name:" + System.getProperty("java.vm.name"));   
29        System.out.println("java_ext_dirs:"   
30                + System.getProperty("java.ext.dirs"));   
31        System.out.println("file_separator:"   
32                + System.getProperty("file.separator"));   
33        System.out.println("path_separator:"   
34                + System.getProperty("path.separator"));   
35        System.out.println("line_separator:"   
36                + System.getProperty("line.separator"));   
37    }
   
38}
   
39
常用的System.getProperty()Q这里脓(chung)一下,省得下次ȝ.

From jdk 1.5.0 documents

java.version

Java q行时环境版?/span>

java.vendor

Java q行时环境供应商

java.vendor.url

Java 供应商的 URL

java.home

Java 安装目录

java.vm.specification.version

Java 虚拟范版?/span>

java.vm.specification.vendor

Java 虚拟范供应商

java.vm.specification.name

Java 虚拟范名U?/span>

java.vm.version

Java 虚拟机实现版?/span>

java.vm.vendor

Java 虚拟机实C应商

java.vm.name

Java 虚拟机实现名U?/span>

java.specification.version

Java q行时环境规范版?/span>

java.specification.vendor

Java q行时环境规范供应商

java.specification.name

Java q行时环境规范名U?/span>

java.class.version

Java cL式版本号

java.class.path

Java c\?/span>

java.library.path

加蝲库时搜烦的\径列?/span>

java.io.tmpdir

默认的(f)时文件\?/span>

java.compiler

要用的 JIT ~译器的名称

java.ext.dirs

一个或多个扩展目录的\?/span>

os.name

操作pȝ的名U?/span>

os.arch

操作pȝ的架?/span>

os.version

操作pȝ的版?/span>

file.separator

文g分隔W(?UNIX pȝ中是“/”Q?/span>

path.separator

路径分隔W(?UNIX pȝ中是“:”Q?/span>

line.separator

行分隔符Q在 UNIX pȝ中是“/n”Q?/span>

user.name

用户的̎户名U?/span>

user.home

用户的主目录

user.dir

用户的当前工作目?/span>



pȝ属性g的多个\径是用^台的路径分隔W分隔的


lau 2009-03-16 14:54 发表评论
]]>
java需要了解的东西http://www.tkk7.com/alinglau36/archive/2009/03/02/257337.htmllaulauMon, 02 Mar 2009 06:32:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/02/257337.htmlhttp://www.tkk7.com/alinglau36/comments/257337.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/02/257337.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/257337.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/257337.html阅读全文

lau 2009-03-02 14:32 发表评论
]]>
java中static的作?http://www.tkk7.com/alinglau36/archive/2009/03/02/257313.htmllaulauMon, 02 Mar 2009 04:03:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/02/257313.htmlhttp://www.tkk7.com/alinglau36/comments/257313.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/02/257313.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/257313.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/257313.html有时你希望定义一个类成员Q它的使用完全独立于该cȝM对象。通常情况下,cL员必通过它的cȝ对象讉KQ但是可以创样一个成员,它能? 被它自己使用Q而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)p创徏q样的成员。如果一个成员被声明为staticQ它?yu)p 够在它的cȝM对象创徏之前被访问,而不必引用Q何对象。你可以方法和变量都声明ؓ(f)static。static 成员的最常见的例子是main( ) 。因为在E序开始执行时必须调用main() Q所以它被声明ؓ(f)static?

声明为static的变量实质上是全局变量。当声明一个对象时Qƈ不生static变量的拷贝,而是该类所有的实例变量q同一个static变量。声明ؓ(f)static的方法有以下几条限制Q?
·
它们仅能调用其他的static Ҏ(gu)?
·
它们只能讉Kstatic数据?
·
它们不能以Q何方式引用this 或superQ关键字super 与承有养I在下一章中描述Q?
如果你需要通过计算来初始化你的static变量Q你可以声明一个static块,Static 块仅在该c被加蝲时执行一ơ。下面的例子昄的类有一个staticҎ(gu)Q一些static变量Q以?qing)一个static 初始化块Q?
// Demonstrate static variablesQmethodsQand blocks.

class UseStatic {
static int a = 3;
static int b;


static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);


}

static {
System.out.println("Static block initialized.");
b = a * 4;


}

public static void main(String args[]) {
meth(42);
}
}


一旦UseStatic c被装蝲Q所有的static语句被运行。首先,a被设|ؓ(f)3Q接着static 块执?打印一条消?Q最后,b被初始化为a*4 ?2。然后调用main()Qmain() 调用meth() Q把?2传递给x?个println ( ) 语句引用两个static变量a和bQ以?qing)局部变量x ?

注意Q在一个static Ҏ(gu)中引用Q何实例变量都是非法的?

下面是该E序的输出:(x)

Static block initialized.
x = 42
a = 3
b = 12
在定义它们的cȝ外面Qstatic Ҏ(gu)和变量能独立于Q何对象而被使用。这P你只要在cȝ名字后面加点可符卛_。例如,如果你希望从cd面调用一个staticҎ(gu)Q你可以使用下面通用的格式:(x)

classname.method( )

q里Qclassname 是类的名字,在该cM定义staticҎ(gu)。可以看刎ͼq种格式与通过对象引用变量调用非staticҎ(gu)的格式类伹{一个static变量可以以同L(fng) 格式来访问——类名加点号q算W。这是Java 如何实现全局功能和全局变量的一个控制版本?

下面是一个例子。在main() 中,staticҎ(gu)callme() 和static 变量b在它们的cM外被讉K?

class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {


System.out.println("a = " + a);
}
}


class StaticByName {

public static void main(String args[]) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);


}
}

下面是该E序的输出:(x)

a = 42
b = 99


 

static成员是不能被其所在class创徏的实例访问的?/p>

如果不加static修饰的成员是对象成员Q也是归每个对象所有的?

加static修饰的成员是cL员,是可以׃个类直接调用Qؓ(f)所有对象共有的

lau 2009-03-02 12:03 发表评论
]]>
如何避免在Java中用Checked Exceptionhttp://www.tkk7.com/alinglau36/archive/2009/02/17/255045.htmllaulauTue, 17 Feb 2009 03:18:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/02/17/255045.htmlhttp://www.tkk7.com/alinglau36/comments/255045.htmlhttp://www.tkk7.com/alinglau36/archive/2009/02/17/255045.html#Feedback1http://www.tkk7.com/alinglau36/comments/commentRss/255045.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/255045.html如何避免在Java中用Checked Exception

发布旉Q?007.08.20 08:52     来源Q赛q网    作者:(x)dxaw

q? 文章指ZJava中checked Exception的一些缺点,提出应该在程序设计中避免使用checked Exception,对于需要处理checked Exception的代码,可以使用ExceptionAdapterq个cdchecked Exceptionq行包装。这文章的概念和ExceptionAdapterq个cd源自Bruce Eckel的Does Java need Checked Exception?

Java的Exception分ؓ(f)两类Q一cLRuntimeException? 其子c,另外一cd是checked Exception。Java要求函数Ҏ(gu)有被catch处理掉的checked ExceptionQ需要将其写在函数的声明部分。然而,q一要求常常l程序员带来一些不必要的负担?

Z避免在函数声明中写throws部分Q在Java目里面常常可以看到以下代码用来‘吞掉’ExceptionQ?

try {



// ...



} catch (Exception ex) {



ex.printStackTrace();



}

q显然不是一个好的处理Exception办法Q事实上Qcatchq处理一个Exception意味着让程序从发生的错?Exception)中恢复过来。从q种意义上说Q已上的代码只可能在一些很单的情况下工作而不带来问题?

对于很多ExceptionQ往往没有d理它q让E序从错误中恢复出来的办法,q? 时唯一能做的事情可能就是在界面上显CZ些提CZ息给用户。这U情况下让程序抛出遇到的Exception是更为合理的做法。然而,q样做会(x)使得一些函? 的声明急剧膨胀。一个函数可能需要声明会(x)抛出??个checked ExceptionQ而且每个调用它的函数也需要同L(fng)声明?

比这更糟p的是,q有可能破坏c设计的open-close原则。简单来 _(d)open-close原则是指当扩展一个模块的时候,可以不媄响其现有的client。open-close原则是通过l承来实现的Q当l承一个类? 时候,我们既扩展了q个c,也不?x)媄响原有的clientQ因为对q个cL有改动)?

现在考虑下面q种情况Q有一个父cBaseQ?

public class Base {

public void foo() throws ExceptionA {

// ...

}

}

现在需要承Baseq个cdƈ重蝲fooq个Ҏ(gu)Q在新的实现中,foo可能抛出ExceptionBQ?

public class Extend extends Base {

public void foo() throws ExceptionB {

// ...

}

}

然而,q样写在Java里面是不合法的,因ؓ(f)Java把可能会(x)抛出的Exception看作函数特征的一部分Q子cd明抛出的Exception必须是父cȝ子集?

可以在BasecȝfooҎ(gu)中加入抛出ExceptionB的声明,然而,q样q坏了open-close原则。而且Q有时我们没有办法去修改父类Q比如当重蝲一个Jdk里的cȝ时候?

另一个可能的做法是在Extend的fooҎ(gu)中catch住ExceptionBQ然后构造一个ExceptionAq抛出。这是个可行的办法但也只是一个权宜之计?

如果使用RuntimeExceptionQ这些问题都不会(x)存在。这说明 checked Exceptionq不是一个很实用的概念,也意味着在程序设计的时候,我们应该让自qExceptioncȝ承RuntimeException而不 是Exception。(q和JDK的徏议正好相反,但实践证明这样做代码的质量更好。)

对于那些需要处理checked Exception的代码,可以利用一个ExceptionAdapter的类把checked Exception包装成一个RuntimeException抛出。ExceptionAdapter来自Bruce Eckel的Does Java need Checked Exceptionq篇文章Q在q里的ExceptionAdapter是我Ҏ(gu)JDK 1.4修改q的Q?

public class ExceptionAdapter extends RuntimeException {



public ExceptionAdapter(Exception ex) {



super(ex);

}



public void printStackTrace(java.io.PrintStream s) {



getCause().printStackTrace(s);

}



public void printStackTrace(java.io.PrintWriter s) {



getCause().printStackTrace(s);



}



// rethrow()的作用是把被包装的Exception再次抛出?br />


public void rethrow()

throws Exception

{

throw (Exception) getCause();

}



}

Q责ȝ辑:(x)~辑龚勋Q?



lau 2009-02-17 11:18 发表评论
]]>
վ֩ģ壺 ӰһѾþþþþþþ | ޾ƷҺһ| ҹƵ| selaobanƵѾƷ| ޾ƷƷ߹ۿ| ѻɫӰ߹ۿ| ձ˳Ļ| Ѵվ߿| 벻Ļϵ| jlzzjlzzjzjzjz| ޸רƵ| **ëƬѹۿþþƷ| С豻| ޸޵| СƵ߹ۿ| ߿Ƭ˳Ӿ| һ| vaþþþͬ| Ƶһ| ҰƵ߹ۿ| 7777þĻ| þ91޾ƷĻ| ŮaƵ| ߲| һëƬ߲ŷƵ | һ߹ۿ| ŮѹۿˬˬˬƵ | ѿ߾Ʒһ| ߹ۿƵվɫ| Ů˱Ū߳Ƶ | պ| ޾Ʒþþ| ޳츾߳XXXXX| ߹ۿƵ| þۺ³³| ҹѸ| ¼Ƶѿ| av| VƬ߹ۿ| һƬѲŵӰ| Ƶ߹ۿ|