intern()、append()、String 、StringBuffer 和 StringBuilder以及内部类
提示:以下是本篇文章正文内容,下面案例可供参考
intern()
方法再字符串池中已存在与当前 String 类型实例 相等(equals(String)
) 的字符串,则返回该字符串,否则将该字符串加入到字符串池后,再返回。
String str_1 = "天行健";
char[] char_1 = {'天' , '行' , '健'};
String str_2 = new String(char_1);
System.out.println(str_1 == str_2)
当直接定义一个 String 类型
的实例时,会指向字符串池中的一个 String 实例
;但用引用变量 str_2
new 一个String 类型的实例,是指向堆内存中的一个 String实例。 所以即使两个字符串中内容相同,通过 “==” 比较返回的是false。
然如果通过 intern()
方法给第二个字符串进行赋值,那么就回去字符串池中寻找,当发现有该常量时,就直接返回。
String str_3 = "君子以自强不息";
String str_4 = str_3.intern();
System.out.println(str_3 == str_4);
append()
方法通过 builder 中 append()方法给指定缓冲区(builder)后 追加 指定字符串。
String 、StringBuffer 和 StringBuilder
String | StringBuffer | StringBuilder | |
---|---|---|---|
执行速度 | 最差 | 其次 | 最高 |
线程安全 | 线程安全 | 线程安全 | 线程不安全 |
使用场景 | 少量字符串操作 | 多线程环境下的大量操作 | 单线程环境下的大量操作 |
String
:对于String来说,是把数据存放在了常量池中,因为所有的String,默认都是以常量形式保存,且由final修饰,因此在线程池中它是线程安全的。因为每一个String当被创建好了以后,他就不再发生任何变化,但是它的执行速度是最差的。
StringBuffer
:StringBuffer
相对于StringBuilder
效率要相对低一点,但也远比String要高的多。
StringBuilder
:对于StringBuilder
来说,执行效率虽然高,但是因为线程不安全。
注:当使用void setLength(int newLength)
方法 ,设置字符序列的长度时,如果设置为 ’0‘ ,则为清空。
使用 static 修饰的成员类(member class)为 嵌套类(Nest class)。
没有被static修饰的成员类(member class),称为内部类(inner class),俗称实例内部类。
不是成员的内部类都可以视为局部类,称为局部类(local class)。
而匿名类(anonymous class),又俗称匿名内部类。