1、前言

1.1由来

Java是面向对象的语言,我们在编程的时候自然需要存储对象的容器,数组可以满足这个需求,但是数组初始化时长度是固定的,但是我们往往需要一个长度可变化的容器,因此,集合出现了。

1.2集合与数组的区别

(1)长度区别:集合长度可变,数组长度不可变

(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素

(3)元素区别:集合只能存储引用类型元素,数组可存储引用类型,也可存储基本类型

1.3集合概述

Java集合框架图:

注:上图中粉红色的为接口,紫色的和蓝色框为实现类。

Java集合要从两大接口说起,一为Collection接口,二为Map接口,它们是同一个层次的。

Collection接口被List接口和Set接口继承;

List接口有三个实现类,ArrayList,LinkedList,Vector;

Set接口被HashSet类实现,被SortedSet接口继承,同时TreeSet类实现SortedSet接口,LinkedHashSet类继承HashSet类;

Map接口有两个实现类,HashMap,HashTable,同时Propertise类继承HashTable;

Map接口被SortedMap接口继承,同时TreeMap类实现了SortedMap接口;

2、详述

2.1Collection接口(单列集合)

Collection接口是单列集合的最顶层接口,定义了一些通用的方法。

add(E e)添加元素;  clear()清空元素;  remove(E e)移除元素;  size()元素数量;

toArray()集合转数组;  contains(E e)判断元素是否存在;  isEmpty()判断集合是否为空;

2.1.1List 接口

特点:有索引,精准操作元素;

元素有序,存储及取出时顺序一致;

元素可重复,通过.equals()比较是否重复。

它利用索引(index),定义了一些特殊方法:

get(int index,E e) 获取指定位置的元素;remove(int index)移除指定位置的元素;

add(int index,E e) 将元素添加到指定位置;set(int index,E e) 用元素替换指定位置的元素;

2.1.1.1ArrayList实现类

数据结构:数组;

特点:查询快,增删慢,主要用于查询遍历数据,为最常用集合之一;

底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快;数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。

2.1.1.2LinkedList实现类

数据结构:双向链表;

特点:查询慢,增删快;

底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增删快。

特有方法:getFirst()  返回开头元素;  getLast()  返回结尾元素;

pop() 从所在堆栈中获取一个元素;  push(E e)  将元素推入所在堆栈;

addFirst(E e)  添加元素到开头,头插; addLast(E e) 添加元素到结尾,尾插;

2.1.1.3Vector实现类(基本不用)

数据结构:数组;

特点:查询快,增删慢

底层分析:和ArrayList一样,都是数组实现,因此具有相似的特性,它们之间的区别在于Vector是线程安全的,效率低,ArrayList是线程不安全的,但效率高。

ps:Vector在JDK1.0就出现了,在JDK1.2集合出现的时候,Vector就归为List的实现类之一,这时候ArrayList才出现。Vector是一个古老的集合,《Java编程思想》中提到了它有一些遗留的缺点,因此不建议使用。

2.1.2Set接口

特点:元素不可重复;

元素无序,存储及取出时顺序不一致;

没有索引,因此不能使用普通For循环遍历;

Set与Collection 接口中的方法基本一致,没有进行功能上的扩充;

2.1.2.1HashSet实现类

数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素无序,元素不可重复,没有索引;

底层分析:哈希表底层用数组+单向链表实现,即使用链表处理冲突,同一Hash值的元素都存储在一个链表里,但是当位于一个链表中的元素较多,即Hash值相等的元素较多,通过key值依次查找的效率降低。JDK1.8之后,哈希表底层采用数据+单向链表+红黑树实现,当链表长度超过阈值(8)时,链表将转换为红黑树,极大缩短查询时间。

ps:哈希值是一个十进制的整数,是对象的地址值,是一个逻辑地址,不是实际存储的物理地址,由系统随机给出。Object类的int hashCode()方法,可以获取对象的哈希值。

2.1.2.2LinkedHashSet实现类

数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素有序,元素不可重复,没有索引;

底层分析:作为HashSet的子类,只是比它多了一条链表,这条链表用来记录元素顺序,因此LinkedHashSet其中的元素有序。

2.1.2.3TreeSet实现类

数据结构:红黑树

特点:查询快,元素有序,元素不可重复,没有索引;

底层分析:TreeSet实现了继承于Set接口的SortedSet接口 ,它支持两种排序方法,自然排序和定制排序,自然排序的意思就是放入元素“a”,“b”,a会自然地排在b前面,其中还有几个特有方法。

first() 返回第一个元素; last() 返回最后一个元素;comparator() 返回排序比较器;

2.2Map接口(双列集合)

特点:元素包含两个值(key,value)即键值对, key不允许重复,value可以重复, key与value是一一对应的。元素无序;

Map接口是双列集合的最顶层接口,定义了一些通用的方法。

put(key , value) 添加元素; remove(key) 删除key对应元素;

containsKey(key) 判断是否存在key对应元素;get(key) 获取key对应元素;

KeySet() 获取所有的key,存到Set集合中;entrySet() 获取所有的元素,存到Set集合中;

ps:Map集合必须保证保证key唯一,作为key,必须重写hashCode方法和equals方法,以保证key唯一。

2.2.1HashMap实现类

数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素无序,key不允许重复但可以为null,value可以重复。

底层分析:和HashSet底层相类似,不赘述。

2.2.2LinkedHashMap实现类

数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。

特点:查询快,元素有序,key不允许重复但可以为null,value可以重复。

底层分析:和LinkedHashSet底层相类似,不赘述。

2.2.3HashTable实现类(基本不用)

数据结构:哈希表

特点:查询快,元素无序,key不允许重复并且不可以为null,value可以重复。

底层分析:HashTable和Vector一样是古老的集合,有遗留缺陷,在JDK1.2之后 被更先进的集合取代了;HashTable是线程安全的,速度慢,HashMap是线程不安全的,速度快;

ps:Hashtable的子类Properties现在依然活跃,Properties集合是一个唯一和IO流结合的集合。

2.2.3TreeMap实现类

数据结构:红黑树

特点:查询快,元素有序,key不允许重复并且不可以为null,value可以重复。

底层分析:和TreeSet底层相类似,不赘述。

Java集合总结,详细且易懂相关推荐

  1. Java集合知识点详细概括加代码解释

    集合Collection (List And Set) 1.在实际开发中,需要将使用的对象存储于特定的数据结构容器中.JDK提供了这样的容器-集合(Collection). 2.Collection ...

  2. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

    转载自  Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...

  3. Java——集合(超详细超级全)

    集合 Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组. 在这里主要讲一些我们平常很常用的一些接口和一些实现类. Java 集合可分为 Collection 和 Ma ...

  4. Java集合框架体系结构图(详细一体图)

    java集合体系结构图 比较详细.呕心沥血画出.请收好

  5. Java集合详解(非常详细!!!)

    前言 数据结构作为每一个开发者不可回避的问题,而 Java 对于不同的数据结构提供了非常成熟的实现,这一个又一个实现既是面试中的难点,也是工作中必不可少的工具,在此,笔者经历漫长的剖析,将其抽丝剥茧的 ...

  6. java 头尾 队列_超详细的java集合讲解

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

  7. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

    Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...

  8. java集合框架类_Java集合框架总结—超详细-适合面试

    Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List. Map实现类用于保存具有映射关系的数据(key-value). 2.Set.Lis ...

  9. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

最新文章

  1. 为了给女朋友买件心怡内衣,我用Python爬虫了天猫内衣售卖数据
  2. redis在PHP中的基本使用
  3. (004)RN开发VSCode调试ReactNative项目
  4. 理解Promise (3)
  5. [python进阶]12.继承的优缺点
  6. DataGridView很详细的用法
  7. 程序开发基础学习四(boost::signal2 函数学习)
  8. 转html图片 xwpf_Word、Pdf、Excel、PPT、html等文件互转工具
  9. 2018 n1ctf easy_hard_php 攻击流程图
  10. 【漏洞复现】PHPmyadmin 4.8.1后台Getshell新姿势
  11. 2015年7月之 装订空白
  12. 「Windows Bug」Window 系统下双网卡内外网冲突
  13. 前端页面缓存系列之localStorage
  14. 国外常见16款著名的实时网站统计系统
  15. 计算机制作画报说课稿,幼儿园小班主题秋的画报说课稿教案反思
  16. matlab二元不等式,大神们,求个解多元一次不等式的代码,要所有整数解
  17. 个人介绍静态网页【附源码】初学者的期中作业
  18. 紫外线检测仪,WKM-UV1,紫外线检测仪UV汞灯LEDUV通用
  19. Proxy SwitchyOmega
  20. 如何快速上手Mac电脑?mac新手教程 Mac电脑新手必看

热门文章

  1. 程序员干货:从写简历,到面试、谈薪酬的那些技巧和防坑指南!
  2. python编程的50种基础算法_Python算法新手入门大全
  3. c语言与java类型转换_C语言与JAVA理论区别
  4. 软件驱动创新,戴尔科技打造现代化存储体验
  5. myeclipse tomcat java.lang.OutOfMemoryError: PermGen space
  6. python中nonlocal是什么意思_Python中nonlocal关键字
  7. 作品集七(字体设计共18件)
  8. Camera开发—如何使用系统相机
  9. 智能客服机器人系统的优势及提供哪些服务?
  10. 【愚公系列】2023年06月 攻防世界-Web(i-got-id-200)