Math\System\Runtime\Object\BigInteger\BigDecima\正则表达式(爬虫、捕获)
主要记忆类名和作用
Math
String
时间原点:1970年1月1日 08:00:00
1秒=1000毫秒
1毫秒=1000微秒
1微秒=1000纳秒
Runtime(表示当前虚拟机的运行环境)
Runtime这个方法不是静态的,所以想要获取这个方法必须先创建它的对象。但是这个类的对象不能直接创建,而是通过一个getRuntime()的方法获得的
以下这些方法,都是通过Runtime的对象获得的
- public static Runtime getRuntime() 当前系统的运行环境对象
这样设计有一个好处就是,这个类每次返回的都是同一个类。因为运行环境只能有一个。创建多个对象是没有意义的 - public void exit(int static) 停止虚拟机;这与System中的一样,System中的底层实现,其实就是调用这个
- public int availableProcessors() 获取CPU的线程数;比如,单核八线程,返回值就是8
- public long maxMemory() JVM能从系统中获取总内存大小(单位:byte)
- public long totalMemory() JVM已经从系统中获取内存的大小(单位:byte)
- public long freeMemory() JVM剩余内存大小(单位:byte)
- public Process exec(String command) 运行cmd命令
Object
Object是java中的顶级父类。所有类都直接或间接地继承于Object类
没有带参构造,只有一个无参构造
Object中的成员方法,一共有11个,先学的三个
- public String toString() 返回对象的字符串表示形式
- public boolean equals() 比较两个对象是否相等
一定注意方法重写,方法重写过后,对象调用同名方法,进行的具体行为可能不同
当方法重写过后,如果是想要进行内容的比较,首先会比较对象类型一不一样;如果不一样,那么就算是相同的内容,对象类型不同,也会返回false;所以,可以看出,底层在判断的时候是有选择性的 - protected Object clone() 对象克隆
把对象A的属性值完全拷贝给B对象,也叫对象拷贝,对象复制
clone方法只能被本包中的类,以及本类的子类调用,所以如果需要调用clone这个方法,那么我们就必须要重写方法
首先:在目标类当中重写clone这个方法(原因是,Clone这个类使用protected修饰的),并实现Cloneable接口
其次:在重写方法中调用父类中的clone方法
而后:让本类实现一个接口Cloneable,这个接口没有任何的方法。当一个接口没有任何的方法,说明这个接口的作用,是一个标记性接口
浅克隆
基本数据类型在克隆以后,克隆的是数据值;而引用数据类型克隆的是地址值,所以,当我们克隆一个数组时,克隆的是相同的地址值,那么对数组的操作是同步的
深克隆
对于基本数据类型,与前者相同,对于引用数据类型,深克隆会重新创建一个对象,把原来对象中的数据全部都克隆到新对象中,他们的地址值不同,对克隆对象的操作不影响原对象
Object中的Clone是浅克隆;深克隆需要自己在目标类当中重写方法:1.创建新的引用数据类型的承载者;2.数据复制
克隆方式:
上面自己写的深克隆方法,在面对二维数组时,就还会是旧的数组地址。解决方法是利用第三方代码。
Objects
- public static boolean equals(Object a, Object b) 先做非空判断,比较两个对象
- public static boolean isNull(Object obj) 判断对象是否为null,为null返回ture,反之相反
- public static boolean nonNull(ObObject obj) 判断对象是否为null,与isNull结果相反
BigInteger
在java当中,整数有四个类型:byte、short、int、long
在底层占用字节个数:byte一个字节、short两个字节、int四个字节、long八个字节
以上的整数是有范围的,当我们需要表示超出范围的整数时,我们就用BigInteger来表示,BigInteger的上线非常大
BigInteger构造方法
- public BigInteger(int num, Random rnd) 获取随机大整数。范围:0~2的num次方减1;Random rnd表示传进去一个随机Random对象就行
- public BigInteger(String val) 获取指定的大整数
- public BigInteger(String val, int radix) 获取指定进制的大整数
- public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化
BigInteger成员方法
BigDecimal
程序在对一些数据进行计算时会出现计算精度丢失的现象,比如:
(1):0.09+0.01所得到的结果是0.0999999999999999999999
(2):0.216-0.1所得到的结果是0.1159999999999999999999
(3):0.226+0.01所得到的结果是0.00226000000000000000003
(4):0.09/0.1所得到的结果是0.8999999999999999999999
原因是:计算机当中的运算都是转化成为二进制进行计算,而后再转化为十进制进行展示
0.9的二进制表示有45位;0.226的二进制表示有55位;然而float能表示的最大位是23位,double能表示的最大位是52位,那么,在这种情况下,多出的位就会被去掉,进而造成了精度丢失
一些实际问题中的计算,是不允许精度丢失的,比如银行中面临的贷款、利息、飞机火箭零件精密度等等
BigDecimal的作用:
- 用于小数的精确计算
- 用来表示很大的小数
父类是Number,间接父类是Object
BigDecimal成员方法
舍入模式
CEILING 向正无限大方向舍入的舍入模式。
DOWN 向零方向舍入的舍入模式。
FLOOR 向负无限大方向舍入的舍入模式。
HALF_DOWN 向最接近教字方向舍入的舍入模式,如果与两个相等数字的距离相等,则向下舍入。
HALF_EVEH向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
HALF_UP 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。
HALF_EVEN 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。
HALF_UP 远离零方向舍入的舍入模式。
BigDecimal存储方式
以0.226为例,BigInteger是以每32位分成一组,当遇见二进制有几百几千位的数,那么这种存储效率非常的低;
BigDecimal底层实际上也是一个数组,将字符串中的字符逐个获取,通过ASCII码表获取对应数字表示并存放至数组
正则表达式
什么是正则表达式?
正则表达式可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性
eg.
需求:现在需要校验一个qq号码是否正确
规则:6~20位以内,0不能开头,必须全部是数字
由上可以看出,正则表达式的代码非常简洁
正则表达式的作用
校验字符串是否满足规则
- []:代表范围,[12kj],表示只能取1、2、k、j中的一个;而[^12kj],除了1、2、k、j字符,其他字符都可以取,只能取一个
[a-zA-Z] (这里包含了两部分):az以及AZ,其中的一个字符,包含边界
[a-z[A-Z]]:与上面意思相同
[a-z&&[def]]:a-z和def这三个字符的交集,结果其实就是:def
常用语法
在一段文本中查找满足要求的内容(爬虫)
爬虫实现
网络爬虫
带条件爬虫练习
贪婪爬取、非贪婪爬取
正则表达式进行替换,利用正则表达式切割字符串
分组:内捕获分组\
外捕获分组$
非捕获分组