欢迎来到天天文库
浏览记录
ID:31685845
大小:72.84 KB
页数:17页
时间:2019-01-17
《java习惯用法总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在Java编程中,有些知识并不能仅通过语言规范或者标准API文档就能学到的。在本文中,我会尽量收集一些最常用的习惯用法,特别是很难猜到的用法。(JoshuaBloch的《EffectiveJava》对这个话题给出了更详尽的论述,可以从这本书里学习更多的用法。)我把本文的所有代码都放在公共场所里。你可以根据自己的喜好去复制和修改任意的代码片段,不需要任何的凭证。目录•实现:oequals()ohashCode()ocompareTo()oclone()•应用:oStringBuilder/StringBufferoRand
2、om,nextlnt(int)oIterator,remove()oStringBuilder.reverse()oThread/Runnableotry-finally•输入/输出:o从输入流里读取字节数据o从输入流里读取块数据o从文件里读取文本o向文件里写文本•预防性检测:O数值O对象O数组索引O数组区间•数组:O填充元素O复制一个范围内的数组元素O调整数组大小•包装o个字节包装成一个into分解成4个字节实现equals()classPerson{Stringname;intbirthYcar;byte[]raw;
3、publicbooleanequals(Objectobj){if(!objinstanceofPerson)returnfalse;Personother=(Person)obj:returnname.equals(other.name)&&birthYear==other・birthYear&&Arrays.equals(raw,other.raw);publicinthashCode0{・•・}•参数必须是Object类型,不能是外围类。•foo.equals(null)必须返回false,不能抛NullPoint
4、erExceptiono(注意,nullinstanceof任意类总是返回false,因此上面的代码可以运行。)•基本类型域(比如,int)的比较使用==,基本类型数组域的比较使用Arrays,equals()o•覆盖equals()时,记得要相应地覆盖hashCode(),与equals()保持一致。•参考:java・lang・Object・equals(Object)。实现hashCode()classPerson{Stringa;Objectb;bytec;int[]d;publicinthashCode0(ret
5、urna.hashCode()+b・hashCode()+c+Arrays・hashCode(d);}publicbooleanequals(Objecto){・・・}}•当x和y两个对象具有x.equals(y)=true,你必须要确保x.hashCode()==y.hashCode()0根据逆反命题,如果x.hashCode()!=y.hashCode(),那么x.equals(y)==false必定成立。•你不需要保证,当x.equals(y)==false时,x.hashCode()!=y.hashCode()o
6、但是,如果你可以尽可能地使它成立的话,这会提高哈希表的性能。•hashCode0最简单的合法实现就是简单地return0;虽然这个实现是正确的,但是这会导致HashMap这些数据结构运行得很慢。•参考:java・lang・Object・hashCode()。实现compareTo()classPersonimplementsComparab1e{StringfirstName;StringlastName;intbirthdate;//ComparebyfirstName,breaktiesbylastN
7、ame,finallybreaktiesbybirthdatepublicintcompareTo(Personother){if(firstName.compareTo(other.firstName)!=0)returnfirstName・compareTo(other・firstName);elseif(lastNamc.compareTo(other・1astNamc)!=0)returnlastName・compareTo(other・lastName);elseif(birthdate8、date)returnT;elseif(birthdate>other.birthdate)return1:elsereturn0;总是实现泛型版本Comparable而不是实现原始类型Comparable。因为这样可以节省代码量和减少不必要的麻烦。•只关心返回结果的正负号(负/零/正),它们的大小不重要。•Comp
8、date)returnT;elseif(birthdate>other.birthdate)return1:elsereturn0;总是实现泛型版本Comparable而不是实现原始类型Comparable。因为这样可以节省代码量和减少不必要的麻烦。•只关心返回结果的正负号(负/零/正),它们的大小不重要。•Comp
此文档下载收益归作者所有