1、从Map中取key和值
当循环中只需要Map的主键时,迭代keySet()是正确的,但是,当需要主键和取值时,迭代entrySet()才是更高效的做法,比先迭代keySet()后再去get取值性能更加。
package com.zzb.test.admin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; /** * 当循环中只需要Map的主键时, * 迭代keySet()是正确的,但是,当需要主键和取值时, * 迭代entrySet()才是更高效的做法,比先迭代keySet()后再去get取值性能更加 * Created by zzb on 2019/12/5 14:11 */ public class TestOne { private static final Logger logger = LoggerFactory.getLogger(TestOne.class); public static void main(String[] args){ Map<String,String> map = new HashMap<>(); map.put("one","1"); map.put("two","2"); map.put("three","3"); map.put("four","4"); map.put("five","5"); //反例 for (String key:map.keySet()) { logger.info("key:{}",key); logger.info("value:{}",map.get(key)); } //正例 for (Map.Entry<String,String> entry:map.entrySet()) { logger.info("key:{}",entry.getKey()); logger.info("value:{}",entry.getValue()); } } }
2、集合判空
使用Collection.size()来检测空逻辑上是没有问题的,但是使用Collection.isEmpty()可以获得更好的性能。后者任何时候实现的时间复杂度都是0(1),而前者有时候实现的事件复杂度可能是0(n),如果需要判断是否为null,使用CollectionUtils
package com.zzb.test.admin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /** * 使用Collection.size()来检测空逻辑上是没有问题的, * 但是使用Collection.isEmpty()可以获得更好的性能。后者任何时候实现的时间复杂度都是0(1), * 而前者有时候实现的事件复杂度可能是0(n) * 如果需要判断是否为null,使用CollectionUtils * Created by zzb on 2019/12/5 14:11 */ public class TestOne { private static final Logger logger = LoggerFactory.getLogger(TestOne.class); public static void main(String[] args){ List<String> list = null; if (CollectionUtils.isEmpty(list)) { logger.info("CollectionUtils空集合"); } list = new ArrayList<>(); if (list.size() == 0) { logger.info("空集合"); } list.add("1"); if (!list.isEmpty()) { logger.info("非空集合"); } } }
3、不要将集合对象传给自己
由于某些方法要求参数在执行期间保持不变,因此将集合传递给自身可能会导致异常行为
package com.zzb.test.admin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; /** * 由于某些方法要求参数在执行期间保持不变,因此将集合传递给自身可能会导致异常行为 * Created by zzb on 2019/12/5 14:11 */ public class TestOne { private static final Logger logger = LoggerFactory.getLogger(TestOne.class); public static void main(String[] args){ List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); if (list.containsAll(list)) { logger.info("无意义,list.containsAll(list)总是返回true"); } //性能差,不如list.clear()性能高 list.removeAll(list); // list.clear(); if (list.isEmpty()) { logger.info("移除自己之后"); } } }
4、初始化集合大小
集合也是有大小限制的,每次扩容的时间复杂度很有可能是0(n),所以尽量初始化集合的大小,减少扩容的次数
未完待续~~~~