Java中容易迷糊的String
1 "=="与"equals"
"=="这种比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量, 它们所引用同一个String对象(即指向同一块内存堆),则"=="比较的结果是true。 用Object对象的equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。
两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较, 也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。
2 String作为基础类型或者String对象
public class Str {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = s2;
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
System.out.println(s2 == s3); // true
System.out.println(s2.equals(s3)); //true
}
}
String a = "abc", 可能创建一个或者不创建对象,如果"abc"这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象("abc"),然后a指向这个内存地址,无论以后用这种方式创建多少个值为"abc"的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝, Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。把String作为一个基本类型来使用的,因此s1所引用的对象是属于String缓冲池内的。
String c = new String("abc"),把String作为一个对象来使用的,因此s2所引用的对象不属于String缓冲池内的,即它是独立的。通过new关键字,虚拟机会为此创建一个新的String对象,即为它分配了一块新的内存堆。至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象, 它的value是"abc"。同时如果这个字符串再java String池里不存在,会在java常量池里创建这个String对象"abc"。
String s3 = s2;// 即把s2的引用赋值给了s3,所以s3所引用的对象其实就是s2所引用的对象。
在java编译好的class文件中,constant pool是一个由数组组成的表,用来存储程序中的各种常量,程序执行时,constant pool会存储在method area中。
String类型更多理解请访问http://blog.csdn.net/wangdong20/article/details/8566217