• 整理之Java容器


    主要参考:JAVA常见容器

    Set,List,Map,Vector,ArrayList的区别

    Java所有容器见下图:

    Java容器关系图

    数组

    int[] t = new int[10];		//声明并创建长度为10的数组,用默认值占位,String默认值为null
    int[] t = new int[] {1, 2, 3};		//声明并创建数据同时初始化初值
    int[] t = {1, 2, 3};		//同楼上
    //数组的长度都是不可变的
    

    List

    list是有序的集合,内容也可以重复

    • ArrayList是采用数组实现的list,所以利于随机查找和修改,不利于增加和删除。
    • LinkedList是采用循环双链表实现的list,所以利于在插入和删除,不利于随机查找和修改。而且由于需要存储节点,LinkedList占用空间较大
    • Vector与ArrayList的唯一区别是Vector是线程安全、同步、效率低,ArrayLisy相反
    • Stack类继承于Vector,实现一个栈,提供push、pop、peek(不出栈的pop)、search、empty等方法

    list的子类都继承了iterator方法以供遍历:

    ArrayList<Integer> al = new ArrayList<>();
    Iterator<Integer> it = al.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
    

    此外List还提供ListIterator方法,允许增加、删除、修改和向前向后移动,使用方法同Iterator。

    ArratList和Vector的默认容量为10, 最大容量是Integer.MAX_VALUE - 8。】

    ArrayList采用1.5倍扩容,Vector采用2倍扩容如果扩容后仍不够用,则直接扩容到所需的大小。

    Map

    1.HashMap与HashTable

    HashMap与HashTable类似于ArrayList与Vector,实现原理相同,但是前者非线程安全非同步,效率高;后者相反。

    Map的key是不可重复的

    Map的常用Api:

    HashMap<Integer, String> hm = new HashMap();
    hm.put(1, "英语");
    hm.put(2, "语文");
    hm.put(3, "数学");
    hm.replace(1, "化学");			 //将key=1的value替换
    Boolean i = hm.replace(1, "英语", "化学");		//如果key=1的value=英语则替换为化学,否则不替换
    hm.remove(1);						//这一对函数的原理同replace
    Boolean i = hm.remove(1, "英");
    Set<Entry<K, V>> entrySet = hm.entrySet();		//Map的实际元素就是Entry
    hm.getOrDefault(Object key, String defValue);//取出key对应的value,如果没有则返回默认值defValue
    hm.putIfAbsent(Object key, String defValue);//插入键值对.如果key不存在则
    

    HashMap内部采用Hash算法进行排序,HashMap默认容量为16,容量为2^n,加载因子为0.75(已有元素超过总容量的75%是扩容),如:

    HashMap<Integer, String> hm = new HashMap();
    hm.put(15, "数学");   //15
    hm.put(19, "英语");   //4
    hm.put(72, "语文");   //8
    for (Map.Entry<Integer, String> e : hm.entrySet()) {
        System.out.println(e.getKey() + "    " + e.getValue());
    }
    //上面输出为:
    //19    英语
    //72    语文
    //15    数学
    

    HashTable默认容量为11,加载因子为0.75,扩容方式为:2*原容量+1

    原理原理参考这篇文章

    2.LinkedHashMap

    LinkedHashMap继承了HashMap。但是与HashMap不同的是:LinkedHashMap插入元素和取出元素的顺序是一致的,因为其内部维持了一个双向链表,用于记录迭代顺序。

    LinkedHashMap扩容机制同HashMap

    3.TreeMap

    TreeMap同样有序,但是TreeMap是按照字典顺序升序排列key(数字0-9,字母a-z)。如:

    TreeMap<String, String> tm = new TreeMap<>();
    tm.put("aircrew", "英语");
    tm.put("aircraft", "数学");
    tm.put("rabbit", "语文");
    tm.put("airdrome", "语文");
    for (Map.Entry<String, String> e : tm.entrySet()) {
        System.out.println(e.getKey() + "    " + e.getValue());
    }
    //以上输出为:
    //aircraft    数学
    //aircrew    英语
    //airdrome    语文
    //rabbit    语文
    

    TreeMap由红黑树算法实现,无容量限制

    Set

    Set内部元素是无序、确定、单一的。Set比较元素是否相同使用equals而不是==。

    Set的主要子类有HashSet、LinkedHashSet和TreeSet,其关系与Map的三个子类相同。

    HashSet用HashMap来实现,其内部实例化一个HashMap用于存储数据,但只用到了key,value用一个Object()代替。

    所以在排序和扩容方面,HashSet和HashMap完全相同。

    Queue

    除了以上三大类数据结构外,Java还提供了队列的接口Queue(LinkedList实现了其子接口Deque,可以当做Queue使用)。

  • 相关阅读:
    scala与java的区别
    寒假第四天
    冲刺(第六天)
    冲刺(第五天)
    冲刺(第四天)
    冲刺(第三天)
    冲刺(第二天)
    第十周总结
    冲刺(第一天)
    文本中单词统计
  • 原文地址:https://www.cnblogs.com/lizhenxin/p/12449471.html
Copyright © 2020-2023  润新知