一、算法
解决某个实际问题的过程和方法
1.排序算法
①冒泡排序
每次从数组中找出最大值放到数组的后面去
②选择排序
每轮选择当前位置,开始找后面的较小值与该位置交换
优化:就是每轮查找到最小的就记住那个索引,最后在交换一次
2.查找算法
前提条件:数组的数据必须是有序的
核心思想:每次排除一般的数据
二、正则表达式
1.认识正则表达式
就是由一些特定的字符组成,代表的是一个原则
作用一:用来校验数据是否合法-更简单便捷
作用二:在一段文本中查找满足要求的内容
2.书写规则
String提供了一个匹配正则表达式的方法:
public boolean matches(String regex),判断字符串是否匹配正则表达式,匹配返回true,不匹配返回false
regex:带[ ]只能匹配单个字符
注意:(?i)忽略大小写;要表示字符\,要输入\\,要表示.,要输入\\.
3.用于查找信息
固定代码:
4.用于搜索替换、分割内容
将重复的替换成一个:后面替换需要前面的内容
分割:
三、异常
程序出现的问题
1.认识异常
异常的体系:
Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来,说白了,Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它。
Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会Exception以及它的孩子来封装程序出现的问题。
--运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常〈如:数组索引越界异常)--认为你水平不会出现这种问题
--编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常)--受检查异常
对于编译时异常的处理方式
2.自定义异常
用异常对象来封装问题,可以让别人知道使用时是否正确
自定义运行时异常
throw关键字会将抛出异常对象给调用者
自定义编译时异常(用法与运行时差不多,但是会强烈要求修改)
throws 用在方法上,抛出方法内部的异常
3.处理异常
①常见处理方式
底层异常往外送,在最外层捕获异常,然后记录异常信息,显示合适信息给用户
代码上的处理:throws,try catch
一般直接抛Exception异常
②捕获异常,尝试修复
四、集合框架-Collection
1.认识集合
集合体系结构
对于Collection集合:
Collection集合特点:
List系类集合:添加的元素是有序的、可重复的、有索引的
Set系列集合:添加的元素是无序、不重复、无索引的
--HashSet:无序、不重复、无索引;
--LinkedHashSet:有序、不重复、无索引。
--TreeSet:按照大小默认升序排序、不重复、无索引。
2.collection包含的常见方法
--所有子孙都能使用的
加一个addAll:
3.Collecion的遍历方式
没有for遍历因为,Set没有索引
①迭代器
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
c为一个ArrayList类对象
②增强for循环
可以用来遍历集合或数组
若遍历集合,就是使用迭代器来遍历,集合.for 再回车就可以快捷
③Lambda表达式 -forEach
简化过程:
3.集合存储对象的原理
集合存储的是对象的地址
4.List集合
①特点、特有方法
特有方法:
②ArrayList集合的底层原理
存储、组织数据的方式不同
基于数组实现的,
数组的特点:
- 查询速度快:根据索引查询数据快,通过地址值和索引定位,查询任意数据耗时相同
- 删除效率低:可能需要把后面很多数据进行前移
- 添加效率低,可能需要把后面很多数据后移,再添加元素;或者也可能需要进行数组的扩容
应用场景:根据索引查询数据,比如根据随机索引取数据或者数据量不是很大时
不适合场景:数据量大的同时,又频繁的进行增删操作
③LinkedList集合的底层原理
基于双链表实现的
链表:
单向链表
链表中的结点是独立的对象,在内存中是不连续的,每个节点包含数据值和下一个结点的地址
链表的实现:
记住头结点可以知道后续所有数据
链表的特点:
- 查询慢,无论查询那个数据都要从头开始找
- 链表增删相对快
双向链表:
特点:查询比数组慢,比单向链表快,但是对首尾元素进行增删改查的速度是极快的。
LinkedList的特有方法:
LinkedList的应用场景:
可以用来设计队列:先进先出,后进后出,频繁操作首尾元素,序列要有序
可以用来设计栈:后进先出,先进后出,要操作首部元素
高级写法:
5.Set集合
无序,添加数据的顺序和获取出的数据顺序不一致;不重复;无索引
经典代码:
Set没有常用的特有功能,常用的就是Collection提供的
①HashSet集合
哈希值:
--就是一个int类型的数值,Java中每个对象都有一个哈希值
--Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。
HashSet集合的底层原理:
--基于哈希表实现的
--哈希表是一种增删改查数据,性能都比较好的数据结构
哈希表:
--JDK8之前,哈希表=数组+链表
--JDK8开始,哈希表=数组+链表+红黑树
加载因子是16*0.75,当占满12个后会扩容
当扩容长度达到当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树。
红黑树就是,根据新元素进来,根据哈希值比老元素大就往右走,小就往左走,找数据的时候就可以基于二分法查找。
二叉树
每个节点包含数据
红黑树,就是可以自平衡的二叉树
HashSet集合去重复的机制
是根据Hash值大小来判断是否一样,但是内容一致的不同对象的Hash值是不同的,所以不能去重复
--如果想要实现对内容一样的两个不同对象去重复:
重写那个对象的hashCode()和equals()方法:generate
②LinkedHashSet
添加元素的顺序,和集合内的顺序是一致的。
LinkedHashSet底层原理
依然是基于哈希表实现的
但是,每个元素都额外的多了一个双链表的机制记录它前后元素的位置
③TreeSet集合
可排序,默认升序排序
基于红黑树实现,在添加元素时,就会进行比较添加
注意:
自定义排序规则--Arrays中的sort方法
若对象中右自己的排序规则,TreeSet集合的参数构造器也有排序规则,优先采用TreeSet的
排序规则的数据有相同的会去除对象
5.总结,如何选择
6.集合的并发修改异常
使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。
有索引可以倒着遍历删除;或者从前往后遍历,但删除元素后做i--操作
无索引的不能使用集合所带的remove方法,使用迭代器的remove
增强for、Lambda表达式没办法解决并发问题
7.可变参数
认识:就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型...参数名称;
特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。
好处:常常用来灵活的接收数据。
注意:
- 可变参数在方法内部就是一个数组
- 一个形参列表中,只能有一个可变参数
- 可变参数必须放到形参列表的最后面
8.Collections类-工具类
Collection<? super T>:表示泛型集合,T是它的子类,T...elements,
只能支持List集合进行排序
五、集合框架-Map
1.认识Map
需要存储一一对应的数据时,就可以考虑使用Map集合来做
特点:由键决定,值只是一个附属品,但是不做要求的
很像Set集合
经典代码:
添加不是add而是put
2.Map常用方法
3.Map的遍历方式
①键找值
需要的方法
②键值对
所需方法:
就是将键值变成一个类对象,Entry,然后使用getKey,获得键,getValue获得值
③Lambda表达式
内部就是使用第二种方法
需要方法:
4.HashMap
HashMap跟HashSet的底层原理一摸一样,都是基于哈希表实现的
实际上:Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
3.LinkedHashMap
底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。
4.集合的嵌套
六、Stream
1.认识Stream流
也叫Stream流,是Jdk8开始新增的一套APl (java.util.stream.*),可以用于操作集合或者数组的数据。
优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
2.常用方法
①获取Stream流
②Stream流常见的中间方法
map方法可以对集合做操作,让其保留特定元素
concat:合并方法