10.30,依旧是天气晴朗的一天,我掐指一算,是写博客的好时候,于是我立刻打开了我的电脑,开始更新博客
废话不多说。
本次学习标题不够啊
看图吧
首先我们先来重新学习一个算法:插入排序
直接附上代码(比较简单)
public class PaiXu {
public static void main(String[] args) {
int arr[]={21,45,32,11,25,71,36};
for (int i = 0; i < arr.length; i++) {
int j=i;
while (j>0&&arr[j]<arr[j-1]){
int t;
t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
j--;
}
}
System.out.println(Arrays.toString(arr));
}
}
逻辑也很好理解,即将新加入的元素与前元素进行对比,最后形成新的序列。
好了开始我们今天的正题
一、正则表达式
正则表达式——见名知意
正确规则表达式 即设置一个规范 用于规则表达式
例子: String str="[1-9]" 意思为 规则第一个元素为1-9的其中一个
当然我们也可以规定多个 格式为 String str="[1-9]{4-14}" 意思为1-9中的元素 出现4到14次
接下来介绍一下正则的一些表示:
x 字符 x。举例:‘a’表示字符a
\ 反斜线字符。
\n 新行(换行)符 (’\u000A’)
\r 回车符 (’\u000D’)
————————————————————————————
[abc] a、b 或 c(简单类) 要匹配的字符是这里面的任意一个 返回true 只能是一个 2-3返回false
加-为 到的意思 (范围) 包含两边
【^abc】任何字符,除了 a、b 或 c (只能判断一个)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
————————————————————————————
X? X出现一次或一次也没有 比如""空串 就是没有
X* X出现零次或多次 大于等于1次 都算多次
X+ X出现一次或多次
X{n} X出现恰好 n 次
X{n,} X出现至少 n 次
X{n,m} X出现至少 n 次,但是不超过 m 次 X>=n&&X<=m、
)————————————————————————————
我们图示进行更好的理解
正则表达式在以后的学习中会经常遇到
也是一个很方便的工具 经常用于循环中来当做判别条件
在这里我们用思维导图介绍几个正则的方法
在上上张图片中我们已经体现了matches功能 判断一个字符串是否与改正则匹配返回布尔类型
是一个很方法的方法
接下来我们用图解释一下分割和替代
通过上图 正则的split功能 是将一个字符串按照正则进行分割成字符数组;
而replaceAll功能是将字符串按照正则将指定元素进行替代
二、Pattern和Matcher
Pattern 我们称之为 模式器
Matcher 我们称之为 匹配器
两个类相辅相成 互相结合使用
还是跟以前一样 用图说话 简单快捷
在使用这两个常用类时,我们需要注意
1两个类相辅相成 配合使用 效果更佳
2find可以理解为指针 group可以理解为截取
当find找到 3个字母时 group进行截取 find 后移 跳到下一处
3导入正则时,使用pattern静态方法 .compile
三、常用类Math
这个类是数学类 实在没什么好说的 大部分都是静态方法 也很简单 基本都是和数字打交道的
用思维导图解释起来也很方便,就不用 图示距离了
这个类主要就是记一些方法名
类似 ceil向上取整
四、Random类
这个类也非常简单 随机类
主要用于产生随机数字
注:有种子时产生的随机数顺序是一致的
五、System类
系统类,Emmmmmm依旧是记方法
在IDEA里输出的快捷键 是sout 现在还有了 serr (错误输出)PS.红色还挺漂亮
六、BigDecimal类
这个类的一大特点就是高精度,我想和经融打交道的程序员会经常使用这个类
依旧是介绍方法
这回连要注意 的事情都在图中显示了
七、Date类SimpleDateFormat类
这两个类我们合起来讲 并且做个案例 演示一下
接下来我们用图演示一下 如何计算 某一天到现在的时间差
在上图中我们需要注意的是
规则的定义
*
- y 年
- M 月
- d 天
- H 时
- m 分
- s 秒
1、SimpleDateFormat后跟的是时间格式且和输入格式相对应 这样才可以解析时间
在使用gettime 从相应格式转换成 long类型的毫秒
用Date里gettime得到今天的毫秒值 进行计算
2别忘了 毫秒的进制 1s=1000ms
3在最后天,年,月,之间的转换可以由自己决定
八、Calendar类
这个类名为日历类
用法其实和date差不多
我们通过思维导图来看看他的用法
这个类是个抽象类
所以不能直接创建他的对象可以通过他的一个静态成员方法getInstance()来获取他的对象
它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR
等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
该类的可以自行设置时间 很方便
九、Collection类
首先我们为什么要有Collection类(容器,集合)?
数组长度固定 不易修改
数组和集合的区别
(1): 长度区别:
数组的长度是固定的而集合的长度是可变的
(2): 存储数据类型的区别:
数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
(3): 内容区别:
数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
Collection下有两个接口注意是接口 为List和Set 我们几天今天主要学习List
List下还有3个子类
ArrayList
linkedlist
vector
他们都是集合的含义
接下来我们用思维导图看看collection中的方法
接下来我用图示通过上述方法来遍历集合
在这张图片我们需要注意的是
1<>里的东西为泛型 我们 过会讲 将来很多地方都要用到泛型(很好用)
2上图用的是toArray方法将obj转换成object数组(数组无法强转 元素可以)
3利用增强for循环进行遍历集合的操作
我来介绍一下增强for循环的格式
for( (类型 int long object )(名字 随便取):(遍历的聚合) ){
}
增强的for循环系统会自动计算他的长度
十、迭代器
迭代器也是一种遍历集合的方式
它的定义就是讲集合迭代 遍历集合
不过之后就不怎么用了
十一、List接口
接下来是Collection中的一个抽象接口List
List中重写了一些父类中方法 有一些特有的方法
在List当中也可以通过size与for和get的结合进行遍历
十二、ListIterator
这个为列表迭代器
ListIterator的特有功能
boolean hasPrevious(): 是否存在前一个元素
E previous():
列表迭代器的特殊功能就是可以反向遍历,但是有个条件,就是必须先正向遍历后才可以进行反向遍历
ConcurrentModificationException出现
迭代器无法修改元素
我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合 会出现并发修改异常
原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了
C:解决方案 我们用ListIterator迭代器遍历 用迭代器自带的add方法添加元素 那就不会报错了
a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
b:集合遍历元素,集合修改元素
解决方案2 使用for循环遍历集合 添加元素 不会报错俗称甩锅
我们进行一个总结:
List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
B:List有三个儿子,我们到底使用谁呢?
得看 要安全还是要效率
是查找多还是增删多
十三、ArrayList类LinkedList类Vector类
在介绍完LIst接口和Collection类之后我们现在学习一下List接口下的3个子类
ArrayList
LinkedList
Vector
关于ArrayList并没有特别的新东西所以我们跳过ArrayList
直接看后两个
相比List和Collection而言,新增的方法基本都是针对首尾的,比较 简单 图示就略了
注意ArratList重写了equals方法
我们通过用equals去除元素的方法来体会一下
对于该三者的选择要视情况
十四、泛型
这部分内容为这次学习的重点
在以后用的也非常多
泛型是什么?
通用类型可以理解为任意类型
为什么要有泛型?
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。
关于泛型我们可以定义在方法 参数 类,接口上。
我们先来看一下 当泛型类
泛型的使用我会图示
接下来我都会尽量图示
定义格式: public class 类名<泛型类型1,…>
我们先来看看定义一个泛型类
一般来说 Y,X,V 等大写字母都是用来定义泛型
接下来我们使用一下泛型类
在 创建对象时 将泛型定义成具体类型,在使用已定义好的具体类型,这就是泛型的使用
————————————————————————————————————————————
泛型方法
首先我们定义一个泛型方法
紧接着是泛型方法的使用
————————————————————————————————————————
泛型接口
定义一个泛型接口
public interface FanXing03 <T> {
public void show(T t);
}
继承他
public class FanXing3<T> implements FanXing03<T>{
@Override
public void show(T t) {
System.out.println(t);
}
}
注意 :这里要两个T 才能定义完泛型接口
public class Test03 {
public static void main(String[] args) {
FanXing03<String> fanXing3 = new <String>FanXing3();
fanXing3.show("100");
}
}
这样我们就完成了一个简单的泛型接口初始化到使用的过程
接下来我们再来了解一下泛型的高级通配符
泛型通配符<?>: 任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E: 向下限定,E及其子类
? super E: 向上限定,E及其父类
我们具体来实现一下 以上方法
class Animal
class cat extends Animal
class dog extends Animal
ublic class Test {
public static void main(String[] args) {
Collection<? extends Animal> objects = new ArrayList<Cat>();
Collection<? super Cat>objects1=new ArrayList<Animal>();
}
}
十五、可变参数
格式:修饰符 返回值类型 方法名(数据类型… 变量名){}
还是上代码吧 …
public class Demo {
public static void main(String[] args) {
show(10,20,30,40,50);
}
private static void show(int a,int...b) {
int sum=a;
for(int x:b){
sum+=x;
}
System.out.println(sum);
}
}
运行结果150。
十六、ArrayList的嵌套
public class Test {
public static void main(String[] args) {
ArrayList<Student> obj = new ArrayList<Student>();
obj.add(new Student("张3",18));
obj.add(new Student("张4",19));
obj.add(new Student("张5",20));
obj.add(new Student("张6",21));
ArrayList<Teacher> obj1 = new ArrayList<Teacher>();
obj1.add(new Teacher("李1",30));
obj1.add(new Teacher("李2",31));
obj1.add(new Teacher("李3",32));
obj1.add(new Teacher("李4",33));
ArrayList<ArrayList> objects = new ArrayList<ArrayList>();
objects.add(obj);
objects.add(obj1);
for (int i = 0; i < objects.size(); i++) {
for (int i1 = 0; i1 < obj.size(); i1++) {
System.out.println(obj.get(i1));
}
for (int i1 = 0; i1 < obj1.size(); i1++) {
System.out.println(obj1.get(i1));
}
}
}
}
注意 :在遍历时一定要重写 tostring方法
总结:学习的内容越来越多了,每次写都感觉想写的东西非常多,但没办法一一列举这一写又是一天的空闲时间
哇 这是真的累 字数破万警告