Java集合容器

前言

什么是集合

​ 集合是用来存储数据的容器。

​ 我们都知道数组也是用来存储数据的容器,但是数组初始化之后只能储存定长的数据,而我们在实际的开发中经常会遇到初始化时并不知道数据长度的情况(况且长度这个属性通常不是非常重要的属性,没有必要在创建它的时候就指定),于是出现了集合。集合长度可变,可储存不同类型的数据。

数组与集合区别

数组集合
长度不可变可变
内容基本数据类型,引用数据类型引用数据类型(装箱)
元素只能存放同一种数据类型可以存放不同种数据类型

前置课程:数据结构

数组、链表、红黑树

数组

​ 在一块连续的物理内存上,所以查询快。但是增删慢,因为如果改变长度通常需要重新分配内存,或者将定点插入的后面的元素全部移动位置。

链表

​ 不是在一块连续的内存上,通过本节点的下一个元素的地址(指针域)找到下一个元素。增删快,查询慢

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

红黑树

红黑树是平衡二叉查找树,保证了查找速度。

红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色或黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

(1) 节点是要么红色或要么是黑色。

(2) 根一定是黑色节点。

(3) 每个叶子结点都带有两个空的黑色结点(称之为NIL节点,它又被称为黑哨兵)。

(4) 每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。

(5) 从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。

这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数),所以红黑树是一个基本平衡的二叉搜索树,它没有AVL树那么绝对平衡,但是同样的关键字组成的红黑树相比AVL旋转操作要少,而且删除操作也比 AVL 树效率更高,实际应用效果也比 AVL 树更出众。当然红黑树的具体实现也复杂的多。
————————————————
原文链接:https://blog.csdn.net/hc372893308/article/details/97394857

概述:集合体系结构在这里插入图片描述

图像源连接

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

数据结构底层

ArrayList:数组

LinkedList:链表

Vector:数组

HashSet:哈希表(数组+单链表)(数组+单链表+红黑树)

LinkedHashSet:哈希表(数组+双链表)(数组+双链表+红黑树)

TreeSet:红黑树

HashMap:哈希表(数组+单链表)(数组+单链表+红黑树)

LinkedHashMap:哈希表(数组+双链表)(数组+双链表+红黑树)

Hashtable:哈希表

详解

Collection(单列集合)

Collection主要方法:

add、remove、clear、size、toArray、contains、isEmpty、iterator、addAll、removeAll

List

特点:可重,存取有序。

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

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

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

ArrayList

数据结构:数组。

特点:增删慢,查询快。

常用方法:

LinkedList

数据结构:双链表。

特点:增删快,查询慢。

Vector

数据结构:数组。

特点:增删慢,查询快。

线程安全,效率低

迭代器

为什么需要迭代器?

迭代:对过程的重复,称为迭代。迭代器是遍历Collection集合的常用方式

迭代器的常用方法

next():返回迭代的下一个元素

hasNext():如果仍有元素可以迭代,则返回true

注意:列表迭代器是List体系独有的遍历方式,可以在对集合遍历的同时进行添加、删除等操作

但是必须通过调用列表迭代器的方法来实现

区别:ArrayList和Vector
  1. 线程同步,Vector线程安全,ArrayList线程不安全,因为Vector的实现有synchronized
  2. 效率问题,Vector效率低,ArrayList效率高
  3. 增长数量,Vector以2倍增长,ArrayList以1.5倍增长

Set

特点:存取无序,不可重。查询快。

HashSet

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

LinkedHashSet

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

sortedSet
TreeSet

数据结构:红黑树

Map(双列集合)

特点:由键值对(key-value)构成,key不可重,value可重。查询快。

Map的主要方法有:

put、get、keySet、values、entrySet、clear、remove、isEmpty

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

HashMap

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

LinkedHashMap

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

HashTable(基本不用)

数据结构:哈希表

Properties

SortedMap

TreeMap

数据结构:红黑树

参考文章:https://blog.csdn.net/weixin_42559574/article/details/108203595?utm_source=app&app_version=4.5.5

https://blog.csdn.net/m0_46308149/article/details/110562979?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161689569216780262555574%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161689569216780262555574&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-3-110562979.pc_search_result_before_js&utm_term=%E9%9B%86%E5%90%88

扩展:为什么Set集合是无序和不重复的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值