以下总结,基于 JDK1.7 版本。
String对象
String类虽然不是Java的八种基本数据类型之一,但是也可以像基本数据类型一样直接通过字面量赋值,当然也可以通过new
来实例化一个字符串对象。但是字面量赋值和new创建一个字符串对象的方式有本质的区别。
字面量赋值
这种方式首先会在方法区常量池中查找字符串,若存在内容相同的字符串,则新对象的引用直接指向这个字符串。若不存在,则在常量池中生成内容相同的新字符串,然后让对象的引用指向它new 创建新对象
通过new
的方式创建新的字符串对象,会直接在堆中分配内存,引用指向新对象。
字符串的比较
==
运算符比较的是内存中的引用地址,equals()
方法比较的是对象的内容,因此下列代码的输出是:
String str1 = "hello world!";
String str2 = new String("hello world!");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
字符串常量的 +
运算,会在编译期间,将多个字符串常量合并成一个,而字符串对象的 +
实际上是使用StringBuilder.append()来完成的,因此:
String str1 = "hello,world!";
String str2 = "hello," + "world!";
System.out.println(str1 == str2); // true
String str3 = "hello,";
String str4 = "world!";
String str5 = str3 + str4;
System.out.println(str1 == str5); // false
String.intern()方法
intern()
方法会将字符串对象的引用添加到字符串常量池中,然后返回这个引用。如果常量池中已经存在了相同内容的字符串,那么直接返回这个字符串的引用。因此下面这段代码的输出是:
String str1 = new String("hello,world!");
String str2 = "hello,world!";
String str3 = str1.intern();
System.out.println(str2 == str3); // true
String.compareTo()方法
s1.compareTo(String s2)
方法会根据字典顺序比较两个字符串,返回值有三种。
- 第一种是比较到第一个不同位置k时,返回两个字符的Unicode码的差值s1[k] - s2[k]
;
- 第二种是一个比完另一个还有,则返回两个字符串的长度的差值s1.length() - s2.length()
;
- 第三种就是两个字符串内容完全一样,返回 0
。