zoukankan      html  css  js  c++  java
  • 集合类List、Set、Map的区别、联系和遍历方式

    说集合之前,先说说数组和集合:

    1.数组长度是固定的,当超过容量后会在内存中重新创建一个原来数组1.5倍长度的新数组,再把元素存进去;数组既可以存储基本数据类型,又可以存储引用数据类型。

    2.集合长度是可变的,集合只能存储引用数据类型,集合也可以存储基本数据类型,但是在存储时自动装箱变成对象。

    3.如果元素个数是固定的推荐用数组,如果元素不是固定的推荐用集合。

    一.三者关系

    1.Collection接口

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。如何遍历Collection中的每一个元素,不论Collection的实际类型如何都支持一个iterator()方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

    Iterator it = collection.iterator();
    while(it.hasNext()){
        Object obj = it.next();
    }

    List和Set是Collection两个派生接口。

    2.Set

    Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的Set实现类依赖添加的对象的equals()方法来检查等同性。

    HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的。

    TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap。

    Set的两种遍历:

    (1)迭代遍历

    Iterator<String> iterator = set.iterator(); 
    while (iterator.hasNext()) {  
        System.out.println(iterator.next());  
    }

    (2)for循环遍历

    for (String data : set) {  
        System.out.println(data);  
    } 

    3.List

    List接口继承了Collection 接口,特点是存储有序,有索引,可以存储重复元素。 实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。

    ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。

    LinkedList:由链表实现的List。查询元素慢(二分查找,从头或从尾一个一个往中间找),但是往List中间插入和移除元素的速度很快。

    Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类!!当两个或多个线程同时访问时也是性能良好的

    List的遍历方式由以下几种:

    (1)普通for循环

    for (int i = 0; i < list.size(); i++) {  
        System.out.println(list.get(i));  
    } 

    (2)迭代遍历

    Iterator<String> iterator = list.iterator();  
    while(iterator.hasNext()){  
        System.out.println(iterator.next());  
    }

    (3)增强for循环

    for(String data : list){  
        System.out.println(data);  
    }

    4.List的三个子类的特点

    ArrayList:

    底层数组结构是数组,查询快,增删慢;线程不安全,效率高。

    Vector:

    底层数据结构是数组,查询快,增删慢;线程安全,效率低。

    Vector相对ArrayList查询慢(线程安全),Vector相对LinkedList增删慢。

    LinkedList:

    底层数据结构是链表,查询慢,增删快;线程不安全,效率高。

    5.Map

    将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。

    “集合框架”提供两种常规的Map实现:HashMapTreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按顺序遍历键,那么TreeMap会更好。根据集合大小,先把元素添加到HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap可能更快。使用HashMap要求添加的键类明确定义了hashCode()实现。有了TreeMap实现,添加到映射的元素一定是可排序的。

    HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。

    HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。

    TreeMap: 实现这样一个映象,对象是按键升序排列的。

    Map的几种遍历方式:

    (1)二次取值

    for (String key : map.keySet()) {  
        System.out.println(key + map.get(key));  
    }

    (2)通过Map.entrySet使用iterator遍历key和value

    Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();  
    while (iterator.hasNext()) {  
        Map.Entry<String, String> entry = iterator.next();  
        System.out.println(entry.getKey() + entry.getValue());  
    } 

    (3)通过Map.entrySet遍历key和value

    for (Map.Entry<String, String> entry : map.entrySet()) {  
        System.out.println(entry.getKey() + entry.getValue());  
    }

    (4)通过Map.values()遍历所有的value,但不能遍历key

    for (String value : map.values()) {  
        System.out.println(value);  
    } 
  • 相关阅读:
    【转】Reactor与Proactor两种模式区别
    [转] 比较清楚的阻塞与非阻塞和同步与异步
    一眨眼已做开发十年
    【转】Linux CentOS内核编译:下载CentOS源码、编译2.6.32-220的错误(apic.c:819 error 'numi_watchdog' undeclared)
    [转] Makefile经典教程(掌握这些足够)
    [转]centos 下 autoconf版本升级
    centos安装CODEBLOCKS
    【转】linux 编译安装nginx,配置自启动脚本
    Install Qt creator
    LeetCode 983. Minimum Cost For Tickets
  • 原文地址:https://www.cnblogs.com/lyx210019/p/9388124.html
Copyright © 2011-2022 走看看