黑马程序员技术交流社区
标题: 【成都校区】2018.11.13 9:29 JAVAEE就业day03 [打印本页]
作者: blovedr 时间: 2018-11-15 10:33
标题: 【成都校区】2018.11.13 9:29 JAVAEE就业day03
本帖最后由 blovedr 于 2018-11-15 10:39 编辑
2018.11.13 9:29 day03
1.2 02 数据结构 栈
数据结构_栈 先进后出
入口和出口在同一侧
1.3 数据结构 队列
数据结构_队列 先进先出
入口和出口在集合的两侧
李推荐书: 《深入理解java虚拟机》 ---2018.11.13
推荐重点看:内存模型 算法 类加载器 高并发
1.4数据结构 数组
数据结构_数组
查询快 数组地址是连续的,通过数组首地址可以找到数组, 通过数组索引可以快速查找到某一个元素
增删慢 数组长度是固定的,要增/删数组一个元素, 必须创建一个新的数组,把数组元素复制过来
1.5数据结构 链表【参见视频】
1.6数据结构 红黑树
二叉树: 分支不能超过两个
排序树/查找树 猜数字小游戏:1-100之间的数字,从50开始猜,一下减一半
在二叉树的基础上, 元素是有大小顺序的
左子树小, 右子树大
平衡树: 左孩子和右孩子相等
不平衡树: 左孩子!= 右孩子
红黑树:
特点: 趋近于平衡树, 查询速度非常快, 查询叶子节点最大次数和最小次数不能超过2倍。
约束:
1. 节点可以是红色或者黑色的
2. 根节点是黑色的
3. 叶子节点(空节点)是黑色的
4. 每个红色节点的子节点都是黑色的
5. 任何一个节点到每一个叶子节点的所有路径上黑色节点数相同。
3.2 LinkedList集合(类)
java.util. LinkedList集合 implements List接口
LinkedList集合特点:
1. 底层是一个链表结构:查询慢, 增删快
2. 里面包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法, 不能使用多态
- publicvoid
addLast(
E e) 将指定元素添加到此列表的结尾。
-
- publicboolean isEmpty(): 如果列表不包含元素, 则返回true
3.1 Set集合(接口)
Java.util.Set接口 extendsCollection接口
Set接口特点:
1. 不允许存储重复的元素
2. 没有索引, 没有带索引的方法, 也不能使用普通的for循环遍历
Java.util.HashSet集合 implements Set 接口
HashSet特点;
1. 不允许存储重复的元素
2. 没有索引, 没有带索引的方法, 也不能使用普通的for循环遍历
3. 是一个无序的集合, 存储元素和取出元素的顺序有可能不一致
4. 底层是以哈希表结构(查询的速度非常的快)
哈希值:是一个十进制的整数,有系统随机给出(就是对象的地址值, 是一个逻辑地址, 是模拟出来得到地址, 不是数据实际存储的物理地址)
在Object类有一个方法, 可以获得对象的哈希值
Int hashCode() 返回该对象的哈希码值
hashCode方法源码:
public native inthashCode();
native:代表该方法调用的是本底操作系统的方法
String类(字符串类)的哈希值
String类重写Object了的HashCode方法
第五章 Collections类【参考视频】 2018.11.13 17:05
注意:
Sort(list<T>list)使用前提
重写排序的规则
return 0; // 认为元素都是相同的
Comparable接口的排序规则:
自己(this)- 参数:升序
比较此对象与指定对象的顺序
如果返回负数,代表this小于指定对象(传进来的对象)
如果返回0,代表this等于指定对象(传进来的对象)
如果返回正整数,代表this大于指定对象(传进来的对象)
默认是升序,如果把规则反过来, 则变成了降序
数据结构: (李)
栈:
特点:
1. 只能在一端进行元素的添加和删除
2. 先进后出(*)
队列:
特点:
1. 先进先出(*)
2. 入口和出口分别在两侧
数组:
特点:ArrayList底层是数组的实现
1. 增删慢(长度不可变)
2. 查询快(元素有对应的索引,是一片连续的内存空间)
链表:
特点:
1. 增删快(增删元素不会改变原有内容)
2. 查询慢(只能通过前一个元素找到下一个元素)
链表结构:
每个元素都是一个对象, 对象中包含的元素数据,指针
每个元素之间, 通过指针相连
单向链表:
特点:
1. 增删快
2. 查询慢
双向链表:
特点:
相比于单向链表: 查询稍微快一点
红黑树:
特点:
查询快
名词解释:
二叉树:分支不超过两个
查找树/排序树:是一个有序的二叉树(左子树小于节点, 右子树大于节点) 左中右, 则是从小到大排列
平衡树:左右子树高等差不超过1
红黑树:趋近于平衡树, 查询速度非常快
Java.util.List
概述:
是Collection下的一个子接口,在List接口下的集合有以下特点:
1. 有序(有序列)
2. 有索引
3. 允许重复
List中的特有功能(和索引相关的增删改查的功能)
void add(int index, E element): 指定索引位置添加元素 E remove(int index): 删除指定索引位置元素, 把被删除的元素返回 E set(int index, E element): 修改指定索引位置的元素为指定值,把被修改的元素返回 E get(int index):获取指定索引位置的元素
// 需求:
1. 添加五个英文字符串到集合中
2. 在第三个位置插入一个新字符串
3. 将索引为奇数的字符串转为大写
4. 分别使用迭代器和增强for循环遍历集合
ArrayList:底层实现的数组(查询快, 增删慢)
LinkedList:底层实现的列表(查询慢, 增删快)
特有功能:
针对于链表的首尾位置元素的操作:
可以模拟栈和队列
当对集合中元素增删操作比较多的时候, 推荐使用LinkedList
当对集合中元素查询操作比较多的时候,推荐使用ArrayList
Vector:
和ArrayList实现功能是一致的(底层也是数组的实现)
唯一区别:
ArrayList是不同步的*(效率高,安全性低)
Vector是同步的(效率低, 安全性高)
ArrayList把Vector取代了,唯一区别是Vector是同步的
Java.util.Set:
特点:
1. 无序(不保证存取的顺序)
2. 无索引
3. 不允许重复元素
数组:当知道元素索引, 查询很快。 但是如果不知道索引, 只能从头到尾去遍历
Hast表: 看到元素可以直接知道lisi 这个元素的位置。
HashSet:
底层是hash表的实现,查询的效率非常高
哈希值:
默认情况: 根据对象的物理地址算出来的整数, 一般我们调用hashCode可以获得Hash值
我们实现代码的时候: 我们可以重写hashCode方法去影响对象的hash值
当我们用HashSet存储自动以对象的时候, 如果想保证元素的唯一性,则需要重写hashCode和equals方法
/*
哈希表:
本质: 数组(存储了链表的数组), 数组中的元素是一个个链表
存储元素;
先将元素获取其hash值,再通过hash表的长度来确定元素的索引位置
种地 通话 9999(计算元素hash值) 4(确定元素索引位置)
元素的获取:
Heihei 根据之前的算法可以得知其位置在0索引, 拿到索引号, 直接就能获取heihei元素
当存储的元素过多, 如果容量没有发生变化, 则链表长度会越来越长, 导致查询的速度变慢,JDK8后, 则会将链表长度大于8的转化为红黑树, 让查询效率会更高。
HashSet存储原理:
通过hashCode方法确定索引位置
再通过equals方法去除重复元素
// 问题:没有办法去重复
// 解决方案: 重写hashCode方法,让hashCode放回值和地址值不相干, 跟属性相关
1. 首先通过元素hashCode方法获取哈希值, 计算出元素在哈希表中的位置
2. 如果对应位置已经有元素了, 通过equals比较元素的内容
则比较equals的返回值,
如果是true, 则认为元素重复不添加
如果是false, 则认为元素不重复, 则添加元素。
总结:
存储元素的操作:
1. 先获取对象的hash值去存储元素
1.1hash值不一样, 直接存储
1.2hash值一样
则比较equals的返回值,
如果是true,则认为元素重复不添加
如果是false,则认为元素不重复, 则添加元素。
当我们用HashSet存储自动以对象的时候, 如果想保证元素的唯一性, 则需要重写hashCode和equals方法
使用HashSet存储自定义对象, 其中有两个元素属性值一样, 先不重写hashCode和equals方法, 再重写之后再输出
*/
LinkedHashSet: 本质就是一个有序的HashSet: hast表+链表
Hash表用于存储
链表用于记录元素存储的顺序, 当我们获取元素的时候, 则会通过链表记录的顺序去获取元素
可变参数:
一种特殊的参数类型: 可以接收任意多个同种数据类型的数据:0个,1个,多个,
格式:
数据类型… 参数名
原理:
将传递的任意多个元素, 封装到一个数组中, 最好在传递给可变参数。
// 定义方法,求任意多个元素的和,并返回
Comparable接口的排序规则:
自己(this)- 参数:升序
比较此对象与指定对象的顺序
如果返回负数,代表this小于指定对象(传进来的对象)
如果返回0,代表this等于指定对象(传进来的对象)
如果返回正整数,代表this大于指定对象(传进来的对象)
默认是升序,如果把规则反过来, 则变成了降序
// 定义一个ArrayList集合, 存储四个自定义对象, 用Collections.sort进行排序,按照年龄排序
结论:
升序: this – o…
降序: o – this…
1. Comparator比较器对象
2. Comparable让对象所在的类去实现,实现后,则可以使用sort方法实现对元素的排序
在调用Collections.sort方法的时候, 除了传递被排序的集合, 还传递以比较器实现类对象
// 需求: 分别用两种方式实现对集合元素的排序
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |