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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑子 中级黑马   /  2014-8-27 10:15  /  1276 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小黑子 于 2014-8-27 16:34 编辑

书上说:
              ”==“判定两个字符串是否是同一实例,即它们在内存中的存储空间是否相同。
然后我就写了个小程序实验一下,运行结果如图所示。
我有四个问题:
1、String s1 = "aabb";  其中s是一个引用变量,这没问题吧?
    既然是引用 System.out.println(s1); 输出结果不是地址,而是s1中的值呢?
    同样是引用,数组 int[] arr = {1,2,3};  System.out.println(arr); 打印结果就是地址!
2、  s1 与 s2 、 sa 、 sb 的内存地址怎么会是相同的呢?
假设 s1 指向的地址是 0xa4c3
那s1之后,每创建一个String变量,都要检查内容是否与s1相同吗?相同的话再把 0xa4c3 给这个新建立的变量??
3、我很纳闷
System.out.println(s1==s2); 打印的是true
System.out.println("s1 == s2 : "+s1==s2);怎么会打印的是false呢?
4、我更纳闷的是 System.out.println("s1 == s2 : "+s1==s2); 的打印结果是     false
                                                                                                          而不是     s1 == s2 : false
这是见鬼了么?

  1. class StringTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s1 = "aabb";
  6.                 String s2 = "aabb";

  7.                 System.out.println(s1==s2);
  8.                
  9.                 System.out.println("s1 == s2 : "+s1==s2);

  10.                 boolean bn = new AAA().cp(s1);
  11.                 System.out.println("类AAA中,s1 == sa : "+bn);

  12.                 System.out.println("函数BBB中,s1 == sb : "+BBB(s1));
  13.         }
  14.         static boolean BBB(String s1)
  15.         {
  16.                 String sb = "aabb";
  17.                 return sb == s1;
  18.         }
  19. }
  20. class AAA
  21. {
  22.         public boolean cp(String s1)
  23.         {
  24.                 String sa = "aabb";
  25.                 return sa == s1;
  26.         }
  27. }
复制代码







4.png (106.4 KB, 下载次数: 10)

4.png

评分

参与人数 1技术分 +1 收起 理由
天黑偷牛 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
本帖最后由 笑脸迷人 于 2014-8-27 12:47 编辑

1、String s1 = "aabb";  其中s1是一个引用变量,这没问题!问题出在 System.out.println(s1);这句话上,这是调用系统输出流的println的函数,这个函数对传入进去的参数自动调用其toString方法,其实完整的打印就是 System.out.println(s1.toString());String类的toString方法复写了Object类的toString方法,所以返回值是s1所指向的内存地址值存储的String对象;而数组这类对象却是没有复写toString方法,所以调用的是Object类的方法,打印的就是数组的内存地址了
2、String类型以及int类型(数值范围为-128~127)所创建的对象都放置在常量池,创建新String对象先会去常量池找的~
3、System.out.println(s1==s2); 比较的是s1和s2的内存地址,当然是一样的当然是true了
4、System.out.println("s1 == s2 : "+s1==s2):比较的是"s1==s2"+s1和s2的内存地址(+是字符串连接符,s1先和“s1==s2”连接了后再和s2比较),这两个内存地址当然不一样了~(注意运算符的比较顺序);System.out.println("s1 == s2 : "+(s1==s2));这样就是true了



回复 使用道具 举报
toString啊toString,常量池啊常量池
回复 使用道具 举报
笑脸迷人 发表于 2014-8-27 12:45
1、String s1 = "aabb";  其中s1是一个引用变量,这没问题!问题出在 System.out.println(s1);这句话上,这 ...

哦,谢谢,1,看明白了,4我也解决了。
2、中的 数值范围为-128~127是什么意思?
    是只把值在-128~127之间的数放在里常量池里边么?
回复 使用道具 举报
小黑子 发表于 2014-8-27 15:42
哦,谢谢,1,看明白了,4我也解决了。
2、中的 数值范围为-128~127是什么意思?
    是只把值在-128~127 ...

这是享元模式:将很多经常出现的小对象封装成一个大对象来看待
java默认int值在-128~127的小对象是经常出现的,而且以后也会经常使用,那么为了以后不需要建立对象就能使用这些数据,就将这些放在常量池中(常量池相当于一个大数组,每一个进入常量池的常量都有角标的~),以后调用也方便,String类也是一样的道理
回复 使用道具 举报
笑脸迷人 发表于 2014-8-27 15:52
这是享元模式:将很多经常出现的小对象封装成一个大对象来看待
java默认int值在-128~127的小对象是经常出 ...

嗯,谢谢啦。
回复 使用道具 举报
第一个问题呢,我想说有些知识就像学习1+1=2一样,你记住就好。对于最后那个问题,加个括号就好了,"s1 == s2 : "+(s1==s2)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马