JavaSE学习心得(APL与算法篇)
常用APL和常见算法
前言
常用APL
Math
System
Runtime
Object
编辑浅克隆
深克隆
Objects
Biginteger
构造方法
成员方法
底层存储方式
Bigdecimal
构造方法
Bigdecimal的使用
底层存储方式
编辑正则表达式
两个判断练习
两个爬取练习
贪婪爬取和非贪婪爬取
正则表达式在字符串方法中的使用
分组
编辑捕获分组
非捕获分组
Date时间类
SimpleDateFormat 类
Calendar概述
编辑 常用方法
Zoneld时区
Instant时间戳
ZoneDateTime带时区的时间
编辑 DateTimeFormatter用于时间的格式化和解析
LocalDate、LocalTime、LocalDateTime
LocalDate
LocalTime
LocalDateTime
Period
Duration
ChronoUnit
Integer
常见算法
基本查找
二分查找
分块查找
冒泡排序
选择排序
插入排序
编辑递归算法
快速排序
编辑编辑编辑Arrays
Lambda表达式
经典算法题
前言
接上期文章:JavaSE学习心得(面向对象篇)
教程链接:黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)_哔哩哔哩_bilibili
本期分享常用APL与算法部分
常用APL
Math
补充两个
System
运用:
Runtime
运用:
Object
Object作为顶级父类构造方法只有无参构造
自动重写equals方法,这样比较的就是对象的内容而非地址值,ptg插件重写toString同理
注意:
浅克隆
这种克隆方式使两个对象地址值会完全一样,遇到引用数据类型的成员变量如数组,一个对象修改了里面的内容的话,另一个对象会跟着变。
为了可以用对象调用clone方法这里重写成这样
深克隆
字符串这里不影响,因为修改时会产生新的字符串对象
Object中的clone方法为浅克隆,可以将第三方写的代码导入项目直接使用深克隆方法。
Objects
这个静态的equals方法防止了调用者为空的情况
Biginteger
构造方法
如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
如果BigInteger表示的超出long的范围,可以用构造方法获取。
成员方法
运用:
底层存储方式
这个数以经超出了long的范围
Bigdecimal
构造方法
1.如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
2.如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
3.如果我们传递的是0~10之间的整数,包含0,包含10,那么方法会返回已经创建好的对象,不会重新new
Bigdecimal的使用
运用:这里前三个用的bd2为2.0
UP:远离零方向舍入
DOWN:向零方向舍入
CEILING:向正无限大方向舍入
FLOOR:向负无限大方向舍入
底层存储方式
数组中每一位和字符串参数一一对应
正则表达式
方法为matches,两个\\相当于一个\
两个判断练习
any-rule这个插件有常用正则表达式,用法和ptg一样直接右键,得到的表达式根据需求进行微调。
两个爬取练习
把下面文本中的电话,邮箱,手机号,热线都爬取出来。
有条件的爬取
贪婪爬取和非贪婪爬取
正则表达式在字符串方法中的使用
运用:
分组
每组是有组号的,也就是序号。
规则1:从1开始,连续不间断。
规则2:以左括号为基准,最左边的是第一组,其次为第二组,以此类推。
运用:
捕获分组
后续还要继续使用本组的数据。
正则内部使用:\\组号
正则外部使用:$组号
非捕获分组
?:就相当于什么都没加,下面这个表达式就相当于[1-9]\\d{16}(\\d|X|x)
Date时间类
这里是long类型,传递参数要加L
SimpleDateFormat 类
运用:
Calendar概述
Calendar是一个抽象类,不能直接创建对象。
只能这样获取对象
常用方法
运用:
Zoneld时区
运用:
Instant时间戳
这些xx就是用来选秒/毫秒/纳秒的
运用:
ZoneDateTime带时区的时间
运用:
DateTimeFormatter用于时间的格式化和解析
运用:
LocalDate、LocalTime、LocalDateTime
运用:
LocalDate
LocalTime
LocalDateTime
Period
用于计算两个“日期”间隔(年、月、日)
Duration
用于计算两个“时间”间隔(秒,纳秒)
ChronoUnit
用于计算两个“日期”间隔
Integer
其他类型同理
常见算法
基本查找
二分查找
分块查找
这些方法都还需要自己写
冒泡排序
先把最大的移动到最右边
选择排序
先把最小的放到最左边
插入排序
直接看例子
递归算法
递归一定要有出口,否则就会出现内存溢出
快速排序
一定先移动end再移动start
Arrays
copyOf是从0索引开始,copyOfRange包左不包右
fill不是扩容数组,而是将数组元素全部替换成传入的这个参数
重点讲解最后一个方法:用到了内部类
Lambda表达式
Lambda表达式只能简化函数式接口的匿名内部类的写法
函数式接口:
有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@Functionalinterface注解
参数类型可以省略不写。
如果只有一个参数,参数类型可以省略,同时()也可以省略。
如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
按大小排序
通过字符串长度排序,短的在前,长的在后,这里o1、o2为String类型
经典算法题
定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序
要求1:属性有姓名、年龄、身高。
要求2:按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序。
有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生后第三个月起每个月都生一对兔子小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十二个月的兔子对数为多少?
找规律: 每个月对数等于上两个月之和
还有爬楼梯问题也是如此