使用重载时有些重载方法并不会根据你想要的方式来进行运行的,编译器会根据自己想要的最简便的方式来运行对应的方法,如下所示
public class CollectionClassFind {
public static String classFind(List<?> list){
return "List";
}
public static String classFind(Set<?> set){
return "Set";
}
public static String classFind(Collection<?> collection){
return "Collection";
}
public static void main(String[] args) {
Collection<?>[] collections = {
new HashSet(),new ArrayList(), new HashMap().values()
};
for (Collection collection : collections) {
System.out.println(classFind(collection));
}
//理想结果:List Set Collection
//实际结果:Collection Collection Collection
}
}
简而言之,能够重载方法并不意味着应该重载方法.如果一定要进行方法重载,那么就要考虑是否会被编译器所忽略
当我们需要定义参数数目不定的方法时,可变参数时一种很方便的方式,但是不应该被过度滥用,参数列表不应该只有一个可变参数,避免调用方一个参数也不传导致程序出现问题.应该如下所示,用一个固定参数来进行区分
public static void main(String[] args) {
int sum = sum();
System.out.println(sum);
}
public static int sum(int... args){
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
public static void main(String[] args) {
int sum = sum(1, 3, 4, 5, 6, 7, 8, 9);
System.out.println(sum);
}
public static int sum(int first,int... args){
for (int arg : args) {
first = first + arg;
}
return first;
}
如果方法返回集合是抛给一个null,那么就会需要调用方来处理这个问题,此时我们应该尽可能的自己来解决这个异常,以避免给调用者带来不必要的麻烦
private final List<Cheese> cheeses = new ArrayList<>(10);
public List<Cheese> getCheeses(){
if(cheeses.size() == 0){
return null;
}
return cheeses;
}
private final List<Cheese> cheeses = new ArrayList<>(10);
public List<Cheese> getCheeses(){
if(cheeses.size() == 0){
return null;
}
return Collections.EMPTY_LIST;
}
这一条没什么好解释的,需要我们习惯性的去执行即可
原文释义:早期程序的设计会要求在方法开始的时候就把所有需要用到的局部变量都进行生命,但是这样会导致程序的可读性降低,最好的做法是当局部变量需要用到的时候去使用它. 其实我觉得如果每个方法都能非常规范的把局部变量的声明写在最前面,这样也是可方便方法的阅读的.但是如果想要真正的提高一个方法的可读性,就需要我们把方法设计的小而集中,这才是解决问题的本质做法
使用foreach循环好处是相比于传统for循环并没有性能损耗,并且比较不容易出现BUG或者写错循环次数导致索引越界的问题
引用原文:不要重新发明轮子,如果你要做的事情看起来是十分常见的 Java发展至今正常可能遇到的需求工具类,不要着急自己写一个,首先先找Java自带的util包下看看有没有,如果没有就到谷歌的common.lang3下的util包下,或者Spring社区当中也出了很多的工具包.只要是Spring相关的项目,引入简便,使用起来也十分轻松
开发当中涉及到保留小数超过4位数建议使用Bigdecimal,如果只是普通的保留两位小数,double完全有这个实力能够计算准确,基本类型的double和Bigdecmail相比,性能大致相差5倍.如下代码所示
public static void main(String[] args) {
long begin = System.currentTimeMillis();
BigDecimal sum = BigDecimal.ZERO;
for(int i =0; i<=10000;i++){
sum = sum.add(new BigDecimal(1));
}
long end = System.currentTimeMillis();
System.out.println("BigDecimal总耗时:"+(end - begin)+"结果:"+sum);//5ms
long begin1 = System.currentTimeMillis();
double sum1 = 0;
for(int i =0; i<=10000;i++){
sum1 = sum1 + 1;
}
long end1 = System.currentTimeMillis();
System.out.println("double总耗时:"+(end1 - begin1)+"结果:"+sum1);//0ms
}
public static void main(String[] args) {
long begin = System.currentTimeMillis();
Integer sum = 0;
for(int i =0; i<=1000000;i++){
sum = sum + 1;
}
long end = System.currentTimeMillis();
System.out.println("Integer总耗时:"+(end - begin)+"ms,结果:"+sum);//10ms
long begin1 = System.currentTimeMillis();
int sum1 = 0;
for(int i =0; i<=1000000;i++){
sum1 = sum1 + 1;
}
long end1 = System.currentTimeMillis();
System.out.println("int总耗时:"+(end1 - begin1)+"ms, 结果:"+sum1);//0ms
}
综上所述:能使用基本类型,就尽量别使用装箱基本类型