目录
Math类
常用方法
pubilc static int abs(int a) | 获取参数绝对值 |
pubilc static double ceil(double a) | 向上取整 |
pubilc static double floor(double a) | 向下取整 |
pubilc static int round(float a) | 四舍五入 |
pubilc static int max(int a,int b) | 获取两个int值中的较大值 |
pubilc static double pow(double a,double b) | 返回a的b次幂的值 |
pubilc static double sqrt(double a) | 返回a的平方根 |
pubilc static double cbrt(double a) | 返回a的立方根 |
pubilc static double random() | 返回值为double的随机值,范围[0.0,1.0) |
System类
计算机中的时间原点
将C语言的生日1970年1月1日00:00:00作为时间远点,由于时差问题,我们国家计算机的时间原点记作1970年1月1日08:00:00。
常用方法
public static void exit(int status) | 终止当前运行的Java虚拟机 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式(从时间原点到现在) |
public static void arraycopy(数据源数组,起始索引,目的数组,起始索引,拷贝个数) | 数组拷贝 |
Runtime类
常用方法
public static Runtime getRuntime() | 当前系统的运行环境对象 |
public void exit(int status) | 停止虚拟机 |
public int availableProcessors() | 获得CPU的线程数 |
public long maxMemory() | JVM能从系统中获取总内存大小(单位byte) |
public long totalMemory() | JVM已经从系统中获取总内存大小 |
public long freeMemory() | JVM剩余内存大小 |
public Process exec(String command) | 运行cmd命令 |
关于getRuntime()
不能直接通过new来获取Runtime的对象,原因在于Runtime类表示当前虚拟机的运行环境,一个电脑仅有一个运行环境,创建多个对象是没有意义的,所以在Runtime类中创建了唯一一个对象,并通过getRuntime()方法返回。
关于exit()方法
状态码0表示正常停止,非0是异常停止。
System类中的exit()方法的源码实际上就是调用了Runtime类中的exit()方法。
关于exec()方法
要注意并不是所有的命令都可以执行的。
Object类
常用方法
public Object() | Object类只有空参构造 |
public String toString() | 返回对象的字符串表示形式 |
public boolean equals(Object obj) | 比较两个对象是否相等 |
public Object clone() | 对象克隆 |
关于toString()方法
toString()方法返回的形式是“包名.类名@对象地址”,如果想要按自己的想法输出对象的属性值等,则需要在子类中重写toString()方法。
关于equals()方法
equals()方法的源码使用“==”来进行比较的,“==”在引用数据类型中比较的是地址值,只有地址值相等,才会返回true,一般需要重写equals()方法,比较对象内部的属性值。
关于clone()方法
clone()方法会在底层创建一个对象,并把原对象中的数据拷贝过去。由于clone()方法是protected修饰,所以克隆的时候需要重写clone()方法。并且需要让javabean类实现Cloneable接口。
浅克隆
- 不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆
- 基本数据类型直接拷贝过来
- 字符串复用
- 引用数据类型需要再创建一个新的
Objects工具类
常用方法
public static boolean equals(Object a,Object b) | 先做非空判断,比较两个对象 |
public static boolean isNull(Object obj) | 判断对象是否为null,为null返回true |
public static boolean nonNull(Object obj) | 判断对象是否为null,不为null返回true |
关于equals()方法
Objects.equals(s1,s2)中方法的底层会判断s1是否为null,如果为null,则直接返回false,如果不为null,就利用s1再次调用equals方法,这个时候调用的是哪一个equals方法取决于s1的数据类型。
BigInteger类
构造方法
public BigInteger(int num,Random rnd) | 获取随机大整数,范围是[0~2的num次方-1] |
public BigInteger(String val) | 获取指定大整数,val必须为整数形式 |
public BigInteger(String val,int radix) | 获取指定进制的大整数,radix表示进制 |
public static BigInteger valueOf(long val) | 静态方法获取BigInteger的对象 |
关于valueOf()方法
- 表示范围较小,只能在long的取值范围之内
- 在内部对常用数字:-16~16进行了优化,提前把他们BigInteger的对象创建好,如果多次获取不会重新创建新的对象
小结
- 如果BigInteger表示的数字没有超出long的范围,可以用静态方法valueOf获取
- 如果BigInteger表示的数字超出long的范围,可以用构造方法获取
- 对象一旦创建,BigInteger内部记录的值不能发生改变
- 只要进行计算都会产生一个新的BigInteger对象
常用方法
public BigInteger add(BigInteger val) | 加法 |
public BigInteger subtract(BigInteger val) | 减法 |
public BigInteger multiply(BigInteger val) | 乘法 |
public BigInteger divide(BigInteger val) | 除法,获取商 |
public BigInteger[] divideAndRemainder(BigInteger val) | 除法,获取商和余数 |
pulic boolean equals(Object x) | 比较是否相同 |
public BigInteger pow(int exponent) | 次幂 |
public BigInteger max/min(BigInteger val) | 返回较大/小值 |
public int intValue(BigInteger val) | 转为int类型整数 |
BigDecimal类
构造方法
public BigDecimal(double val) | 通过传递double类型的小数来创建对象(不精确,不建议使用) |
public BigDecimal(String val) | 通过传递字符串表示的小数来创建对象 |
public static BigDecimal valueOf(double val) | 通过静态方法创建对象 |
小结
- 如果要表示的数字没有超出double的取值范围,建议使用静态方法
- 如果要表示的数字超出了double的取值范围,建议使用构造方法
- 如果传递的是0~10之间的整数,valueOf方法会返回已经创建好的对象,不会重新new
常用方法
public BigDecimal add(BigDecimal val) | 加法 |
public BigDecimal subtract(BigDecimal val) | 减法 |
public BigDecimal multiply(BigDecimal val) | 乘法 |
public BigDecimal divide(BigDecimal val) | 除法 |
public BigDecimal divide(BigDecimal val,精确几位,舍入模式) | 除法 |
正则表达式
作用
- 检验字符串是否满足规则
- 在一段文本当中查找满足要求的内容
规则
字符类(只匹配一个字符)
[abc] | 只能是a,b或c |
[^abc] | 除了a,b,c之外的任何字符 |
[a-zA-Z] | a到z,A到Z |
[a-d[m-p]] | a到d,或m到p |
[a-z&&[def]] | a到z和def的交集,实际上就是d,e,f |
[a-z&&[^bc]] | a到z和非bc的交集 |
[a-z&&[^m-p]] | a到z和除了m到p的交集 |
预定义字符(只匹配一个字符)
. | 任何字符 |
\d | 一个数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 一个空白字符:[\t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 英文、数字、下划线:[a-zA-Z_0-9] |
\W | 一个非单词字符:[^\w] |
注意
由于"\"表示转义字符,它的功能是改变后面字符原本的含义,所以在写正则表达式的时候,例如"\d",要写成"\\d",例如"\w",要写成"\\w"。
数量词
X? | 至多一次 |
X* | 零次或多次 |
X+ | 至少一次 |
X {n} | 正好n次 |
X {n, } | 至少n次 |
X {n,m} | 至少n次,不超过m次 |
爬虫
本地爬虫
- 首先熟悉两个类:Pattern类表示正则表达式,Matcher类表示一个文本匹配器,作用是按照正则表达式的规则去读取字符串,在大串中找到符合规则的子串
- 获取正则表达式的对象:Pattern不能直接创建对象,而是要通过compile静态方法来创建
Pattern p = Pattern.compile("正则表达式");
- 获取文本匹配器的对象:
Matcher m = p.matcher(str);//m要在str中寻找符合p规则的子串
- 用m调用find方法:拿着文本匹配器从头开始读取,寻找是否有满足规则的子串。如果没有,则返回false,如果有,返回true,在底层记录子串中的起始索引和结束索引+1
- 用m调用group方法:方法底层会根据find方法记录的索引进行字符串的截取,并将子串返回。在这里解释一下find方法记录“结束索引+1”而不是“结束索引”的原因:因为group方法底层进行截取时,实际上运用的subString(起始索引,结束索引)方法,而这个方法的特点是“包头不包尾”,所以就需要在记录的时候往后多记一位。
- 最后完善代码:由于文本中不一定只有一段符合规则的子串,所以要将代码写入循环
while(m.find()) { String s = m.group(); System.out.println(s); }
网络爬虫
-
创建一个url对象:
URL url = new URL("网址");
-
连接这个网址:
URLConnection conn = url.openConnection();
-
创建一个对象去读取网站中的数据:
BufferReader br = new BufferReader(new InputStreamReader(conn.getInputStream()));
-
最后按照本地爬虫的方式进行爬取
带条件爬取
在定义正则表达式的时候与前面稍有不同,其他的步骤都一样。
- “?=”:?是占位的意思,代表前面的数据,=表示后面跟随的数据,匹配后只输出?所代表的数据
- “?:”:意思同上,区别在于:是匹配后输出整体数据
- “?!”:!表示去除后面数据,只匹配没有后面数据的子串
贪婪爬取
贪婪爬取是指在爬取的时候尽可能多的获取数据。而非贪婪爬取则与之相反,是指在爬取的时候尽可能少的获取数据。Java中默认的就是贪婪爬取。
只写+或*表示贪婪爬取,在后面加上?则表示非贪婪爬取。
正则表达式在字符串方法中的使用
public String[] matches(String regex) | 判断字符串是否满足正则表达式的规则 |
public String replaceAll(String regex, String newStr) | 按照正则表达式的规则进行替换 |
public String[] split(String regex) | 按照正则表达式的规则切割字符串 |
分组
规则
分组就是一个小括号()。每组是有组号的,从1开始,连续不间断递增。以左括号为基准,最左边为第一组,以此类推,要注意的是,只看左括号,不看其他。
捕获分组
捕获分组就是把这一组的数据捕获出来,再用一次。书写代码的时候,如果是在正则表达式内部重复使用一组数据,则使用“\\组号”,如果是在外部使用,则使用“$组号”。
非捕获分组
非捕获分组是分组之后不再使用本组数据,仅仅是把数据括起来,即就是上面带条件爬取的形式。非捕获分组不占用组号。