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));

每天进步一丢丢