Java核心类
本节我们将学习Java的基本核心类,包括:
1 | 字符串 |
字符串和编码
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 | StringBuilder sb = new StringBuilder(1024); |
- 由于`String.Builder()`返回的是`this object`,可以使用链式`sb.append(',').append('i');`
- 对于普通字符串`+`操作,Java编译器在编译时自动把多个连续的`+`操作编码为`StringConcatFactory`操作。运行时`StringConcatFactory`会自动转为数组复制或`StringBuilder`操作
- 使用
StringJoiner(join, prefix, suffix)
添加字符 - 本质上内部使用
StringBuilder
来拼接
1 | String[] names = {"Bob", "Alice", "Grace"}; |
- 使用
String.join()
静态方法- 内部使用
StringJoiner
来拼接,无需指定头尾
- 内部使用
1 | String[] names = {"Bob", "Alice", "Grace"} |
包装类型
基本类型:byte
,short
,int
,long
,boolean
,float
,double
,char
引用类型:所有class
和interface
类型
- 包装类型:基本类型转化为引用类型
- 强制类型转化不推荐会告警
Integer n1 = new Integer(i);
- ValueOf转化
Integer n2 = Integer.ValueOf(i);
- ValueOf(String)
Integer.ValueOf("100");
- 强制类型转化不推荐会告警
- Auto Boxing
- 把 int转为Integer为自动装箱,反之称为自动拆箱
- Auto Boxing只发生在编译阶段,为了少写代码
1 | Integer n = 100; |
进制转化
parseInt(String, int)
按int进制将String转化为整数Integer.toString(int [, radis])
按radis进制转化Integer.toHexString()
//按16进制Integer.toOctalString()
//按8进制转化Integer.toBinaryString()
//按2二进制转化
处理无符号整型
- byte范围是-128
127 转为无符号范围是0255也就是int - 类似的可以把int按无符号转为long
Byte.toUnsignedInt(x)
- byte范围是-128
JavaBean
getXYZ()、setXYZ()符合这样命名规范称为JavaBean,对应一组的方法称为属性
不存在setXYZ()设置属性的方法称为只读属性
不存在getXYZ()读取属性的方法称为只写属性
- 也是属性的一种方法
- JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。
- 使用
Introspector.getBeanInfo(XXX.class)
enum枚举类
为了让编译器能自动检查某个值在枚举的结合内,并且不同用途的枚举使用的不同的类型来标记,可以用enum来定义枚举类
- enum类型继承自
java.lang.Enum
,无法被继承 - 只能定义出enum类的实例,无法通过new创建
- 可以将enum用于switch语句
1
2
3enum Weeday{
SUN, MON, TUE, WED, THU, FRI, SAT;
}
- enum类型继承自
enum比较
- 使用enum定义的枚举是一种引用类型
- 但因为enum的每个常量在JVM中只有唯一一个实例,所以可以直接用
==
比较1
2
3
4Weekday 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 | public class Main { |
BigInteger、BigDecimal
BigInteger
- BigInteger和Integer、Long一样继承自Number
java.math.BigInteger
用来表示任意大小的整数,内部使用一个int[]数组来模拟一个非常大的整数- 做运算的时候,只能使用实例方法,比如加法
big1.add(big2);
- 引用类型转为基本类型
intValueExact
,超出范围报错 BigInteger
超过float最大范围,返回float为无穷大Infinity
BigDecimal
和BigInteger
一样,BigDecimal
用来表示一个任意大小且精度完全准确的浮点数。
小数位数
d1.scale()
去掉小数末尾多余的0
d2.stripTrailingZeros()
除法无法除尽时,需要指定精度截断并四舍五入
divde(d3, 10, RoundingMode.HALF_UP)
做除法且求余数
divideAndRemainder(m)
- 返回来个数组,分别是商和余数
- 用余数是否为0来判断是否整除
比较大小
d1.compareTo(d2);
- 因为
equals
无法比较精度
- 因为
常用工具类
数学上经常使用的Math有着大量的静态方法方便使用
Random
- 伪随机数,给定一个初始种子,生成随机数序列是一样的
- 生成随机数可以使用
nextInt
、nextLong
、nextFloat
、nextDouble
SecureRandom
- 真的随机数只能通过量子力学原理来获取,SecureRandom用来创建一个不可预测的随机数
- 它无法指定种子,它使用RNG算法,JDK有许多不同底层实现,有的安全随机种子加上伪随机数算法来产生随机数,有的使用真正随机数
- 高强度安全随机数
SecureRandom.getInstanceStrong()
- 普通安全随机数
SecureRandom()