zoukankan      html  css  js  c++  java
  • 集合类关系

    Iterator所有的集合类,都实现了Iterator接口,可以获得Iterator(迭代器),这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
        1.hasNext()是否还有下一个元素。
        2.next()返回下一个元素。
        3.remove()删除当前元素。

    一、主要接口简介:

      1、Set 无序,不能包含重复元素,

      2、List有序,可以包含重复元素,提供了按位索引

      3、Map :包含了key-value对 ,key不能重复,value可以重复,根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值

    二、遍历

      1、Iterator: 迭代输出,使用最多

      2、ListIterator:是Iterator的子接口,专门用于输出List

      3、foreach

      4、for循环

    三、Map

      1、HashMap 最常用的Map 遍历时取得数据顺序随机,键对象不可重复。

      2、Hashtable 是Hashtable的线程安全版,支持线程同步,不允许记录键或值为null,同时效率较低。

      3、ConcurrentHashMap 线程安全,并且锁分离,ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

      4、LinkedHashMap 保存了记录的插入顺序, 遍历有序,遍历时比HashMap慢,有HashMAp全部特性

      5、TreeMap 实现 SortMap接口, 能够把记录按键排序,默认升序,也可指定比较器,不允许key为空,非同步

    四、map遍历

      1、keySet()

      先将键值存入set,在遍历set ,根据键值取值。

    1 //先获取map集合的所有键的set集合,keyset()
    2 Iterator it = map.keySet().iterator();
    3  //获取迭代器
    4 while(it.hasNext()){
    5 Object key = it.next();
    6 System.out.println(map.get(key));
    7 }

      2、entrySet()

        Set<Map.Entry<K,V>> entrySet()   把(key-value)作为一个整体,一对一地存放到Set集合当中。Map.Entry表示映射关系。

    1 //将map集合中的映射关系取出,存入到set集合
    2 Iterator it = map.entrySet().iterator();
    3 while(it.hasNext()){
    4 Entry e =(Entry) it.next();
    5 System.out.println("键"+e.getKey () + "的值为" + e.getValue());
    6 }

      

    五、主要实现类区别

      1、ArrayList和LinkList

        ArrayList用于查询较多,LinkList用于增删改较多

      2、Vector和ArrayList(都是数组方式存储)

        1)Vector线程同步,ArrayLIst线程异步,不考虑线程ArrayList效率较高。

        2)如果结合中的元素,数目大于目前集合长度,Vector增长率为目前的100%,ArrayList为50%,如果在集合中使用数据量比较大的数据,用Vector有优势。

      3、HashMap和TreeMap

        1)HashMap通过hashcode查找,TreeMap元素保持固定顺序,如有需要得到有序结果,使用TreeMap

        2)在Map中插入、删除、定位元素,使用HashMap

      4、HashMap、HashTable和ConcurrentHashMap

        1)HashMap允许键和值是null(只允许一个键是null),而HashTable不允许键或者值是null。

        2)HashMap不是线程同步,适合单线程,HashTable是线程同步,适合多线程。

        3)HashMap提供了可供迭代的键的集合,因此HashMap是快速失败的,HashTable提供了对键的列举(Enumeration)

        4)HashMap是非线程安全的,HashTable是线程安全的, 因为线程安全问题,HashMap效率比HashTable要高。线程安全主要在与put() 函数,当向map里添加数据达到阈值时,map会进行自动的扩充,而扩充的机制在于先建立一个新的table在将原本的数据进行填入,而此时如果有多个线程进行put(),便会产生多个newTable,先生成的table会被覆盖。而HashTable使用Synchronized标记put方法解决线程问题,而且为了保证数据同步,get方法甚至都会加锁,造成效率低下。一般认为HashTable是一个遗留的类,一般不推荐使用,因为遗留内部很多没有优化,即使在多线程环境下,也有同步的ConcurrentHashMap代替,没必要用。

         ConcurrentHashMap 在内部建立分段Segment, 将数据进行分段存储。修改为对某一段数据进行加锁,其他线程仍然可以处理其他的数据。在查找数据时采用重哈希分别来确定段位和数据位。

  • 相关阅读:
    利用同步辅助类CountDownLatch计算多线程的运行时间
    i++的原子性问题
    Volatile关键字以及线程的内存可见性问题
    创建线程的第三种方式以及简单使用
    java8新特性-lambda表达式和stream API的简单使用
    springboot整合activemq
    springboot整合redis单机及集群
    JAVA-基础(一)
    CentOS-文件操作
    理解AngularJS的作用域Scope
  • 原文地址:https://www.cnblogs.com/the-wang/p/7659592.html
Copyright © 2011-2022 走看看