首页 > 编程语言 >java 集合详细介绍

java 集合详细介绍

时间:2023-12-02 09:33:44浏览次数:48  
标签:Map java HashMap 元素 接口 详细 集合 数组

java 集合详细介绍

集合框架介绍

Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。

Java集合类的整体框架如下:

Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。

List 类:

​ List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayListLinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。

Set接口

​ Set接口通常表示一个集合,其中的元素不允许重复(通过hashcodeequals函数保证),常用实现类有HashSetTreeSetHashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。 我们看到,抽象类AbstractCollectionAbstractListAbstractSet分别实现了CollectionListSet接口,这就是在Java集合框架中用的很多的适配器设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。

Map接口

Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMapHashMapWeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。

Iterator迭代器

Iterator是遍历集合的迭代器不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再HashtableVectorStack中使用。

工具类

ArraysCollections是用来操作数组、集合的两个工具类,例如在ArrayListVector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。

集合和数组的区别

  • 数组长度固定并且无法保存映射关系的数据。集合类可以用来保存数量不确定并且具有映射关系的数据。
  • 数组可以保存基本类型的数据,也可以是引用类型的数据;而集合只能保存对象。

List集合

  • List集合是一组有序可重复集合,元素都有索引,按照添加顺序排列,可以通过索引(LinkedList使用链表)快速查找,其中包含了三个常用的类,分别是ArrayListVectorLinkedList。下面我们逐一分析。

ArrayList:

  • 底层使用的是数组;
  • 根据数组索引查找元素,所以查询快;增删因为要移动元素位置,所以增删慢;
  • 元素按照插入的顺序排列,元素可以重复;
  • 非线程安全

注意点:如果我们在使用ArrayList的时候,提前知道会放入多少长度元素的时候,可以提前指定集合的容量,这样就会减少添加数据的时候扩容的次数,提高性能(当然数据量大时候效果更好)。

Vector

  • 底层使用的是数组;
  • 根据数组索引查找元素,所以查询快;增删因为要移动元素位置,所以增删慢;
  • 元素按照插入的顺序排列,元素可以重复;
  • 线程安全(对方法整体使用synchronized关键字加锁,效率不高)

LinkedList

  • 底层使用的双向链表;
  • 使用链表查找元素,所以查询慢,增删只需要替换掉指针的指向即可,所以增删快;
  • 元素按照插入的顺序排列,元素可以重复;

Set集合

  • Set集合是一组无序不可重复集合(LinkedHashSet元素有序),其中包含了三个常用的类,分别是HashSetTreeSetLinkedHashSet。下面我们逐一分析。

HashSet:

  • 底层是用HashMap数据结构,以存入的元素为Key,因为不关心value,所以value为同一个object,Key元素可以为null。
  • 因为HashMap的Key不可重复,而我们只关心Key,所以HashSet元素不可重复,元素无序
  • 因为内部使用的是HashMap,并没有自身的数据结构,感兴趣可以查看HashMap数据结构

TreeSet:

  • 底层采用树结构来进行存储,内部使用的是TreeMap
  • 元素按照字符串顺序存储,元素不允许为null。

LinkedHashSet:

  • 继承HashSet,内部采用的是LinkedHashMap数据结构
  • 和HashSet一样,内部存储元素不可重复。
  • 和HashSet唯一不同的地方是元素有序
  • 因为内部使用的是LinkedHashMap,它内部的存储元素是LinkedHashMapEntry

Queue集合

队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加、头部删除(先进队列的元素先出队列),跟我们生活中的排队类似。

PriorityQueue

PriorityQueue保存队列 元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
PriorityQueue不允许插入null元素。

Deque

Deque接口是Queue接口的子接口,它代表一个双端队列,当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque

Map集合

  • Map集合中存储的是具有<Key,Value>映射关系的元素,它在工作中是使用最多的数据结构之一。它有几个常用的实现类,HashMapLinkedHashMapHashtableTreeMap,其实前面讲解Set的时候已经提到了,下面我们再逐个分析一下:

HashMap: HashSet中使用的这个数据结构

  • 它通过Key的hashCode()做相关的位运算得到数组中的位置索引,如果hash散列算法以及数组长度合适的话,效率很高。
  • 它可以存入键为null的键值对,JDK1.7是将其存在数组的第一个索引位置。
  • 因为它不是线程安全的,并且在高并发的情况下HashMap容易出现死循环,所以多线程环境下可以使用Collections.synchronizedMap()或者HashTable,它们两个是线程安全的,但是因为HashTable是对方法整体加锁,而Collections.synchronizedMap()是对代码块加锁,所以效率不够高。
  • 在高并发的环境下可以使用ConcurrentHashMap,它采用的是分段加锁机制(1.8中引入了二叉树)

LinkedHashMap:

  • 它是HashMap的子类,它和HashMap的区别是在HashMap的基础上,增加了一个双向链表来记录存储数据的先后顺序,能够保证遍历数据的时候,首先得到的是先插入的数据。

HashTable:

  • 它不允许存入键值对为null(Key和Value都不能为null,否则会报NullPointerException)。
  • 它是线程安全的,但是因为是对方法整体加锁,所以并发性不太好。一般不使用这个类,在不要求线程安全的时候可以使用HashMap, 对线程安全有要求的时候可以使用ConcurrentHashMap
  • 数据结构图和HashMap一致。

TreeMap

  • 它实现了SortedMap接口,查看put源码可以看到,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。
  • 它能够把保存的记录根据键排序,默认是按键值的升序排序,可以在构造方法中指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap

标签:Map,java,HashMap,元素,接口,详细,集合,数组
From: https://www.cnblogs.com/yhm050305/p/17871263.html

相关文章

  • 集合框架(二)LinkedList的常见使用
    一、介绍链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。以下情况使用LinkedList:你需要通过循环迭代来访问列表中的某些元素。需要频繁的在列表开头、中间、末尾......
  • 【Java入门】集合框架介绍与集合框架(一)Map的常见使用及循环的五种方式
     1.集合框架-数组的长度是固定的,集合的长度是可变的。-使用Java类封装出一个个容器类,开发者只需要直接调用即可,不用再手动创建容器类。-集合是Java中提供的一种容器,可以用来存储多个数据,根据不同存储方式形成的体系结构,就叫做集合框架体系(掌握)。集合也时常被称为容器。 ......
  • Java日期加减
    以下操作都可以用于LocalDateTime,LocalDate,LocalTime等方法本次只用了LocalDateTime测试1、获取日历对象的年、月、日 输出结果如下: 2、减法 输出结果如下: 感谢大佬们的观看!!!......
  • JAVAOOP日历之Calendar日历类型的常见方法
    1、将字符串转化为date类型 2、为日历对象添加年、月、日在当前时间上加年、月、日3、获取日历对象的年、月、日 4、将日历对象转化为时间戳(两种方法) 5、两个时间类型的比较 感谢大佬的观看!!! ......
  • java基础的集合框架介绍
    集合概念什么是集合?集合:集合是一组用来存放数据对象的容器。特点:存放的数据是对象。对比数组:1、数组初始化后,其长度不可以再被改变,也就是说数组存放数据的个数是事先确定的。2、数组中对于插入元素和删除元素的操作是很繁琐的,因为涉及到了数组元素的移位操作。3、数组存放数据的......
  • 深入理解Async/Await:从原理到实践的JavaScript异步编程指南
    理解async/await的原理和使用方法是理解现代JavaScript异步编程的关键。这里我会提供一个详细的实例,涵盖原理、流程、使用方法以及一些注意事项。代码注释会尽量详尽,确保你理解每个步骤。实例:使用async/await进行异步操作<!DOCTYPEhtml><htmllang="en"><head><metacha......
  • Java 基础语法:语法、变量与运算
    第一章:Java入门第二章:基础语法、变量一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴......
  • Java之API详解之Biginteger类的详解
     6BigInteger类6.1引入平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648~2147483647。如果数字过大,我们可以使用long类型,但是如果long类型也表示不下怎么办呢?就需要用到BigInteger,可以理解为:大的整数。有多大呢?理论上最大到42亿的21亿次方基本上在内存撑......
  • java BigDecima
    packagenet.elaina.BigDecimaTest;importjava.math.BigDecimal;publicclassTest1{publicstaticvoidmain(String[]args){/*构造方法获取BigDecimal对象publicBigDecimal(doubleval)publicBigDecimal(Stringval)静态方法获......
  • 【Java】嵌入式版东方通Web容器中台后端项目静态资源访问
    嵌入式东方通Web版本:7.0.E.6_P3~ 7.0.E.6_P6首先直接说结论,内置化东方通Web容器的基准版本较低。对静态资源访问配置必须使用一下语法#静态资源访问配置spring:resources:static-locations:classpath:/resources/,classpath:/static/,file:/opt/app/FileRo......