技巧一:
在写工具类的时候,要加入一个私有的构造方法,这样做的目的是防止其他人通过new的方式来创建对象,保证了整个全局中对象的唯一性,也就是单例。
技巧二:
在一个方法内部,有时候需要创建局部变量,这时候我们尽量用基本数据类型,下面的例子就是,对一个数进行累加。如果是用包装类型Long定义变量,它的使用效率是使用基本数据类型long的10倍。
public class Sum {
public static void main(String[] args) {
long start = System.currentTimeMillis();
long sum = 0L;//new出对象了(21亿个)
for (long i = 0; i < Integer.MAX_VALUE; i++) {//21亿次
sum += i;
}
System.out.println(sum);
System.out.println("spend time:"+(System.currentTimeMillis()-start)+"ms");
}
}
技巧三:
复合胜过继承
下面有一个需求,在往一个集合中添加数据的时候, 每次添加一个数据,就会在计数器中增加一个数,以此记录一共增加了多少次,那么第1种方式是通过继承的方式首先继承了HashSet类。然后重写了里面的add方法和addall方法。在进行数据添加的时候,设置一个成员变量,然后对这个成员变量每增加一次,添加一个数。但是其运行结果是不准的,因为这种通过继承的方式来实现技术,他有时候导致对这个继承类的结构进行改变,比如说。在调用addall的方法的时候,它的底层可能再次会调用add方法,这个时候技术是不准确的。
正确的方式应该是,使用复合的方式,也就是创建一个类,然后把这个集合按照以成员变量的方式设置进去,作为一个属性,然后再给这个集合添加数字的时候,创建一个成员变量addcount,在往集合添加数的时候对addcount进行累加,这时候得出的数据是准确的。这种方式并没有改变集合的内部逻辑。 下面是错误的案例:
/*
*优先使用复合胜过继承
* 继承类:统计增加的个数
*/
public class ExtendsHashSet<E> extends HashSet<E> {
private int addCount = 0;//计数器(每加一个元素就+1)
public ExtendsHashSet() {
}
public ExtendsHashSet(int initCap, float loadFactor) {
super(initCap, loadFactor);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
public static void main(String[] args) {
ExtendsHashSet<String> s = new ExtendsHashSet<String>();
s.addAll(Arrays.asList("King", "Mark", "Deer"));
System.out.println(s.getAddCount());
}
}
下面是正确的案例:
package ch07.p7;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/*
*优先使用复合胜过继承
* 复合类
*/
public class CompHashSet<E>{
private final Set<E> s;
private int addCount = 0;//特殊需求:元素个数
public CompHashSet(Set<E> s) {
this.s = s;
}
//添加一个元素
public boolean add(E e) {
addCount++;
return s.add(e);
}
//添加一组元素
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return s.addAll(c);
}
public int getAddCount() {
return addCount;
}
public static void main(String[] args) {
CompHashSet<String> s = new CompHashSet<String>(new HashSet<String>());
s.addAll(Arrays.asList("King", "Mark", "Deer"));
System.out.println(s.getAddCount());
}
}