Set 集合

Set 集合通常不能记住元素的添加顺序。Set 集合不允许包含相同的元素。

  • HashSet 是 Set 接口的实现类,按照 Hash 算法存储集合中的元素。HashSet 不是同步的,如果多个线程同时访问一个 HashSet,则必须通过代码来保证其同步。集合元素值可以是 null。
  • LinkedHashSet 是一个 HashSet 的子类,也是根据元素的 hashcode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得看起来是以插入顺序保存的。因为需要维护元素的插入顺序,因此性能略低于 HashSet 的性能。
  • TreeSet 是 SortedSet 接口的实现类,正如 SortedSet 名字所暗示的,TreeSet 可以确保集合元素处于排序状态。TreeSet 采用「红黑树」的数据结构来存储集合元素。TreeSet 支持两种排序方法:自然排序和定制排序。如果试图将一个对象添加到 TreeSet 时,该对象的类必须实现 Comparable 接口,否则,程序将会抛出 ClassCastException 异常。TreeSet 只能添加同一种类型的对象。
  • EnumSet 是专门为枚举类设计的集合类,EnumSet 的集合元素也是有序的,以枚举值在 Enum 类内的定义顺序决定集合元素的顺序。EnumSet 集合不允许加入 null 元素。

Set 实现类的性能分析

HashSet 和 TreeSet 是 Set 中两个典型的实现,HashSet 性能总是比 TreeSet 好,因为 TreeSet 需要额外的红黑树算法维护集合元素的次序。但需要保持排序的 Set 时,才应该使用 TreeSet,否则都应该使用 HashSet。

HashSet 还有一个子类:LinkedHashSet。对于普通的插入、删除操作,LinkedHashSet 比 HashSet 要略微慢一点,这是由于维护链表所带来的开销造成的。但是由于有了链表,遍历 LinkedHashSet 会更快。

EnumSet 是所有 Set 实现类中性能最好的。

需要注意的是: Set 的三个实现类 HashSet TreeSet EnumSet 都是线程不安全的。通常可以通过 Collections 工具类的 synchronizedSortedSet 方法来包装 Set 集合。此操作最好在创建时进行,防止对 Set 集合意外的非同步访问。

List 集合

List 集合代表一个元素有序、可重复的集合。索引从0开始。

  • void add(int index, Object element) 将元素插入到 List 集合的 index 处
  • boolean addAll(int index, Collection c) 将集合 c 所包含的元素插入到 List 集合的 index 处
  • Object get(int index) 返回集合 index 索引处的元素
  • int indexOf(Object o) 返回对象 o 在 List 集合中第一次出现的位置索引
  • int lastIndexOf(Object o) 返回对象 o 在 List 集合最后一次出现的位置索引
  • Object remove(int index) 删除并返回 index 索引处的元素
  • Object set(int index, Object element) 将 index 索引处的元素替换为 element 对象,返回被替换的旧元素。这里的 index 不能超出已有的索引长度
  • LIst subList(int fromIndex, int toIndex) 返回从索引 fromIndex (包含) 到索引 toIndex (不包含)处所有的集合元素组成的子集合。果然,超出了索引,就会报错 java.lang.IndexOutOfBoundsException
  • void replaceAll(UnaryOperator operator) 根据 operator 指定的计算规则重新设置 List 集合的所有元素
  • void sort(Comparaotr c) 根据 Comparator 参数对 List 集合的元素排序

各种线性表的性能分析

List 就是一个线性表的接口,而 ArrayList、LinkedList 又是线性表的两种典型:基于数组的线性表和基于链的线性表。Queue 代表了队列,Deque 代表了双端队列(既可以作为队列使用,也可以作为栈使用)。

LinkedList 集合不仅提供了 List 的功能,还提供了双端队列、栈的功能。

数组以一块连续内存保存所有的数组元素,所以数组在随机访问时性能最好;内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。总体来讲,ArrayList 性能要比 LinkedList 的性能要好,因此,大部分时候使用都应该考虑使用 ArrayList。

Map 集合

Java 基础 - 集合的更多相关文章

  1. JAVA基础-集合(二)

    一.Map整体结构体系 Map是集合的另一大派系,与Collection派系不同的是Map集合是以键值对儿的形式存储在集合的.两个键为映射关系,其中第一个键为主键(主键是唯一的不可重复),第二个键为v ...

  2. Java基础-集合的嵌套

    Java基础-集合的嵌套 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.静态导入 静态导入是在JDK1.5后的新特性,可以减少开发的代码量,但是实际用处是很一般,静态导入的标准 ...

  3. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  4. java基础---集合(1)

    一. 基本概念 集合.数组都是对多个数据进行存储操作的结构,简称Java容器 数组:长度确定,类型确定,对于添加.删除.插入等操作效率不高,元素有序可重复 Java中集合框架顶层框架是:java.ut ...

  5. Java基础——集合源码解析 List List 接口

    今天我们来学习集合的第一大体系 List. List 是一个接口,定义了一组元素是有序的.可重复的集合. List 继承自 Collection,较之 Collection,List 还添加了以下操作 ...

  6. Java基础—集合

    一.概述 Java中的集合框架主要分为两大派别:Collection 和 Map —— 位于util包下 类的基础关系图如下(图片来自百度) 常用: List——有序可重复 Set——无序不可重复 M ...

  7. java基础集合简介Set(三)中

    今天主要说夏set集合,每天抽出一个小时总结下,生活会更加美好! --< java.util >-- Set接口: 数据结构:数据的存储方式: Set接口中的方法和Collection中方 ...

  8. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  9. 十七、Java基础---------集合框架之Map

    前两篇文章中介绍了Collection框架,今天来介绍一下Map集合,并用综合事例来演示. Map<K,V> Map<K,V>:Map存储的是键值对形式的元素,它的每一个元素, ...

  10. 十六、Java基础---------集合框架之Set

    写在前面的话,这篇文章在昨天就写好了,今天打开的时候一不小心将第二天的文章粘贴到了这篇文章,很不幸的是除了标题之外依然面目全非,今天带着沉痛的心情再来写这篇文章! 上篇文章介绍了Collection体 ...

随机推荐

  1. oracle 自定义比较函数

    1>自定义比较函数,targetVal的值为字符串,例如:“>=90”,"2~8"等范围格式,dataVal值为字符串. create or replace funct ...

  2. ApplicaitionContext妙用request解耦合

    本文记录一个web应用中,如果要获取request对象怎么获取,本次主要思考来自看到上次文件必须把request对象放进service层导致的疑问,然后学习总结之. 第一,也是我们最常用的,在cont ...

  3. python文档-基本API命令翻译及使用方法!

    1.使用tkinter.Tk() 生成主窗口(window=tkinter.Tk()): window.title('标题名')         修改框体的名字,也可在创建时使用className参数 ...

  4. jQuery 中的 39 个技巧【申明:来源于网络】

    jQuery 中的 39 个技巧[申明:来源于网络] 地址:http://blog.csdn.net/zhongqi2513/article/details/53704812?ref=myread

  5. Nginx负载均衡后端健康检查

    参考文档:https://www.cnblogs.com/kevingrace/p/6685698.html 本次使用第三方模块nginx_upstream_check_module的,要使用这个第三 ...

  6. Docker入门基础(一)

    Docker入门基础 Linux只存在文件目录,不存在“盘”的概念 Dockers优点:方便部署环境.资源占用少(微服务) Docker的三大概念 镜像:类似虚拟机的镜像.用俗话说就是安装文件.容器: ...

  7. Unable to convert MySQL date/time value to System.DateTime问题解决方案

    原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-00 00:00:00,这样的数据读出来转换成System.DateTime时就会有问题: 解决 ...

  8. 高性能Nginx服务器-负载均衡

    Location正则表达式 location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. locatio ...

  9. Android Studio--》Gradle Scripts配置说明

    什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装 ...

  10. kafka7 探索生产者同步or异步发送消息

    1.生产者:在发送完消息后,收到回执确认. 主要是在SimpleProducer.java中修改了发送消息的2行代码,用到了回调函数,修改如下: //发送消息 ProducerRecord<St ...