集合——List、Set、Map


活动地址:CSDN21天学习挑战赛

目录

常见数据结构

队列

数组

链表

二叉树,二插查找树

平衡二叉树

红黑树

List集合

List的遍历

Set集合

Collection体系的特点、使用场景总结

Map集合

Map集合常用API

Map集合遍历的3种方式

entrySet遍历

键(key)遍历 (返回一个Set集合)

值(value)遍历(返回值是一个Collection集合)

Map集合的实现类


常见数据结构

数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率

常见的数据结构有:栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树

栈特点

后进先出,先进后出

数据进入栈模型的过程称为:压/进栈

数据离开栈模型的过程称为:弹/出栈

队列

队列特点

先进先出,后进后出

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

数组

数组的特点

数组是一种查询快,增删慢的模型

查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)

删除效率低:要将原始数据删除,同时后面每个数据前移。

添加效率极低:添加位置后的每个数据后移,再添加元素。

链表

链表是由一个个结点组成的,分为单向链表和双向链表。

链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和元素的地址。(双向头尾地址都有,单向只有尾的地址)

链表查询慢。无论查询哪个数据都要从头开始找。

链表增删相对快。

二叉树,二插查找树

只能有一个根节点,每个节点最多支持2个直接子节点。

节点的度: 节点拥有的子树的个数,二叉树的度不大于2 叶子节点 度为0的节点,也称之为终端结点。

高度:叶子结点的高度为1,叶子结点的父节点高度为2,以此类推,根节点的高度最高。

层:根节点在第一层,以此类推兄弟节

点 :拥有共同父节点的节点互称为兄弟节点

二叉查找树又称二叉排序树或者二叉搜索树。

特点:1,每一个节点上最多有两个子节点

2,左子树上所有节点的值都小于根节点的值

3,右子树上所有节点的值都大于根节点的值

目的:提高检索数据的性能。

规则: 小的存左边 大的存右边 一样的不存

平衡二叉树

平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。

要求:任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树

红黑树

红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。1972年出现,当时被称之为平衡二叉B树。1978年被修改为如今的"红黑树"。每一个节点可以是红或者黑;红黑树不是通过高度平衡的,它的平衡是通过“红黑规则”进行实现的。

红黑规则

每一个节点或是红色的,或者是黑色的,根节点必须是黑色。

如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)。

对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

每一个叶子节点指针nil时,颜色都为黑色

List集合

List系列集合特点 ArrayList、LinekdList、Vector(线程安全) :有序,可重复,有索引。

有序:存储和取出的元素顺序一致

有索引:可以通过索引操作元素

可重复:存储的元素可以重复

List不仅继承了Collection的功能,因为有索引,所以后很多自己独特的方法

方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

List的遍历

因为继承了Collection所以他可以使用Collection的遍历方式,因为拥有所以,所以也可以使用普通分for循环

List的常用子类

*ArrayList*

底层:数组

特点:查询快,增删慢,用于查询遍历数据,线程不安全,有索引

扩容方法:每次扩容数组长度是原来的1.5倍

*LinkedList*

底层:双向链表

特点:查询慢,增删块,线程不安全,无索引

由于是链表结构,插入新的数据时会在原来的末尾加上一个链子

*Vector*

底层:数组

特点:查询快,增删慢,线程安全,效率低,有索引

扩容方法:每次扩容是原来的俩倍

Set集合

Set系列集合特点

无序:存取顺序不一致

不重复:可以去除重复

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

Set集合实现类特点

HashSet : 无序、不重复、无索引。

LinkedHashSet:有序、不重复、无索引。

TreeSet:排序、不重复、无索引。

Set集合的功能上基本上与Collection的API一致。

*HashSet*

底层:jdk1.8前 哈希表(数组+链表);jdk1.8后 哈希表(数组+链表+红黑树)

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

扩容方法:每次扩容是原来的俩倍,触发线是每次扩容的0.75倍,当数组长度达到64以上,有链表长度达到8以上者向红黑树转型

*TreeSet*

底层:红黑树

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

排序方式:自然排序

Collection体系的特点、使用场景总结

如果希望元素可以重复,又有索引,索引查询要快

用ArrayList集合,基于数组的。(用的最多)

如果希望元素可以重复,又有索引,增删首尾操作快

用LinkedList集合,基于链表的。

如果希望线程安全,有索引

用Vector集合,基于数组

如果希望增删改查都快,但是元素不重复、无序、无索引

用HashSet集合,基于哈希表的。

如果希望增删改查都快,但是元素不重复、有序、无索引

用LinkedHashSet集合,基于哈希表和双链表。

如果要对对象进行排序

用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。

Map集合

Map集合概述和使用

Map集合是一种双列集合,每个元素包含两个数据。

Map集合的每个元素的格式:key=value(键值对元素)。

Map集合也被称为“键值对集合”

Map集合整体格式:

Collection集合的格式: [元素1,元素2,元素3..]

Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}

Map集合体系特点

Map集合的特点都是由键决定的。

Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。

Map集合后面重复的键对应的值会覆盖前面重复键的值。

Map集合的键值对都可以为null。

Map集合实现类特点

HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)

LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。

TreeMap:元素按照建是排序,不重复,无索引的,值不做要求。

Map集合常用API

Map集合 Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。

方法名称说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数

Map集合遍历的3种方式

entrySet遍历

键(key)遍历 (返回一个Set集合)

Map<String,Integer> map = new HashMap();
for(int i=0;i<10;i++){
    map.put(i+"",i);
}
​
Set<String>keys = map.keySet();
for(String key:keys){
    Integer value = map.get(key);
    System.out.println(key+"\t"+value);
}

值(value)遍历(返回值是一个Collection集合)

Map<String,Integer> map = new HashMap();
for(int i=0;i<10;i++){
    map.put(i+"",i);
}
​
Collection<Integer>values = map.values();//获取所有的值
Iterator<Integer> it = values.iterator();
while(it.hasNext()){
    Integer value = it.next();//获取迭代器中每一个值(value)
    System.out.println(value);
}

Map集合的实现类

*HashMap*

底层:jdk1.8前 哈希表(数组+链表);jdk1.8后 哈希表(数组+链表+红黑树)

特点:查询快,元素无序,key不可重复可以为空,value可以重复

扩容方法:每次扩容是原来的俩倍,触发线是每次扩容的0.75倍,当数组长度达到64以上,有链表长度达到8以上者向红黑树转型

*HashTable*

底层:哈希表

特点:查询快,元素无序,key不可重复不能为空,value可以重复,线程安全

*TreeMap*

底层:红黑树

特点:查询快,元素排列有序,key不可重复不能为空,value可以重复

排序方式:自然排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值