文章内容输出来源:拉勾教育大数据开发高薪训练营
一、String类
1.1 String类的概念:
a. java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:"abc"。
b. 该类由final关键字修饰,表示该类不能被继承,不能改变。
c. 从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间。
d. 该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
比如:String str = “123”;
str = “abc”; // "123", "abc" 都是不可改变的常量
str首先保存的是“123”这个字符串的地址,因此str指向“123”这个字符串;
后面str保存的是“abc”这个字符串的地址,因此str改变了原来的指向,变成了指向“123”,但原来“123”的值并没有改变;
String的常考点:
public class StringExamTest { public static void main(String[] args) { // 1.请问下面的代码会创建几个对象?分别存放在什么地方? //String str1 = "hello"; // 1个对象 存放在常量池中 //String str1 = new String("helo"); // 2个对象 1个在常量池中,1个在堆区 // 2.常量池和堆区对象的比较 String str1 = "hello"; // 常量池 String str2 = "hello"; // 常量池 String str3 = new String("hello"); // 堆区 String str4 = new String("hello"); // 堆区 System.out.println(str1 == str2); // 比较地址 true System.out.println(str1.equals(str2)); // 比较内容 true System.out.println(str3 == str4); // 比较地址 false System.out.println(str3.equals(str4)); // 比较内容 true System.out.println(str2 == str4); // 比较地址 false System.out.println(str2.equals(str4)); // 比较内容 true System.out.println("------------------------------------------------------------"); // 3.常量有优化机制,变量没有 String str5 = "abcd"; String str6 = "ab" + "cd"; // 常量优化机制 "abcd" System.out.println(str5 == str6); // 比较地址 true String str7 = "ab"; String str8 = str7 + "cd"; // 没有常量优化 System.out.println(str5 == str8); // 比较地址 false } }
二、StringBuilder可变字符串
1. 基本概念:
a. 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。
b. 为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffffer类来描述字符序列可以改变的字符串。
c. StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
d. StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
String 中的字符串拼接问题:
由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:
public class StringDemo { public static void main(String[] args) { String s = "Hello"; s += "World"; System.out.println(s); } }
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
根据这句话分析我们的代码,其实总共产生了三个字符串,即
“Hello”
、"World"
和"HelloWorld"
。引用变量s首先指向Hello
对象,最终指向拼接出来的新字符串对象,即“HelloWorld”由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder类。
2. 常用构造方法与成员方法:
方法声明 | 功能介绍 |
---|---|
StringBuilder()
|
使用无参方式构造对象,
默认容量为16
|
StringBuilder(int capacity)
|
根据参数指定的容量来构造对象,容量为参数指定大小
|
StringBuilder(String str)
|
根据参数指定的字符串来构造对象,
容量为:16+字符串长度
|
方法声明 | 功能介绍 |
---|---|
int capacity()
|
用于返回调用对象的容量
|
int length()
| 用于返回字符串的长度,也就是字符的个数 |
StringBuilder insert(int offset, String str)
|
插入字符串并返回调用对象的引用,就是自己(this)。
|
StringBuilder append(String str)
|
追加字符串
|
StringBuilder deleteCharAt(int index)
|
将当前字符串中下标为
index
位置的单个字符删除
|
StringBuilder delete(int start
,
int end)
| 删除字符串 |
StringBuilder replace(int start
,
int end,String str)
|
替换字符串
|
StringBuilder reverse()
|
字符串反转
|
String toString() | 将此序列返回字符串格式 |
注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。
3. 返回值的设定:
a. StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this;
b. 由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。这样设计在于可以连续调用。