第十一节 集合 链表 二叉树 哈希表

一、集合:一些数据的容器

是java对数据结构成熟的实现

二、链表与二叉树

1.链表优点:没有空间限制 插入和删除元素都很快

表现就是 类里面还有类

class  person {

String name ;

int  age;

person  date;

}

date{

name;

age

person date;

}

在这里插入图片描述

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

2.二叉树

存东西进行比较 小的往左存 大的往右存

优点:查找数据方便 类似于二分查找

先序遍历:根左右 中序遍历:左根右 后续遍历:左右根

3.栈:是限定仅在表尾进行插入和删除操作的线性表,又称先进后出的线性表

压栈:存元素 弹栈:取元素 没有元素叫空栈

4.队列:先进先出 ,只允许在表的一端进行插入,另一端进行删除元素的线性表,队尾rear 插入 队头front删除

头尾随时可以调转

!!!三、Collection接口 :是整个java类集中保存单值的最大操作父接口,里面每次操作只能保存一个对象的数据 定义在java.util包中

在这里插入图片描述

都是抽象接口

1.常用子接口 :List Set

2.List接口(重点) 里面所有内容允许重复

常用实现类: ArrayList() Vector() 这两个是基于动态数组的实现 会自己扩容

LinkedList()是链表的结构

线程安全不安全 :就是排队 不能同时去用

在这里插入图片描述

3.ArrayList() 使用的是数组结构 ,对于增删慢,查找快 不安全的

ArrayList<Integer> data = new ArrayList<>();

add 返回类型只能是true

构造方法:

ArrayList()默认初始容量为10 或通过 ArrayList(int 初始容量) 默认动态扩容是一次扩大原来的1.5倍

ArrayList(Collection<? extends E> c) 可以直接传一个集合进来把它变成ArrayList

在这里插入图片描述

4.Vector() :可增长对象数组 是同步的 安全的

和ArrayList 实现方法都一样 多了一些多扩容增量的调整 他是默认增加1倍

在这里插入图片描述

5.LinkedList() :使用的是双向链表结构 ,对于增加删除快,查找慢

用取出首个元素来实现栈的先进后出

在这里插入图片描述

直接实现栈

在这里插入图片描述

四、迭代器Iterator 或ListIterator 用于遍历集合 从集合中取数据

1.Iterator 用来迭代 Collection 下的所有集合

ListIterator 只能用来迭代 List下面的集合

2.使用: Iterator iterator = 集合.iterator();

在这里插入图片描述

3.iterator.remove() 删除 必须先找到再删除 不能直接用 要和指针配合

4.ListIterator 除了有iterator的操作外还有 添加 更改 和倒着走

添加 .add(元素) 添加完之后指针要先倒着移一位

更改 .set(元素) 指针指到哪就改哪个元素,要和.next();配合使用

倒着走 .previous();也必须指针先往下走 在倒着走 如果直接往上走没有元素要出错

五、forEach :增强for循环 用于迭代数组 或 集合(只能是Collection下的集合)

1.语法 : for(数据类型 变量名:集合或数组名){} 变量名就是遍历的数据 数据类型就是要遍历的数据类型

六、Set()

1.Set基本用法和Collecion一样 他是一种不包含重复元素的集合 包括null也只能放一个

2.没有办法直接通过方法获取数据,可以通过toArray()方法把它变成数组在获取数据 或者用迭代器迭代

3.HashSet 是set接口下常用的一个子类:散列存放 不能保证存储顺序的(哈希表在学习Map集合时讲解 他是双值存储)

在这里插入图片描述

4.TreeSet :采用有序二叉树进行存储

此类的迭代器是快速失败的 如果在创建迭代器之后的任何时间修改了集合,除了通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException异常

要想按顺序输出自己定义的类 需要实现接口Comparable<> 里面的compareTo 方法 输入自己的比较方法 返回的数据: 负数 this小/ 零一样大 /正数this大

存数据时发现一样大的不存

在这里插入图片描述

在这里插入图片描述

七、Map (Mapping 映射关系)集合存储的是一个个的 键值对 数据 (一次性可以存两个数据 一个是建数据 一个是值数据)

键(key)不可重复 每个键最多可以映射一个值

1.取出操作:先运用map中的keySet方法把键导出到一个Set集合 ,在通过一个个键利用map中的get方法导出值

2.存储方法:put(key, value) 存储一个键和一个值 有返回值 因为不能存相同的键 所以存相同键不同值就会用新值替换旧值 同时返回旧值

putALL(Map<? extends K, ?extends V> m) 存储一组键和一组值

3.删除方法:remove(键,值) 如果键值不匹配删不掉 remove( 键) 不管值是多少直接删 同时返回被删除的值

4.判断是否存在:containKey(key) :判断一个键在集合中是否存在 containKey(value) :判断值是否存在 返回值类型都是boolean

5.size():返回集合中键值对的数量

6.values():把值变成Collection单值存储的集合

八、HashMap 是基于哈希表的Map接口的实现 哈希表又叫散列表

1.hashCode() :返回对象的哈希码值 支持散列表 最终返回值是int 按照你的规则计算出来一个你觉得合适的值

哈希表存储原理 :对象数组+链表 数组拿到hashCode值和数组长度进行取余运算(%) 余数是几存在第几个哈希桶 数组默认长度是16 也就是数组下标时0-15 也就是有15个哈希桶 每个哈希桶都相当于一个链表 当哈希桶中存储的数据量大于8时 就会从链表变成红黑二叉树 当数量减少到6时,就会从红黑二叉树转换为链表 当数组(也就是哈希桶)的百分之75都存上了数据 那么数组就会自动扩容 变成原来的2倍 那么取余的时候 除数也就从16变成了32

散列因子:就是在扩容的时候把原表的数据拿出来重新存到扩容后的表里 这些数据叫散列因子

存储完数据以后不要擅自去改变键值不然容易发生错乱 ,找不到值

在这里插入图片描述

在这里插入图片描述

3.HashMap/Hashtable / ConcurrentHashMap /TreeMap /LinkedHashMap 这五个的方法是一样的

在这里插入图片描述

在这里插入图片描述

4.五种区别:多线程安全与否

HashMap:线程不安全 效率高 不排队进行 一起操作 存储随机

Hashtable: 线程安全 效率低 排队进行

ConcurrentHashMap: 线程安全 效率比较高 采用分段机制 如果同时使用一个哈希桶就排队 否则就不排队

TreeMap:存储随机 但是排序

LinkedHashMap: 存储随机 但是排序 而且同时存在双向链表中

在这里插入图片描述

5.JDK1.9退出不可改集合 改了会出错

在这里插入图片描述

在这里插入图片描述

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值