Java学习——核心类
一、String类
1、String类内部
字符串在String内部是通过一个char[]数组表示的,因此既可按照“...”的方式书写,也可按照以下方式书写。String是不可变对象,字符串操作不改变原字符串内容,而是返回新字符串。
String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});
早期JDK的String类:
public final class String {
private final char[] value;
private final int offset;
private final int count;
}
较新的JDK版本的String则以byte[]存储:
public final class String {
private final byte[] value;
private final byte coder; // 0 = LATIN1, 1 = UTF16
二、常见字符串方法
方法 | 格式 | 说明 |
---|---|---|
比较 | s.equals() | 不能使用== |
去除首尾空白 | s.trim() | 空白字符包括\t,\r,\n |
去除首尾空白 | strip() | 除了trim去除的,还能去除类似中文的空格字符\u3000 |
是否为空 | isEmpty() | 字符串长度>0则返回false |
是否为空白 | isBlank() | 只有空白字符(例如空格等)则返回true |
替换 | s.replace(旧的,新的) | |
分割字符串 | s.split(分隔符) | 返回String[] |
拼接字符串 | String.join(拼接符,字符串数组) | 静态方法 |
格式化字符串 | String.format(字符串,参数1,参数2...) | String.format("Hi %s, your score is %.2f!", "Bob", 59.5),不确定用啥占位符,那就始终用%s,因为%s可以显示任何数据类型 |
将其它类型转换为String | String.valueOf() | 编译器会根据参数自动选择合适的方法 |
字符串转整型 | Integer.parseInt("123") | |
字符串转布尔型 | Boolean.parseBoolean("true") | |
字符串转char[] | "Hello".toCharArray() | |
char[]转字符串 | String s = new String(cs) | |
字符串转其它编码 | byte[] b2 = "Hello".getBytes("UTF-8"); byte[] b2 = "Hello".getBytes("GBK"); |
三、字符串编码
- 最早期:美国国家标准学会(American National Standard Institute:ANSI)制定了一套英文字母、数字和常用符号的编码,它占用一个字节,编码范围从0到127,最高位始终为0,称为ASCII编码。
- 为了解决一个字节不够编码的问题:汉字(GB2312标准)、日文(Shift_JIS编码)、韩文(EUC-KR编码)
- 为了统一上述编码:全球统一码联盟发布了Unicode编码,它把世界上主要语言都纳入同一个编码,Unicode编码需要两个或者更多字节表示
- UTF-8编码:因为英文字符的Unicode编码高字节总是00,包含大量英文的文本会浪费空间,所以,出现了UTF-8编码,它是一种变长编码,用来把固定长度的Unicode编码变成1~4字节的变长编码。UTF-8编码的另一个好处是容错能力强。如果传输过程中某些字符出错,不会影响后续字符,因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,它经常用来作为传输编码。
四、StringJoiner
1、为什么使用
使用s=s+"str"拼接字符串时,会不断创新新对象,效率低。Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。
2、语法
(1)基础语法
// 1.创建StringBuilder实例
StringBuilder sb = new StringBuilder(1024);
// 2.使用add拼接
for (int i = 0; i < 1000; i++) {
sb.append(',');
sb.append(i);
}
// 3.使用toString转为str
String s = sb.toString();
(2)链式操作
查看StringBuilder的内部逻辑,发现append方法返回自身,因此可以使用链式操作
public StringBuilder append(String str) {
super.append(str);
return this;
}
链式操作如下:
public static void main(String[] args) {
var sb = new StringBuilder(1024);
sb.append("Mr ")
.append("Bob")
.append("!")
.insert(0, "Hello, ");
System.out.println(sb.toString());
}
五、StringJoiner类
1、使用场景
拼接字符串
2、语法
public class Main {
public static void main(String[] args) {
String[] names = {"Bob", "Alice", "Grace"};
// 1.构造实例,参数依次是拼接符,前缀,结尾
var sj = new StringJoiner(", ", "Hello ", "!");
for (String name : names) {
sj.add(name);
}
System.out.println(sj.toString()); // Hello,Bob,Alice,Grace!
}
}
3.注意事项
如果没有前缀和后缀,可以直接使用String.join()
六、包装类型
1、是什么
基本类型对应的引用类型为包装类型,包装类型封装了很多实用方法。
例如,int对应Integer类,double对应Double
2、自动装箱和自动拆箱
int和Integer可以互相转换,
Integer n = 100; // 编译器自动使用Integer.valueOf(int)
int x = n; // 编译器自动使用Integer.intValue()
直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。
在创建Integer对象时,进行使用方法二,因为方法1总是创建新的Integer实例,方法2把内部优化留给Integer的实现者去做。Integer.valueOf()是静态工厂方法,它尽可能地返回缓存的实例以节省内存
方法1:Integer n = new Integer(100);
方法2:Integer n = Integer.valueOf(100);
3、注意事项
引用类型的毕竟必须使用equals而非==
七、枚举类enum
1、使用场景
定义有限类的同类型枚举
2、语法
(1)基础语法
必须使用enum关键词
public enum Color {
RED, GREEN, BLUE;
}
上述代码被编译器翻译为:
public final class Color extends Enum { // 继承自Enum,标记为final class
// 每个实例均为全局唯一:
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color BLUE = new Color();
// private构造方法,确保外部无法调用new操作符:
private Color() {}
}
(2)实例方法
每个枚举值其实为一个实例,因此有实例方法。
- name():返回常量名
String s = Weekday.RED.name(); // "RED"
- ordinal():返回定义的常量的顺序,从0开始计数。改变枚举常量定义的顺序就会导致ordinal()返回值发生变化,因此代码不健壮
(3)自定义构造方法
public class Main {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
if (day.dayValue == 6 || day.dayValue == 0) {
System.out.println("Work at home!");
} else {
System.out.println("Work at office!");
}
}
}
enum Weekday {
MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0);
public final int dayValue;
// 自定义构造方法,可定义dayValue字段
private Weekday(int dayValue) {
this.dayValue = dayValue;
}
}
八、记录类
1、作用
记录类实现以下功能:
- 定义class时使用final,无法派生子类;
- 每个字段使用final,保证创建实例后无法修改任何字段。
即:
public final class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() {
return this.x;
}
public int y() {
return this.y;
}
}
2、语法
和enum类似,我们自己不能直接从Record派生,只能通过record关键字由编译器实现继承
public record Point(int x, int y) {}
九、BigInteger
1、场景
在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。
如果我们使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger就是用来表示任意大小的整数。
2、语法
(1)基础语法
对BigInteger做运算的时候,只能使用实例方法
BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780
(2)转换为基础类型
可以把BigInteger转换成基本类型。如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()、longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常。
BigInteger i = new BigInteger("123456789000");
System.out.println(i.multiply(i).longValueExact()); // java.lang.ArithmeticException: BigInteger out of long range
十、BigInteger
1、语法
(1)创建
BigDecimal bd = new BigDecimal("123.4567");
System.out.println(bd.multiply(bd)); // 15241.55677489
(2)精度及取值
.scale获取精度,setScale按照制定方法设置精度
BigDecimal d1 = new BigDecimal("123.456789");
BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568
2、注意事项
使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等
比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()。
本文作者:风一样的我1
本文链接:https://www.cnblogs.com/pengu1998/p/16874653.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步