【Java基础】String类 && StringBuilder类
String类
String类特点
- 字符串底层是字节类型的数组:byte[]
- Java程序中所有双引号字符串,都是String类的实例(对象)
- 字符串在创建之后,其内容不可更改
- 字符串虽然不可以改变,但是可以被共享(通过字符串常量池)
字符串常量池(StringTable)
--> 当使用双引号创建字符串对象时,会检查常量池中是否存在该数据。如果不存在,就在字符串常量池中创建;如果存在,就直接复用
--> 内存位置:jdk7之前:位于方法区内存;jdk7及之后:位于堆内存
String类两种构建方式的区别
- 双引号直接创建
在字符串常量池中进行维护 - 构造方法创建
在堆内存中独立空间进行维护
这里String s2 = new String("abc");
有两步操作:
(1)参数——实例"abc"会在字符串常量池中维护,这里因为上一句代码已经创建了"abc",因此直接复用。
(2)在堆内存中new了一块新的空间维护实例s2,实例s2是拷贝的字符串常量池中实例"abc"的副本。因为String类的底层是byte[],因此s2内存中存储的实际上是字符串常量池中"abc"的地址。
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。
StringBuilder和StringBuffer的定义、构造、成员方法等都是相同的,不同之处在于StringBuffer是多线程安全的,相应执行速度会慢;而StringBuilder是线程不安全的,相应的执行速度会快。
这个答案是true,因为是字符串常量拼接,因此Java的常量优化机制会优化
String类内容比较
- boolean equals(Object anObject):将此字符串与指定的对象比较。
- boolean equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写。
String类遍历
- char[] toCharArray():将此字符串转换为一个新的字符数组。
public static void traverse1(String s) {
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
- char charAt(int index):返回指定索引处的 char 值。
public static void traverse2(String s) {
int len = s.length();
for(int i = 0; i < len; i ++ ) {
System.out.println(s.charAt(i));
}
}
String类的字符串截取
String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串[beginIndex,String.length())。
String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串[beginIndex,endIndex)。
String类的字符串替换
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String newStr):按照正则表达式匹配的内容进行替换。
String s = "先帝1创业2未半而中道3崩殂4,今5天下三分6,益州疲弊7,此8诚危急存亡之秋也。然9侍卫之臣不懈于内,忠志之士忘身10于外者,盖追先帝之殊遇11,欲报之于陛下也。诚宜12开张圣听13,以光14先帝遗德,恢弘15志士之气,不宜妄自菲薄16,引喻失义17,以塞忠谏之路也18。";
s = s.replaceAll("\\d", ""); // 将字符串中的数字用空字符替换
System.out.println(s);
String类的字符串切割
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
注意:以"."
和"+"
等为规则切割时需要加转义字符变成"\\."
、"\\+"
才能切割成功
StringBulider类
- 可以提高字符串的操作效率,尤其是对字符串拼接操作,快了超级多!!!
String拼接"+"会自动new一个StringBuilder,拼接完之后又转换成String,也就是说每拼接一次,就会有两个堆内存被占用
而StringBuilder是手动new了一个StringBuilder对象,所有的拼接操作都在同一个内存地址中存储
StringBuilder中可以添加任意数据类型,但是都会被转换为字符串存储。
String转StringBulider: