Java中的集合
在涉及到线程安全时,推荐使用:因为效率更高
ArrayList 对应 CopyOnWriteArrayList
HashSet 对应 CopyOnWriteArraySet
TreeSet 对应 ConcurrentSkipListSet
HashMap 对应 ConcurrentHashMap 而不是使用 Hashtable
ConcurrentHashMap:synchronized锁是局部锁定,只锁定桶。当对当前元素锁定时,其他元素不锁定
Hashtable:锁定整个哈希表,一个操作正在进行时,其他操作也同时锁定,效率低
TreeMap 对应 ConcurrentSkipListMap
for循环和Iterator遍历单列集合的性能问题:
对于实现了RandomAccess接口的类来说,使用for循环遍历比使用Iterator遍历更加高效快速。
RandomAccess是一个标记接口,用于标明实现了该接口的List支持快速随机访问。并且指出了该接口的主要用途是当随机或顺序访问一些List时,允许泛型算法改变它们的行为来提升性能。
例如:ArrayList实现了RandomAccess接口,用for循环遍历比iterator迭代器遍历快,LinkedList用iterator迭代器遍历比for循环遍历快。
不建议使用,keySet获取迭代器一次,通过 get 又迭代一次,性能低。
3.jdk8以后使用Map接口中的默认方法遍历:
源码:
default void forEach(BiConsumer<? super K,? super V> action) BiConsumer接口中的方法: void accept(T t, U u) 对给定的参数执行此操作。 参数 t - 第一个输入参数 u - 第二个输入参数
演示:
public class Demo01 { public static void main(String[] args) { HashMap<String,String> m1 = new HashMap(); m1.put("001", "zhangsan"); m1.put("002", "lisi"); m1.forEach((key,value)->{ System.out.println(key+"---"+value); }); } }
使用迭代器遍历Collection集合:
/** * 使用迭代器遍历Collection集合 */ public class IteratorTest { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); coll.add("A"); coll.add("B"); coll.add("C"); coll.add("D"); coll.add("E"); Iterator<String> iterator = coll.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }