反例一:
public class Producer {
public static void main(String[] args) {
// 不要这么做
String s = new String("我是多余的");
System.out.println(s);
}
}
改进后:
public class Producer {
public static void main(String[] args) {
String s = "我是多余的";
System.out.println(s);
}
}
原因:String本身是一个实例 new String()也是个实例
反例二:判断是否为罗马数字
public class Producer {
static boolean isRomanNumeral(String s) {
return s.matches("^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");
}
public static void main(String[] args) {
boolean romanNumeral = Producer.isRomanNumeral("11233");
System.out.println(romanNumeral);
}
}
虽然string.matches是检查一个字符串是否与某个正则表达式匹配的最容易的方式,但它不适合性能非常关键的场景下重复调用。
修改:
public class Producer {
// 复用创建开销高的对象提升高性能
private static final Pattern Roman = Pattern.compile("^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");
static boolean isRomanNumeral(String s) {
return Roman.matcher(s).matches();
}
public static void main(String[] args) {
boolean romanNumeral = Producer.isRomanNumeral("V");
System.out.println(romanNumeral);
}
}
自动装箱也会创建不必要的对象。自动装箱模糊了基本类型与其封装类型,但并没有消除这种区别。(例如:interger 和 int)
反例:
public class Boxing {
private static long sum() {
Long sum =0L;
for (int i = 0; i <=999999999; i++) {
sum +=i;
}
return sum;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 获取开始时间
long sum = Boxing.sum();
long endTime = System.currentTimeMillis(); // 获取结束时间
long elapsedTime = endTime - startTime; // 计算耗时
System.out.println(elapsedTime);
}
}
用时:
4250
Process finished with exit code 0
将Long 改为long:
public class Boxing {
private static long sum() {
long sum =0L;
for (int i = 0; i <=999999999; i++) {
sum +=i;
}
return sum;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 获取开始时间
long sum = Boxing.sum();
long endTime = System.currentTimeMillis(); // 获取结束时间
long elapsedTime = endTime - startTime; // 计算耗时
System.out.println(elapsedTime);
}
}
用时:
916
Process finished with exit code 0
结论显而易见:应该选择基本类型而不是封装类型,并提防无意中的自动装箱。
Tips:所有内容开源且不追加任何条件,看完后觉得内容不错,点个赞不为过吧!