b1cat`s

Java核心类

Word count: 1.8kReading time: 7 min
2020/02/13

Java核心类

本节我们将学习Java的基本核心类,包括:

1
2
3
4
5
6
7
8
字符串
StringBuilder
StringJoiner
包装类型
JavaBean
枚举
BigInteger、BigDecimal
常用工具类

字符串和编码

String是一个引用类型,本身是一个class,由于Java编译器对String有特殊处理,既可以直接用“…”表示一个字符串。

实际上字符串在String内部是通过一个char[]数组表示的,即
String s = new String(new char[]{'h', 'e','l',';','o'});

  • 字符串比较

    • 使用equals() 而非==,因为==表示引用相等
    • 忽略大小写比较equalsIgnoreCase()
  • 字符串搜索、提取子串

    • "Hello".contains("ll"); //true ll类型为CharSequence String父类
    • "hello".indexof("l"); //2
    • "hello".lastIndexOf("l"); //3
    • "hello".endsWith("lo"); //true
    • 提取字符串public String substring(int beginIndex, int endIndex)
      • "hello".substring(2); //"llo"
      • "hello".substring(2,4); //"ll"
  • 去除首尾空字符串" \tHello\r\n".trim(); //"hello"

    • 并未改变字符串,只是返回一个新字符
    • strip() 还可以移除类似\u3000中文空格字符
  • 替换字符串

    • "Hello".replace('l', 'w'); //"Hewwo"
    • 正则替换 "A,,B;C ,D".replaceAll("[\\,\\,\\s]+",","); //"A,B,C,D"
  • 分割字符串 String[] ss = "A,B,C,D".split("\\,");

  • 拼接字符串 String.join()

    • String[] arr = {"A", "B", "C"}; String s = String.join("***", arrr)
  • 类型转化,可以把任意类型或引用类型转为字符串

    • String.valueOf(123); String.valueOf(new Object());
    • 字符串要转化为其他类型
      • int n1 = Integer.parseInt("123");
      • boolean b1 = Boolean.ParseBoolean("true");
      • Integer.getInteger(String) 将 String对应的系统变量转为Integer
        • Integer.getInteger("java.version"); //返回java版本号 8本人测试未成功
    • 转为char char[] cs = "Hello".toCharArray();
    • 较新JDK的String存储的以byte[]
  • 编码

    • UTF-8依靠最高位字节确定一个字符究竟占几个字节
    • 按GBK编码 bytep[] b1 = "hello".getBytes("GBK");
    • byte转String String s1 = new String(b, "GBK")

StringBuilder、StringJoiner

  • 在对String操作,比如添加一段内容,都是在新建一个String,大量新建会造成浪费。因此Java标准库提供StringBuilder可变对象,预先分配缓冲区,在StringBuilder中新增字符时,不会创建新的临时对象:
1
2
3
4
5
6
7
StringBuilder sb = new StringBuilder(1024);
for (int i=0; i<1000; i++){
sb.append(',');
sb.append(i);
}

String s = sb.toSting();
- 由于`String.Builder()`返回的是`this object`,可以使用链式`sb.append(',').append('i');`
- 对于普通字符串`+`操作,Java编译器在编译时自动把多个连续的`+`操作编码为`StringConcatFactory`操作。运行时`StringConcatFactory`会自动转为数组复制或`StringBuilder`操作
  • 使用StringJoiner(join, prefix, suffix)添加字符
  • 本质上内部使用StringBuilder来拼接
1
2
3
4
5
6
String[] names = {"Bob", "Alice", "Grace"};
StringJoiner sj = new StringJoiner(",", "Hello", "!");
for(String name:names) {
sj.add(name);
}
System.out.println(sj.toString()); // HelloBob,Alice,Grace!
  • 使用String.join()静态方法
    • 内部使用StringJoiner来拼接,无需指定头尾
1
2
String[] names = {"Bob", "Alice", "Grace"}
String.join(", ", names);

包装类型

基本类型:byte,short,int,long,boolean,float,double,char
引用类型:所有classinterface类型

  • 包装类型:基本类型转化为引用类型
    • 强制类型转化不推荐会告警Integer n1 = new Integer(i);
    • ValueOf转化 Integer n2 = Integer.ValueOf(i);
    • ValueOf(String) Integer.ValueOf("100");
  • Auto Boxing
    • 把 int转为Integer为自动装箱,反之称为自动拆箱
    • Auto Boxing只发生在编译阶段,为了少写代码
1
2
Integer n = 100;
int x = n;
  • 进制转化

    • parseInt(String, int)按int进制将String转化为整数
    • Integer.toString(int [, radis])按radis进制转化
    • Integer.toHexString() //按16进制
    • Integer.toOctalString() //按8进制转化
    • Integer.toBinaryString() //按2二进制转化
  • 处理无符号整型

    • byte范围是-128127 转为无符号范围是0255也就是int
    • 类似的可以把int按无符号转为long
    • Byte.toUnsignedInt(x)

JavaBean

getXYZ()、setXYZ()符合这样命名规范称为JavaBean,对应一组的方法称为属性

不存在setXYZ()设置属性的方法称为只读属性
不存在getXYZ()读取属性的方法称为只写属性

  • 也是属性的一种方法
  • JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。
  • 使用Introspector.getBeanInfo(XXX.class)

enum枚举类

  • 为了让编译器能自动检查某个值在枚举的结合内,并且不同用途的枚举使用的不同的类型来标记,可以用enum来定义枚举类

    • enum类型继承自java.lang.Enum,无法被继承
    • 只能定义出enum类的实例,无法通过new创建
    • 可以将enum用于switch语句
      1
      2
      3
      enum Weeday{
      SUN, MON, TUE, WED, THU, FRI, SAT;
      }
  • enum比较

    • 使用enum定义的枚举是一种引用类型
    • 但因为enum的每个常量在JVM中只有唯一一个实例,所以可以直接用==比较
      1
      2
      3
      4
      Weekday day = Weekday.SUN;
      if (day == Weeekday.SAT || day == Weekday.SUN){
      System.out.println("Stay at home");
      }
  • enum常量获取

    • 返回常量名Weekday.SUN.name();
    • 返回定义常量的顺序Weekday.MON.ordinal();
  • 人性化enum实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
if (day.dayValue == 6 || day.dayValue == 0) {
System.out.println("Today is " + day + ". Work at home!");
} else {
System.out.println("Today is " + day + ". Work at office!");
}
}
}

enum Weekday{
MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");

public final int dayValue;
private final String chinese;

private Weekday(int dayValue, String chinese) {
this.dayValue = dayValue;
this.chinese = chinese;

}

@overrdie //覆写为了输出可读性好
public String toString(){
return this.chinese;
}
}

BigInteger、BigDecimal

BigInteger

  • BigInteger和Integer、Long一样继承自Number
  • java.math.BigInteger用来表示任意大小的整数,内部使用一个int[]数组来模拟一个非常大的整数
  • 做运算的时候,只能使用实例方法,比如加法big1.add(big2);
  • 引用类型转为基本类型intValueExact,超出范围报错
  • BigInteger超过float最大范围,返回float为无穷大Infinity

BigDecimal

BigInteger一样,BigDecimal用来表示一个任意大小且精度完全准确的浮点数。

  • 小数位数d1.scale()

  • 去掉小数末尾多余的0d2.stripTrailingZeros()

  • 除法无法除尽时,需要指定精度截断并四舍五入divde(d3, 10, RoundingMode.HALF_UP)

  • 做除法且求余数divideAndRemainder(m)

    • 返回来个数组,分别是商和余数
    • 用余数是否为0来判断是否整除
  • 比较大小d1.compareTo(d2);

    • 因为equals无法比较精度

常用工具类

  • 数学上经常使用的Math有着大量的静态方法方便使用

  • Random

    • 伪随机数,给定一个初始种子,生成随机数序列是一样的
    • 生成随机数可以使用nextIntnextLongnextFloatnextDouble
  • SecureRandom

    • 真的随机数只能通过量子力学原理来获取,SecureRandom用来创建一个不可预测的随机数
    • 它无法指定种子,它使用RNG算法,JDK有许多不同底层实现,有的安全随机种子加上伪随机数算法来产生随机数,有的使用真正随机数
    • 高强度安全随机数SecureRandom.getInstanceStrong()
    • 普通安全随机数SecureRandom()
CATALOG
  1. 1. Java核心类
    1. 1.1. 字符串和编码
    2. 1.2. StringBuilder、StringJoiner
    3. 1.3. 包装类型
    4. 1.4. JavaBean
    5. 1.5. enum枚举类
    6. 1.6. BigInteger、BigDecimal
      1. 1.6.1. BigInteger
      2. 1.6.2. BigDecimal
      3. 1.6.3. 常用工具类