1、迭代entrySet() 获取Map 的key 和value
当循环中只需要获取Map 的主键key时,迭代keySet() 是正确的;但是,当需要主键key 和取值value 时,迭代entrySet() 才是更高效的做法,其比先迭代keySet() 后再去通过get 取值性能更佳。
优化前
HashMap< String, String> map = new HashMap < > ( ) ;
for ( String key : map. keySet ( ) ) {
String value = map. get ( key) ;
}
优化后
HashMap< String, String> map = new HashMap < > ( ) ;
for ( Map. Entry< String, String> entry: map. entrySet ( ) ) {
String key = entry. getKey ( ) ;
String value = entry. getValue ( ) ;
}
2、使用Collection.isEmpty() 检测空
使用Collection.size() 来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历,但是某些通过Collection.size() 方法实现的时间复杂度可能是O(n)
优化前
LinkedList<Object> collection=new LinkedList<>();
if (collection.size()==0){
System.out.println("collection is empty");
}
优化后
LinkedList< Object> collection= new LinkedList < > ( ) ;
if ( collection. isEmpty ( ) ) {
System. out. println ( "collection is empty" ) ;
}
if ( CollectionUtils. isEmpty ( collection) ) {
System. out. println ( "collection is empty" ) ;
}
3、初始化集合时尽量指定其大小
尽量在初始化时指定集合的大小,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。
优化前
int [ ] arr = new int [ ] { 1 , 2 , 3 , 4 } ;
List< Integer> list = new ArrayList < > ( ) ;
for ( int i : arr) {
list. add ( i) ;
}
优化后
int [ ] arr = new int [ ] { 1 , 2 , 3 , 4 } ;
List< Integer> list = new ArrayList < > ( arr. length) ;
for ( int i : arr) {
list. add ( i) ;
}
4、使用StringBuilder 拼接字符串
一般的字符串拼接在编译期Java 会对其进行优化,但是在循环中字符串的拼接Java 编译期无法执行优化,所以需要使用StringBuilder 进行替换。
优化前
String str = "" ;
for ( int i = 0 ; i < 10 ; i++ ) {
str += i;
}
优化后
String str1 = "love" ;
String str2 = "you" ;
String str = str1 + str2;
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < 10 ; i++ ) {
sb. append ( i) ;
}
5、使用静态代码块实现赋值静态成员变量
对于集合类型的静态成员变量,应该使用静态代码块赋值,而不是使用集合实现来赋值。
优化前
private static Map< String, String> map= new HashMap < String, String> ( ) {
{
map. put ( "abc" , "1024" ) ;
map. put ( "adc" , "1021" ) ;
map. put ( "acd" , "1022" ) ;
}
} ;
private static List< Integer> list= new ArrayList < Integer> ( ) {
{
list. add ( 1 ) ;
list. add ( 3 ) ;
list. add ( 2 ) ;
}
} ;
优化后
private static Map< String, String> map = new HashMap < String, String> ( ) ;
static {
{
map. put ( "abc" , "1024" ) ;
map. put ( "adc" , "1021" ) ;
map. put ( "acd" , "1022" ) ;
}
}
;
private static List< Integer> list = new ArrayList < Integer> ( ) ;
static {
{
list. add ( 1 ) ;
list. add ( 3 ) ;
list. add ( 2 ) ;
}
}
;
6、字符串转化使用String.valueOf(value) 代替 " " + value
把其它对象或类型转化为字符串时,使用String.valueOf(value) 比 ""+value 的效率更高。
优化前
int num= 1024 ;
String love= "" + num;
优化后
int num= 1024 ;
String love= String. valueOf ( num) ;
7、 避免使用BigDecimal(double)
BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
优化前
BigDecimal bigDecimal= new BigDecimal ( 0.1D ) ;
优化后
BigDecimal bigDecimal= BigDecimal. valueOf ( 0.1D ) ;
8、返回空数组和集合而非 null
若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁。
优化前
private static List< Integer> getList ( ) {
return null;
}
private static Map< String, String> getMap ( ) {
return null;
}
优化后
private static List< Integer> getList ( ) {
return Collections. EMPTY_LIST;
}
private static Map< String, String> getMap ( ) {
return Collections. EMPTY_MAP;
}
9、优先使用常量或确定值调用equals 方法
对象的equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals 方法。
优化前
private static boolean get ( String name) {
return name. equals ( "zhang san" ) ;
}
优化后
private static boolean get ( String name) {
return "zhang san" . equals ( name) ;
}
10、String.split(String regex)部分关键字需要转译
使用字符串String 的plit 方法时,传入的分隔字符串是正则表达式,则部分关键字(比如 .[]()| 等)需要转义。(需要转义的字符 . $ | ( ) [ { ^ ? * + \\ )
优化前
String str = "aa.bb.cc" ;
String[ ] split = str. split ( "." ) ;
优化后
String str = "aa.bb.cc" ;
String[ ] split = str. split ( "\\." ) ;
总结的不太全,不喜勿喷