一、集合:一些数据的容器
是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退出不可改集合 改了会出错