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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶顺达 中级黑马   /  2015-7-17 00:05  /  600 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串中对象比较的总结
        在字符串中:
                String s1 = new String ("abc");
                String s2 ="abc";
                String s3 ="abc";
                System.out.println(s2);
                System.out.println(s3);
                System.out.println(s1);
                System.out.println(s1 == s2);
                System.out.println(s2 == s3);
               
                运行结果如下
                        abc
                        abc
                        abc
                        false
                        true
                       
                或许结果中会有点疑惑,
               
                疑惑1:为什么s1打印的不是s1的地址值
                                因为父类中打印地址值采用的是toString()方法,
                String s1 = new String ("abc");
                        此方法中s1是String类型,在建立对象时本身有一个toString()方法
                        将Object()中的方法复写了,所以不能打印出地址值。
        s1 == s2 ,s2 == s3在运算中是比较了s1和s2 的地址值。
                为什么s1与s2的不同,但是s2与s3的由相同呢?
                        因为在给字符串赋值时,方法区内部有个叫字符串常量池的地区,
                        对象在赋值时会先在常量池中找是否有abc这个值,当s1发现常量池中没有abc
                        于是在常量池中新建了一个abc并把字符串abc的地址给了s1建的对象,而s1拿了对象的地址值
                当s2被赋值为abc时,同样也会去常量池中找字符串abc,发现找到了abc就不用重新建立字符串,
                        直接获取字符串的地址值。
                同理s3 也拿到字符串的地址值
                所以s1和s2的地址值不同,s2和s3的地址值相同       

6 个回复

倒序浏览
顶一下顶一下顶一下顶一下
回复 使用道具 举报
hmilys9265 发表于 2015-7-17 00:13
顶一下顶一下顶一下顶一下

好呀好呀
回复 使用道具 举报
楼主六的一比!!!!
回复 使用道具 举报
晚风吹舟行 发表于 2015-7-17 00:21
楼主六的一比!!!!

:funk::call:
:funk::call:
:funk::call:
:funk::call:
:funk::call:
:funk::call:
回复 使用道具 举报
赞一个……
回复 使用道具 举报

哈哈 好呀 好呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马