A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yy505032788 中级黑马   /  2014-12-13 12:23  /  1160 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题1:String s1 = new String("abc");
            String s2 = "abc";两者有区别么?
            两句语句是同样的效果,但方式不同;
           s1在内存中创建了两个对象,在堆内存中new出了一个对象,又因为字符串是存放在常量池中的,new出来的对象里面只是存了一个方法区地址,然后在常量池中创建了一个“abc”的对象,new出来的对象指向了常量池中“abc”的地址,然后又把new出来对象的地址给s1。
           s2只是在常量池中创建了一个对象,然后直接把方法区中的常量池中的地址给s2。

问题2:String s = "hello";
             s += "world";
            System.out.println(s);请问打印s的值是什么?
            这个问题的难点在于字符串是常量,不能改变,但对象的引用地址值是可以改变的,会打印出helloworld。

问题3:String s1 = "hello";
            String s2 = "world";
            String s3 = "hello"+"world";
            String s4 = "helloworld";
            String s5 = s1+s2;
            提问:(==比较的是地址值,equals比较的是内容,因为String类重写了了此方法)
                       System.out.println(s3==s4); //true       因为字符串是常量,JVM在编译的时候会自动处理,s3和s4指向的是同一个地址
                       System.out.println(s3.equals(s4));//true       equals      在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容
                       System.out.println(s4==s5);//false           因为JVM在处理程序的时候,s5是由两个变量得来的,会重新开辟一个地址
                       System.out.println(s4.equals(s5));//true   equals      在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容

1 个回复

倒序浏览
12.13,养肥再看~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马