Skip to content

System ​

获取执行耗时 ​

java
long start = System.currentTimeMillis();
// ... 执行点什么
long end = System.currentTimeMillis();
// end - start 为中间程序耗时

拷贝数组 ​

java
System.arraycopy(源数组, 起始索引, 目的数组, 起始索引, 拷贝个数);

Runtime ​

java
Runtime r = new Runtime();
// 或者
Runtime.getRuntime();
java
public static Runtime getRuntime(); // 获取系统当前运行环境
public void exit(int status);  // 停止虚拟机
public int avalableProcessors(); // 获取 CPU 线程数
public long maxMemory(); // 虚拟机能从系统中获取的总内存大小
public long totalMemory(); // 已经从系统中获取的总内存大小
public long freeMemory(); // 虚拟机剩余内存大小(byte)
public Process exec(String command); // 运行 cmd 命令

Object ​

Java 中的顶级父类,所有的类都直接或间接继承于 Object,其中的方法能被所有的子类访问

常用的几个方法:

java
public String toString();
public boolean equals(Object obj); // 比较两个对象是否相等
public Object clone(int a); // 浅拷贝(克隆),对象克隆时需要实现 Cloneable 接口,并且需要重写 Clone 方法,然后调用 super.clone(),如果需要深拷贝则需要自己实现或用第三方包

克隆分为浅拷贝和深拷贝 浅拷贝:基础数据类型拷贝值,引用数据类型拷贝地址 深拷贝:基础数据类型拷贝值,引用数据类型会重新创建对象并拷贝其中的值

BigInteger ​

大整数

java
public BigInteger(int num, Random rnd); // 获取随机大整数 [0~2的num次方-1]
public BigInteger(String val); // 获取指定大整数
public BigInteger(String val, int radix); // 获取指定进制大整数
  • 如果 BigInteger 表示的数字没有超出 long(2^64) 的范围,可以用静态方法 valueOf 获取
  • 如果 BigInteger 表示超出了 long 的范围,可以用构造方法获取
  • 对象一旦创建,BigInteger 内部记录的值不能发生改变
  • 只要进行计算都会产生一个新的 BigInteger 对象

其还有一些方法,用来进行加减乘除等操作,add、subtract、multiply、divide、divideAndRemainder、equals、pow、max/min 等

底层以数组来进行存储,数组的最大长度是 int 的最大值,数组中每一位能表示的的数字是 -2147483648 ~ 2147483647。数组第 1 位是 1 或-1,表示正负值

BigDecimal ​

大小数

| 类型 | 占用字节 | 总 bit 位 | 小数部分 bit 位 | | float| 4 | 32 | 23| | double | 8 | 64 | 52 |

如果小数部分再长就需要用这个 BigDecimal 了,在一些场景比如金融等精确计算场景就需要用这个 API 了

底层以数组进行存储,会先将值分割成单个字符串,每个字符串再转成 ASCⅡ 码放到数组里来进行存储

常见操作加减乘除,除的时候可以设置舍入模式,常见的就是四舍五入

正则 ​

下面的这些正则内容,放到别的语言也适用~

String.matches(String regex)

java
[abc] 只能是a,b,c
[^abc] 除了abc以外的任意字符
[a-zA-Z] a到z和A到Z
[a-d[m-p]] a到d或m到p
[a-z&&[def]] d、e或f(交集)
[a-z&&[^bc]] a到z,除了b和c
[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]

数量词:
? 一次或0次
* 零次或多次
+ 一次或多次
{n} 正好 n 次
{n,} 至少 n 次
{n,m} 至少n次但不超过m次

Pattern:表示正则表达式 Matcher:文本匹配器,按照正则表达式的规则去读取字符串,从头开始读,在大串中去找符合匹配规则的子串

java
String str = "Java是95年问世的,Java8很好用";

// 获取正则表达式对象,匹配所有 Java 及 Java后带两位数字的字符串
Pattern p = Pattern.complie("Java\\d{0,2}");
// 获取文本匹配器对象
Matcher m = p.matcher(str);
// 如果没有就返回false,有返回true,在底层记录子串的起始索引和结束索引+1
// boolean b = m.find();
// 把截取的小串返回
// String s1 = m.group()

// 如果多次调用find,会继续往后读取内容。返回 Java、Java8
while(m.find()) {
    String s = m.group();
}

有条件爬取 ​

Java自从问世以来,企业中用的最多的就是 Java8、Java11,因为这两个都是长期支持版本,下一个长期支持版本是 Java17

1.不显示 Java 版本号

java
// 前面的 ?i 表示忽略大小写
// 后面的?理解为前面的数据Java
// =表示在Java后面要跟随的数据,在获取的时候只获取前半部分
String regex = "((?i)Java)(?=8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group()); // 打印4次Java
}

2.获取带版本号

java
String regex = "((?i)Java)(?:8|11|17)";

3.匹配不带版本号 8|11|17 的 Java 字符串

!是去除的意思

java
String regex = "((?i)Java)(?!8|11|17)";

贪婪/非贪婪爬取 ​

只写 + 或 * 表示贪婪匹配

+? 或 *? 表示非贪婪匹配

abbbbbbbbbbaaaaaaaaaa

1.按照 ab+的方式爬取 ab,b 尽可能多获取

java
ab+ // 打印abbbbbbbbbb

2.按照 ab+的方式爬取 ab,b 尽可能少获取

java
ab+?  // 打印 ab

捕获分组 ​

后续还要继续使用本组的数据,正则内部使用 \\组号 的形式,正则外部要匹配的话就用$组号(比如 replace 方法)

每一组都是由左括号为基准进行排序,最左边的左括号第一组,第二个左括号为第二组,以此类推

1.判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符

java
// a123a true;
// a123b false;
// (.)表示一个分组,.+表示中间是任意字符,\\1表示复用第一个分组
String regex = "(.).+\\1";

2.判断一个字符串的开始部分和结束部分是否一致

java
// abc123abc true
// abc123bcd false
String regex = "(.+).+\\1";

3.判断一个字符串的开始部分和结束部分是否一致?开始部分内的每个字符也需要一致

java
// (.) 把首字符看作一组, \\2把首字符拿出来再次使用,*作用于\\2 表示重复内容出现0或多次
String regex = "((.)\\2*).+\\1";

4.把重复的内容替换为单个

java
// 我要学学学编编编编编编程程程程程程程
// (.) 把重复内容的第一个字符看作一组
// \\1表示第一个字符再次出现
// + 至少一次
// $1 表示把正则中第一组内容再拿出来用
String regex = str.replaceAll((.)\\1+, "$1")

非捕获分组 ​

仅仅只是把数据括起来,分组后不再需要本组数据,不占用组号

符号含义
(?: 正则)获取所有
(?= 正则)获取前面部分
(?! 正则)获取不是指定内容的前面部分

JDK7 时间相关类 ​

Date 时间 ​

一个 Javabean 类,精确到毫秒

SimpleDateFormat 格式化 ​

可以把时间格式化成喜欢的模式,还可以解析时间,类似于 dayjs

Calendar 日历 ​

可以修改时间,比如加一个月减一个月的操作,传统方法也能做,但是这个对象更方便

JDK8 时间相关类 ​

Date 时间 ​

ZoneId 时区

Instant 时间戳

ZonedDateTime 带时区的时间

时间格式化 ​

DateTimeFormatter

日历类 ​

LocalDate 年月日

LocalTime 时分秒

LocalDateTime 年月日时分秒

工具类 ​

Duration 时间间隔 秒、纳秒

Period 时间间隔 年月日

ChronoUnit 时间间隔 所有单位

包装类 ​

基本数据类型对应的对象,JDK5 以后实现了自动装箱和自动拆箱。创建一个对象,把数据放到堆内存中,比如 Integer,其有一个成员变量 value

Lambda 表达式 ​

  • 简化匿名内部类书写
  • 有且只有一个抽象方法的接口叫函数式接口,接口上方可以加 @FunctionalInterface 注解

集合Collection ​

单列集合的祖宗接口,全部单列集合都可以进行继承使用

所有单列集合和数组都可以使用增强 for 循环遍历

java
Collection<String> cl = new ArrayList<>();
cl.add("1");
cl.add("2");

for(String s : cl) {
    // 此处不会修改原始集合中的值
    s = "111";
    System.out.println(s);
}

// 使用 lambda 表达式
cl.forEach(s -> System.out.println(s));