黑马程序员技术交流社区

标题: String str 与new String的疑问 [打印本页]

作者: 河边捉虾米    时间: 2016-9-15 17:08
标题: String str 与new String的疑问
package string;

/*
* String()方法重写
* */
public class String1 {
        public static void main(String[] args) {
                String str = "itcast";
                // String类重写了toString方法,在String类中ctrl+f可查看重写的方法
                System.out.println(str);
                // 常量池中又出现一个body的char类型的数组,str的地址改变了,现在指向常量池中的body所在地址
                // 但是在输出str时候,输出的还是字符串,因为String类重写了toString方法
                str = "body";
                System.out.println(str);
                // 结果为false,因为变量a,变量b存的都是指向常量池中不同字符串所在的地址,存的是地址,虽然打印的时候是字符窜,那是因为被toString了;
                String a = "d";
                String b = "c";
                if (a == b) {
                        System.out.println(true);
                } else {
                        System.out.println(false);
                }

                // 返回值为true,因为在方法区中先创造了一个字符串,地址假如为0x01,将地址赋予了引用变量a1;
                // 现在引用变量b1,在创建字符串"c"之前,会现在常量池中看看是否存在字符串"c",发现存在,那么就让b1指向原来a1所指向的地址;也就是说现在b1,a1都指向常池中存放"c"的地址
                String a1 = "c";
                String b1 = "c";
                if (a1 == b1) {
                        System.out.println(true);
                } else {
                        System.out.println(false);
                }
                // 以下是个人理解,还得请问大神,来看看是不是这样的!
                // 返回值为false,因为str1是常量池中字符串"ac"所在地址,地址为0x11;
                // 而str2是堆中所在地址,0x22;堆中的"ac",是从常量池是中复制过来的,相当于在常量池中创建以一个对象"ac",地址为0x33,
                // 然后复制到堆中,地址为0x22;所以堆中也有了新对象"";
                String str1 = "ac"; // 只在常量池创建了一个对象
                String str2 = new String("ac"); // 创建了两个对象,一个在常量池中,一个在堆中,并且地址不一样;
                if (str1 == str2) {
                        System.out.println(true);
                } else {
                        System.out.println(false);
                }
          
               
               
        }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2