1、关于字符串的陷阱
1、1 JVM对字符串的处理
String str = new String("Java对象"); 对于上面常见的Java语句,常见的问题是,上面语句创建了几个字符串?答案是:上面的语句实际上创建了两个字符串对象,其中一个是“Java对象”这个直接量对应的字符串对象,另一个是有new String()构造器返回的字符串对象。- 通过new调用构造器创建Java对象
- 通过Class对象的newInstance()方法调用构造器创建Java对象
- 通过Java的反序列化机制从IO流中恢复Java对象
- 通过Java对象提供的clone()方法复制一个Java对象
public class StringTest {
public static void main(String[] args) {
String str1 = "Java对象";
String str2 = "Java对象";
System.out.println(str1 = str2);
}
}输出结果:public class StringJoinTest2 {
public static void main(String[] args) {
String str1 = "Java对象的长度:6";
String str2 = "Java" + "对象" + "的长度:" + 6;
System.out.println(str1 == str2);
}
}输出结果:public class StringJoinTest3 {
public static void main(String[] args) {
String str1 = "Java对象的长度:6";
String str2 = "Java" + "对象" + "的长度:" + "Java对象".length();
System.out.println(str1 == str2);
int len = 6;
String str3 = "Java" + "对象" + "的长度:" + len;
System.out.println(str1 == str3);
}
}输出结果为:false
public class StringJoinTest4 {
public static void main(String[] args) {
String str1 = "Java对象的长度:6";
final String s1 = "Java";
String str2 = s1 + "对象" + "的长度:6";
System.out.println(str1 == str2);
final int len = 6;
String str3 = "Java" + "对象" +"的长度:" + len;
System.out.println(str1 == str3);
}
}输出结果为:1、2 不可变的字符串
public class ImmutableString {
public static void main(String[] args) {
String str = "Hello"; //①
System.out.println(System.identityHashCode(str));
str = str + "Java对象"; //②
System.out.println(System.identityHashCode(str));
}
}输出结果为:174240671
public class MutableString {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("Hello");
System.out.println(str);
System.out.println(System.identityHashCode(str));
str.append("Java对象");
System.out.println(str);
System.out.println(System.identityHashCode(str));
}
}输出结果为:134683287
HelloJava对象
134683287
1、3 字符串比较
//String源代码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
} 从String类源代码来看,字符串底层实际上采用一个字符数组来保存该字符串所包含的字符序列,如果当前面字符串和被比较字符串底层的字符数组所包含的字符序列完全相同,程序通过equals()方法判断两个字符串是否相等就会返回true。public class StringCompare {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("def");
String s3 = new String("abc");
if ( s1.compareTo(s3) == 0 ) {
System.out.println("s1和s3包含的字符序列相同");
}
if( s1.compareTo(s2) < 0 ) {
System.out.println("s1小于s2");
}
System.out.println("s1和s3包含的字符序列相同:" + s1.equals(s3));
System.out.println("s1和s3包含的字符序列相同:" + (s1 == s3));
}
}输出结果为:s1小于s2
s1和s3包含的字符序列相同:true
s1和s3包含的字符序列相同:false
261




被折叠的 条评论
为什么被折叠?



