活动地址:CSDN21天学习挑战赛
目录
值(value)遍历(返回值是一个Collection集合)
常见数据结构
数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
常见的数据结构有:栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树
栈
栈特点
后进先出,先进后出
数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈
队列
队列特点
先进先出,后进后出
数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列
数组
数组的特点
数组是一种查询快,增删慢的模型
查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)
删除效率低:要将原始数据删除,同时后面每个数据前移。
添加效率极低:添加位置后的每个数据后移,再添加元素。
链表
链表是由一个个结点组成的,分为单向链表和双向链表。
链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和元素的地址。(双向头尾地址都有,单向只有尾的地址)
链表查询慢。无论查询哪个数据都要从头开始找。
链表增删相对快。
二叉树,二插查找树
只能有一个根节点,每个节点最多支持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可以重复
排序方式:自然排序