一、String, StringBuilder,StringBuffer 的区别
- 相同点:都表示字符串,字符序列
- 不同点:
- 是否可变:
String:不可变字符串
StringBuilder:可变字符序列
StringBuffer:可变字符序列
- 线程安全|同步:
StringBuilder:线程不安全|不同步
StringBuffer:线程安全|同步
执行效率:StringBuilder > StringBuffer > String
- StringBuilder:一个可变的字符序列,此类提供与StringBuffer兼容的API,但不保证同步,在可能情况下,建议使用此类优先于StringBuilder类,因为它支持所有的相同的操作,但速度更快,因为它不支持同步。
- StringBuffer:线程安全,可变字符序列,可供多个线程使用
tips:从JDK 5版本开始,这个类已经补充了一个设计用于单个线程的等效类, StringBuilder 。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
- 底层结构:
来自共同的父类:AbstractStringBuilder
jdk8之前:char[] value;
jdk11:byte[] value;
初始容量:16 | 可通过构造器指定
//StringBuilder() 构造一个字符串构建器,其中不包含任何字符,初始容量为16个字符。
StringBuilder s1 = new StringBuilder();
System.out.println(s1.length());//0
System.out.println(s1.capacity());//16
//StringBuilder(int capacity) 构造一个字符串构建器,其中没有字符,并且具有 capacity参数指定的初始容量。
StringBuilder s2 = new StringBuilder(20);
System.out.println(s2.length());//0
System.out.println(s2.capacity());//20
//StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器。
StringBuilder s3 = new StringBuilder("abc");
System.out.println(s3.length());//3
System.out.println(s3.capacity());//19
- 追加 StringBuilder append(boolean b) 将 boolean参数的字符串表示形式追加到序列中。
s3.append(false);
- StringBuilder delete(int start, int end) 删除此序列的子字符串中的字符。(start包括开始索引,但不包括最后的索引位置end)
s3.delete(1,2);
- StringBuilder insert(int offset, double d) 将 double参数的字符串表示形式插入此序列中。
s3.insert(2, 3.0);//在索引为二的位置插入3.0进去
- StringBuilder reverse() 导致此字符序列被序列的反向替换。
s3.reverse();//如果s3此时为"abc",则转换后s3为"cba"
- StringBuilder,StringBuffer-->String
StringBuilder s = new StringBuilder("abc");
String ss = new String(s);
- String-->StringBuilder,StringBuffer
String s5 = "abcd";
StringBuilder s6 = new StringBuilder(s5);
二、特殊类型:枚举类型
确定一种事物的所有可能|实例
枚举是一种特殊的类型,定义特殊,特点特殊,使用特殊
使用 enum 声明的类型:
enum{
}
枚举类型的实例是由枚举类内部提供,不允许外部创建,只能获取使用-->所以枚举类默认构造器是private修饰
枚举中的字段为当前枚举类型的实例,相当于省略了public static final修饰
枚举类构造器默认修饰符为private
枚举类中可以定义字段、属性、构造器、方法...
枚举类型的使用:通过枚举名 . 实例名
枚举类型默认隐式的继承java.lang.Enum 这是所有Java语言枚举类型的公共基类
public class EnumTest {
public static void main(String[] args) {
Wkday wkday1 = Wkday.D3;
System.out.println(wkday1.getName());//null
Wkday wkday2 = Wkday.D4;
System.out.println(wkday2.getName());
//switch可匹配的参数类型 : byte short int char 1.5增加枚举类型 1.7增加String
switch (wkday2){
case D3:
System.out.println("今天是"+wkday1.getName());
case D4:
System.out.println("今天是"+wkday2.getName());
}
//int ordinal() 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。
int num = wkday1.ordinal();
System.out.println(num);
//请注意,对于特定的枚举类型T ,可以使用该枚举上隐式声明的public static T valueOf(String)方法代替此方法从名称映射到相应的枚举常量。
// 可以通过调用该类型的隐式public static T[] values()方法来获取枚举类型的所有常量。
Wkday[] arrs = Wkday.values();//枚举常量存入数组
System.out.println(Arrays.toString(arrs));
}
}
//枚举类型
enum Wkday {
//实例
D1, D2, D3, D4("周四"), D5, D6, D7;
//属性
private String name;
//构造器,默认被private修饰
private Wkday() {
}
private Wkday(String name) {
this.name = name;
}
//成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void test() {}
}