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());
        }
    }
}
posted @ 2019-12-23 13:05  糖不甜,盐不咸  阅读(156)  评论(0编辑  收藏  举报