1String特性
1.1字面量的定义方式
字符串一经创建不可修改,例如给s1字符重新赋值,就是在方法区重新创建了一个hello,并且方法区也不会重复创建字符串。
1.2两种创建字符串方式的区别
- 采用字面量赋值法,就是在常量池中创建一个字符串对象,而使用new对象的方式创建,是在堆中创建个对象,之后这个对象指向常量池中的字符串对象。
- 使用new对象的方式创建字符串会创建两个对象(面试题)
1.3字符串对象的存储
- 使用new的方式创建字符串对象后,其变量在栈中存储的是堆中对象的地址值,如s3的0x8899和s4的0x7777
- 假设Person类具有name和age属性,以下存储过程如图:
p1.name == p2.name所比较的是对象中name属性的地址值,此时正好均指向方法区中的0x1111,一般==比较的是地址值,而equals比较的是字符串是否相同
1.4关于字符串拼接的注意点
- 有关字符串拼接的内容看结论结合图理解即可
- 字符串与变量拼接的例子
- 但凡有变量的,其结果就会出现在堆中。此结论要注意一种特殊的形式,比如变量前面加了final,将其修饰为常量,此时拼接的话,其字符串对象仍然在常量池中,而不是堆中
final String a = "abc";
String b = a + "def";
1.5面试题
public class StringTest {
String str = new String("good");
char[] ch = { 't', 'e', 's', 't' };
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'b'; }
public static void main(String[] args) {
StringTest ex = new StringTest();
ex.change(ex.str, ex.ch);
System.out.print(ex.str);
System.out.println(ex.ch);
}
}
//考察java值传递
/*
虽然方法中传入的是str引用类型,但是字符串具有不可变性,此时的str是方法中的形参str,与外部的str无关,因此str输出good
但是char型数组名代表的就是数组地址,有了地址值,则直接就是对数组进行改变,这点可参考c语言中的数组名传递机制
*/
2常用方法
2.1 第一部分
2.2 第二部分
2.3 第三部分
3String类型转换
3.1String与基本数据类型转换在这里插入图片描述
String a = "123";
int i = Integer.parseInt(a);
//此时调用Integer.parseInt方法转为基本类型
String s = String.valueOf(i);
//调用String的valueOf方法将其转为类对象
3.2String与字符数组转换
String a = "abcde";
//toCharArray将字符串转为字符数组
char[] chars = a.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]);
}
System.out.println();
char []chars1 = {'a','b','c','d','e'};
//String构造器将字符数组转为字符串
String s = new String(chars1);
System.out.println(s);
3.3String与字节数组转换
public class Persontest {
public static void main(String[] args) {
String a = "abc123";
//将字符串转为字节数组
byte[] bytes = a.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]+" ");
}
System.out.println();
//将字节数组转为字符串
String s = new String(bytes);
System.out.println(s);
}
}
4 StringBuffer
4.1 特点
重点在于:可变
4.2 常用方法
4.3 String StringBuffer StringBuilder三者的对比
4.4面试题
4.4.1
public class Persontest {
public static void main(String[] args) {
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());
System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str);
System.out.println(sb1);
}
}
输出结果:
- 首先第一个输出是4的原因是源码里append()方法有一条语句,将null空值改写成了字符串"null",因此执行append()方法后长度为4
if(str == null){
str = "null"
}
- 最后报异常是因为,构造器里面还要去调用父类的构造器,不能传递空指针