String类
在java中通过String类创建和操作字符串。
创建字符串
public class Test1 {
public static void main(String[] args) {
//创建字符串
String str = "Hello";
String str1 = new String("hello");
char[] array = {'h','i'};
String str2 = new String(array);
System.out.println(str);
}
}
String类是引用类型。例如 String str = “Hello”;的代码布局如下:
因为String类是引用类型,故以下代码布局如图所示:
String str1 = "Hello";
String str2 = str1;
再对str1的值进行修改,str2的值不会发生变化。
String str1 = "Hello";
String str2 = str1;
str1 = "hi";
System.out.println("str = " + str);
System.out.println("str1 = " + str1);
输出结果:
内存布局如图:
字符串比较
- 两个整型变量在判断大小时使用 == 即可完成,但是String类型变量在比较时使用 == 不可以比较字符串是否相等。
public class Test1 {
public static void main(String[] args) {
//字符串比较
String str1 = "Aleng";
String str2 = new String("Aleng");
System.out.println(str1==str2);
}
}
输出结果:
代码的执行结果为false,是因为String类为引用类型,使用 == 用来判断的是两个变量是否指向同一个对象。
内存布局:
上面的代码中 String str1 = “Aleng”; 申请一个空间用来存放“Aleng”,但是 String str2 = new String(“Aleng”); 相当于又重新申请了一块内存用来存放“Aleng”,导致内存中存放两份“Aleng”。
代码的执行结果为false,是因为String类为引用类型,使用“==”用来判断的是两个变量是否指向同一个对象。
- 想要比较字符串内容是否相等,可以使用String类提供的equals方法。
public class Test1 {
public static void main(String[] args) {
//字符串比较
String str1 = "Aleng";
String str2 = new String("Aleng");
System.out.println(str1.equals(str2));
}
}
输出结果:
[注意]
上面代码在使用equals方式时需注意str1不能为null,若str1为null则会抛出空指针异常。如图所示:
String str1 = null;
String str2 = new String("Aleng");
System.out.println(str1.equals(str2));
字符串常量池
在Java中,String类有两种实例化操作,直接赋值和构造方法。
直接赋值
String str1 = "Aleng";
String str2 = "Aleng";
String str3 = "Aleng";
System.out.println(str1==str2); //true
System.out.println(str1==str3); //true
System.out.println(str2==str3); //true
内存布局:
- 直接赋值实际上是将字符的内容自动放入字符串常量池中;
- 使用直接赋值实例化String类,若在字符串常量池中有指定内容,则直接引用;若没有则开辟一块新的内存存放在以便于下次使用;
构造方法:
String string1 = new String("Acheng");
String string2 = new String("Acheng");
String string3 = new String("Acheng");
System.out.println(string1==string2); //false
System.out.println(string1==string3); //false
System.out.println(string2==string3); //false
内存布局:
- 使用String构造方法会开辟两块内存空间,其中一块会被当做内存垃圾被JVM自动回收;
- 使用构造方法也会存在同一个字符串内容被多次存放浪费空间的问题。
为了解决这一问题,可以使用String类中的intern()方法。intern()方法可以将字符串内容手工入池。
String str = new String("Acheng").intern();
String string = "Acheng";
System.out.println(str == string); //true