Java习惯用法总结
作者:网络转载 发布时间:[ 2015/4/7 13:55:08 ] 推荐标签:Java 软件开发 用法 总结
向文件里写文本
PrintWriter out=new PrintWriter(
new OutputStreamWriter(new FileOutputStream(...),"UTF-8"));
try{
out.print("Hello");
out.print(42);
out.println("world!");
}finally{
out.close();
}
Printwriter对象的创建显得很冗长。这是因为Java把字节和字符当成两个不同的概念来看待(这与C语言不同)。
像System.out,你可以使用print()和println()打印多种类型的值。
你可以使用其他的字符编码而不使用UTF-8,但好不要这样做。
参考:java.io.PrintWriter、java.io.OutputStreamWriter。
预防性检测(Defensive checking)数值
int factorial(int n){
if(n<0)
throw new IllegalArgumentException("Undefined");
else if(n>=13)
throw new ArithmeticException("Result overflow");
else if(n==0)
return 1;
else
return n*factorial(n-1);
}
不要认为输入的数值都是正数、足够小的数等等。要显式地检测这些条件。
一个设计良好的函数应该对所有可能性的输入值都能够正确地执行。要确保所有的情况都考虑到了并且不会产生错误的输出(比如溢出)。
预防性检测对象
int findIndex(List<String>list,String target){
if(list==null||target==null)
throw new NullPointerException();
...
}
不要认为对象参数不会为空(null)。要显式地检测这个条件。
预防性检测数组索引
void frob(byte[]b,int index){
if(b==null)
throw new NullPointerException();
if(index<0||index>=b.length)
throw new IndexOutOfBoundsException();
...
}
不要认为所以给的数组索引不会越界。要显式地检测它。
预防性检测数组区间
void frob(byte[]b,int off,int len){
if(b==null)
throw new NullPointerException();
if(off<0||off>b.length
||len<0||b.length-off<len)
throw new IndexOutOfBoundsException();
...
}
不要认为所给的数组区间(比如,从off开始,读取len个元素)是不会越界。要显式地检测它。
填充数组元素
使用循环:
//Fill each element of array'a'with 123
byte[]a=(...);
for(int i=0;i<a.length;i++)
a[i]=123;
(优先)使用标准库的方法:
Arrays.fill(a,(byte)123);
参考:java.util.Arrays.fill(T[],T)。
参考:java.util.Arrays.fill(T[],int,int,T)。
复制一个范围内的数组元素
使用循环:
//Copy 8 elements from array'a'starting at offset 3
//to array'b'starting at offset 6,
//assuming'a'and'b'are distinct arrays
byte[]a=(...);
byte[]b=(...);
for(int i=0;i<8;i++)
b[6+i]=a[3+i];
(优先)使用标准库的方法:
System.arraycopy(a,3,b,6,8);
参考:java.lang.System.arraycopy(Object,int,Object,int,int)。
调整数组大小
使用循环(扩大规模):
//Make array'a'larger to newLen
byte[]a=(...);
byte[]b=new byte[newLen];
for(int i=0;i<a.length;i++)//Goes up to length of A
b[i]=a[i];
a=b;
使用循环(减小规模):
//Make array'a'smaller to newLen
byte[]a=(...);
byte[]b=new byte[newLen];
for(int i=0;i<b.length;i++)//Goes up to length of B
b[i]=a[i];
a=b;
(优先)使用标准库的方法:
a=Arrays.copyOf(a,newLen);
参考:java.util.Arrays.copyOf(T[],int)。
参考:java.util.Arrays.copyOfRange(T[],int,int)。
把4个字节包装(packing)成一个int
int packBigEndian(byte[]b){
return(b[0]&0xFF)<<24
|(b[1]&0xFF)<<16
|(b[2]&0xFF)<<8
|(b[3]&0xFF)<<0;
}
int packLittleEndian(byte[]b){
return(b[0]&0xFF)<<0
|(b[1]&0xFF)<<8
|(b[2]&0xFF)<<16
|(b[3]&0xFF)<<24;
}
把int分解(Unpacking)成4个字节
byte[]unpackBigEndian(int x){
return new byte[]{
(byte)(x>>>24),
(byte)(x>>>16),
(byte)(x>>>8),
(byte)(x>>>0)
};
}
byte[]unpackLittleEndian(int x){
return new byte[]{
(byte)(x>>>0),
(byte)(x>>>8),
(byte)(x>>>16),
(byte)(x>>>24)
};
}
总是使用无符号右移操作符(>>>)对位进行包装(packing),不要使用算术右移操作符(>>)。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等

sales@spasvo.com