首页 > 代码库 > Java中容易迷糊的String

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"),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为"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所引用的对象。

String类型更多理解请访问http://blog.csdn.net/wangdong20/article/details/8566217

Java中容易迷糊的String