字符串和编码

String 在Java中,String是一个引用类型,它本身也是一个class。但是,Java编译器对String有特殊处理,即可以直接用"..."来表示一个字符串: String s1 = "Hello!"; 实际上字符串在String内部是通过一个char数组表示的,因此,按下面的写法也是可以的: String s2 = new String(new char {'H', 'e',
字符串和编码

StringBuilder

Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。 考察下面的循环代码: String s = ""; for (int i = 0; i < 1000; i++) { s = s + "," + i; } 虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。 为
StringBuilder

StringJoiner

要高效拼接字符串,应该使用StringBuilder。 很多时候,我们拼接的字符串像这样: // 输出: Hello Bob, Alice, Grace! public class Main { public static void main(String args) { String names = {"Bob", "Alice", "Grace"}; var sb = new Stri
StringJoiner

包装类型

我们已经知道,Java的数据类型分两种: 基本类型:byte,short,int,long,boolean,float,double,char; 引用类型:所有class和interface类型。 引用类型可以赋值为null,表示空,但基本类型不能赋值为null: String s = null; int n = null; // compile error! 那么,如何把一个基本类型视为对象(引
包装类型

JavaBean

在Java中,有很多class的定义都符合这样的规范: 若干private实例字段; 通过public方法来读写实例字段。 例如: public class Person { private String name; private int age; public String getName() { return this.name; } public void setName(String n
JavaBean

枚举类

在Java中,我们可以通过static final来定义常量。例如,我们希望定义周一到周日这7个常量,可以用7个不同的int表示: public class Weekday { public static final int SUN = 0; public static final int MON = 1; public static final int TUE = 2; public stati
枚举类

记录类

使用String、Integer等类型的时候,这些类型都是不变类,一个不变类具有以下特点: 定义class时使用final,无法派生子类; 每个字段使用final,保证创建实例后无法修改任何字段。 假设我们希望定义一个Point类,有x、y两个变量,同时它是一个不变类,可以这么写: public final class Point { private final int x; private fi
记录类

BigInteger

在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。 如果我们使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int数组来模拟一个非常大的整数: BigInteger bi = new Bi
BigInteger