• 集合类(一)


    集合接口:

    Collection(interface):List,Set,Queue;继承 Iterator 接口;

    Map接口与Collection无关,键值对

    List:ArrayList,LinkedList,Vector

    ArrayList,Vector,都是基于数组的存储模型,可以通过下标(索引)直接找到数据,检索时间复杂度为O(1),在末尾插入,删除操作也是一样的,但是在其它位置增加,删除的时间复杂度为O(n)

    LinkedList,基于双向链表结构,增加,删除的时间复杂度为O(1),检索时间复杂度为O(n)

    频繁增删可选择LinkedList,频繁检索尽量选择ArrayList或Vector

    ArrayList,Vector数组扩容,ArrayList扩容为原容量的1.5倍,Vector默认扩容为原来的2倍,可在初始化时配置参数capacityIncrement来设置增量

    Vector是线程安全的,通过在方法上增加修饰符synchronized实现,性能会有所损耗

    java.util.Collections中提供了一个静态内部类SynchronizedList也实现了线程同步,使用synchronized同步代码块(遍历未同步),详见SynchronizedList和Vector的区别

    Map:HashMap,HashTable,ConcurrentHashMap,LinkedHashMap,TreeMap

    HashMap,键和值都允许为null;线程不安全;数组默认初始长度为16,扩容为原长*2;位运算取哈希

    HashTable,键值都不能为null;线程安全,方法用synchronized修饰;数组默认初始长度11,扩容为原长*2+1(左移1位 +1);取模得到哈希,因为线程安全、哈希效率的问题,HashMap效率比HashTable效率更高

    ConcurrentHashMap,键值都不能为null;线程安全的HashMap的实现;哈希运算与HashMap不同

    HashTable对对象加锁,当HashTable较大的时候,性能很差,ConcurrentHashMap引入了分割(Segment),将大的Map分成多个小的Segment中,在多线程下Lock的只是一个Segment的元素,从而提升操作性能

    LinkedHashMap,保存了数据的插入顺序,遍历操作按先后插入顺序获得数据,较HashMap性能略差

    TreeMap,实现了SortMap接口,保存的记录可根据键排序(默认升序),也可以指定排序的比较器,Iterator遍历得到的数据是已排序的

    Set:HashSet,LinkedHashSet,TreeSet

    Set不允许有重复元素的存在;Set是无序集合,List是有序集合;Set不能通过下标(索引)来访问数据

    HashSet,底层实现采用hash表,提升查询效率

    LinkedHashSet,内部使用散列以加快查询速度,同时使用链表维护元素的次序

    TreeSet,可以对元素进行排序,需实现comparator接口

    HashSet的add方法引用了HashMap的put方法,也是通过比较元素的hashCode,equals,来保证元素不重复,在使用自定义的类时,应重写方法hashcode(),equals()

    Collection是接口,是一个顶级的集合接口,提供了一些接口的基础方法,主要的继承接口有List,Set,Queue

    Collections是一个集合的工具类,提供了一系列的静态方法,同样的工具类有Arrays等

  • 相关阅读:
    Mysql的select加锁分析
    浅析Kubernetes的工作原理
    HTTP/2部署使用
    Amazon新一代云端关系数据库Aurora
    为什么 kubernetes 天然适合微服务
    深入解读Service Mesh背后的技术细节
    微服务的接入层设计与动静资源隔离
    Prim算法和Kruskal算法介绍
    DAG及拓扑排序
    BFS和DFS
  • 原文地址:https://www.cnblogs.com/jhin-wxy/p/10538600.html
Copyright © 2020-2023  润新知