java集合类

1.Iterator:迭代器,它是Java集合的顶层接口(不包括 map 系列的集合,Map接口 是 map 系列集合的顶层接口)

  • Object next():返回迭代器刚越过的元素的引用,返回值是 Object,需要强制转换成自己需要的类型
  • boolean hasNext():判断容器内是否还有可供访问的元素
  • void remove():删除迭代器刚越过的元素

Collection 接口继承的是类 Iterable

Iterator和Iterable比较:

Iterable :存在于 java.lang 包中,封装了 Iterator 接口

Iterator :存在于 java.util 包中。核心的方法next(),hasnext(),remove()。

迭代器使用:

//产生一个 List 集合,典型实现为 ArrayList。
        List list = new ArrayList();
        //添加三个元素
        list.add("Tom");
        list.add("Bob");
        list.add("Marry");
        //构造 List 的迭代器
        Iterator it = list.iterator();
        //通过迭代器遍历元素
        while(it.hasNext()){
            Object obj = it.next();
            System.out.println(obj);
        }

2.Collection:List 接口和 Set 接口的父接口

3.List :有序,可以重复的集合。

List 接口的三个典型实现:

  • List list1 = new ArrayList(); 底层数据结构是数组,查询快,增删慢;线程不安全,效率高
  • List list2 = new Vector();     底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
  • List list3 = new LinkedList();底层数据结构是链表,查询慢,增删快;线程不安全,效率高

4.Set:典型实现 HashSet()是一个无序,不可重复的集合

  • Set hashSet = new HashSet(); 无序;不可重复;不是线程安全的;集合元素可以为 NULL; 其底层其实是一个数组, HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么只需要调用这个公式,就能快速的找到元素或者索引。
  • Set linkedHashSet = new LinkedHashSet(); 不可重复,有序,因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性
  • Set treeSet = new TreeSet(); 不可重复,底层使用 红黑树算法,擅长于范围查询 
    *  如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象, 则要求放入其中的元素的类必须实现 Comparable 接口所以, 在其中不能放入 null 元素
    *  必须放入同样类的对象.(默认会进行排序) 否则可能会发生类型转换异常.我们可以使用泛型来进行限制

举例:

        Set treeSet = new TreeSet();
        treeSet.add(1);  //添加一个 Integer 类型的数据
        treeSet.add("a");   //添加一个 String 类型的数据
        System.out.println(treeSet);  //会报类型转换异常的错误

以上三个 Set 接口的实现类比较:

  共同点:1、都不允许元素重复
      2、都不是线程安全的类,解决办法:Set set = Collections.synchronizedSet(set 对象)
      不同点:
    HashSet:不保证元素的添加顺序,底层采用 哈希表算法,查询效率高。
    LinkedHashSet:HashSet 的子类,底层采用了 哈希表算法以及 链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于 HashSet    
              TreeSet:不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用 红-黑 树算法(树结构比较适合范围查询)

 5.Map:key-value 的键值对,key 不允许重复,value 可以

  • 严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。
  • 这两个集合每一条数据通过映射关系,我们可以看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。
  • 因为 Map 集合即没有实现于 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历。

Map map=HashMap(); 线程不安全,效率高。 允许null键和null值,是基于哈希表的Map接口实现。 哈希表的作用是用来保证键的唯一性的

Map map=LinkedHashMap():是基于Map接口的哈希表和链接列表实现, 由哈希表保证键的唯一性 由链表保证键盘的有序(存储和取出的顺序一致)

Map map=Hashtable():线程安全,效率低。不允许null键和null值

Map map=treeMap(); 是基于红黑树的Map接口的实现。

Map 和 Set 集合的关系

    1、都有几个类型的集合。HashMap 和 HashSet ,都采 哈希表算法;TreeMap 和 TreeSet 都采用 红-黑树算法;LinkedHashMap 和 LinkedHashSet 都采用 哈希表算法和红-黑树算法。

    2、分析 Set 的底层源码,我们可以看到,Set 集合 就是 由 Map 集合的 Key 组成。

posted @ 2018-10-24 21:09  id_于洋  阅读(223)  评论(0编辑  收藏  举报