1. 字符串的“+”操作
注意点:
- 当“+”操作临近的前后出现字符串时,这个“+”是字符串连接符,而不是算术运算符。他会将前后的数据进行拼接,并产生一个新的字符串。
- 当进行连续“+”操作时,从左到右逐个执行
例如:
System.out.println(“abc” + true);//“abctrue”
- 此时的true是一个布尔类型的常量值,所以可以直接和abc进行拼接(就相当于数字13),产生一个新的字符串“abctrue”
int age = 18;
System.out.println(“我的年龄是” + age + “岁”);
//“我的年龄是18岁”
- 此时的age是一个变量,在执行“+”操作时,会将变量里的值拿出来,用拿出来的值进行拼接操作。
System.out.println(“我的年龄是” + “age” +“岁”);
//“我的年龄是age岁”
- 而此时的“age”是字符串“age”,并没有存储什么值,所以在进行“+”操作时,是直接进行拼接操作
System.out.println(1 + 2 + “abc” + 2 + 1);
//“3abc21”
2. 字符串的注意事项
- String是java定义好的一个类。定义在java.lang包中,因为java.lang包是java的核心包,使用的时候不需要导包,所以String类使用的时候也不需要导包。
- java程序中的所有字符串文字(例如“abcdefg”),都为String类的对象。
- 字符串不可变,它们的值在创建后不能被更改
例如:String name = “尼古拉斯阿伟”; //创建一个字符串“尼古拉斯阿伟”,并把它赋值给name变量
name = “尼古拉斯凯奇”; //创建一个新的字符串“尼古拉斯凯奇”,再把它赋值给name变量,并没有改变“尼古拉斯阿伟”这个字符串里面的内容。所以在这个过程中,一共产生两个字符串。 - 字符串也有索引,与数组类似,也是从0开始到字符串长度-1结束
3. 创建String对象
-
直接赋值
String s1 = “abc”;
System.out.println(s1);//abc -
使用new的方式来获取一个字符串对象
a.空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println(“@” + s2 + “!”);//@!
b. 传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象,就有两个相同的字符串对象,多此一举了。
String s3 = new String(“abc”);
System.out.println(s3);
c. 传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//应用场景:需要修改字符串的内容,正常来说字符串的内容不能更改,但可以采用这种方法间接修改。
//例如:abc --> Qbc
//可以:abc --> {‘a’,‘b’,‘c’} --> {‘Q’,‘b’,‘c’} --> “Qbc”
Char【】 chs = {‘a’,‘b’,‘c’,‘d’};
String s4 = new String(chs);
System.out.println(s4);//abcd
d. 传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象,即先拿字节数组里的数字去ASCII码表里查对应的字符,再进行拼接
//应用场景:以后在网络当中传输的数据都是字节信息(ascii码),我们需要把字节信息进行转换,转成字符串,就要用到这个构造了
byte【】 bytes = {97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);//abcd
4. 创建字符串的内存分析
- 当使用双引号直接赋值时,系统会检查该字符串在串池(StringTable)中是否存在。
若不存在:在串池中,创建新的字符串对象
若存在:复用,即用这个存在的字符串对象
特点:支持复用,节省内存空间,代码简单。
注意:StringTable(串池)在JDK7版本开始,从方法区挪到了堆内存中。
如图:
- 当使用new关键字,来获取一个字符串对象时,每new一次,就会在堆内存中开辟一片新空间。
特点:不支持复用,若相同字符串比较多,会浪费内存空间
如图: