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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飘渺≮★耘 中级黑马   /  2014-5-25 08:58  /  1459 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args)
{
String s = new String(“abc”);//执行到这一行时,创建了几个对象?
    String s1 = “abc”;//执行到这一行时,创建了几个对象?
String s2 = new String(“abc”);//执行到这一行时,创建了几个对象?

System.out.println(s == s1);//输出结果是什么?
System.out.println(s == s2);//输出结果是什么?
System.out.println(s2 == s1);//输出结果是什么?
}

8 个回复

倒序浏览
2
3
5
不明白你想问什么
回复 使用道具 举报
false,他们是不同的对象
回复 使用道具 举报
  1. class HeiMa {
  2.        
  3. public static void main(String[] args){
  4.         String s = new String("abc");//创建了两个对象
  5.     String s1 = "abc";//创建了一个对象
  6.         String s2 = new String("abc");//有创建了两个对象

  7.         System.out.println(s == s1);//输出结果是false
  8.         System.out.println(s == s2);//输出结果是false
  9.         System.out.println(s2 == s1);//输出结果是false
  10.         }
  11. }
  12. /*
  13.         代码说明:
  14.         String s = new String("abc");(附图2)
  15.                 这一句中,创建了两个对象,一个对象是new出来的,存放在内存中的堆中,另外一个对象
  16.                 存放在常量池的常量区域中。
  17.         String s1 = "abc";(附图1)
  18.                 这一句中,创建了一个对象,直接存放在内存中的常量池中。
  19.         String s2 = new String("abc");
  20.                 这一句和第一句相同。
  21.         "==":表示地址值的比较,对于每次创建的对象,地址值一定不同,所以s和s2的地址值不同,
  22.         System.out.println(s == s2);输出是false
  23.         而存放在常量池中和通过new方法创建出来的对象的地址值也不同,所以其它输出语句的地址值也不同。

  24. */
复制代码

        其中代码中的附图1 和 附图2 存放在压缩包里,是String类字符串对象创建的图解,比较了new和直接赋值的区别。

String类图解.rar

18.14 KB, 下载次数: 198

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单和 给楼主解释下,你这个问题 有三个知识点需要知道:
1.  凡是new出来的东西,都是新建的意思,也就是不管以前有没有,都会在堆内存里重新创建一个 。
2.  String 创建的 不仅仅 在 堆内存里有,而且 会在  方法区的 常量池里创建,而且,栈内存和堆内存里面存放的
    都是内存地址值, 而在方法区里存放的是 具体对象。
3. ==  的 实际意义。  他比较的是比较的是一个对象在内存中的地址值, 你把 equals  换掉==试试。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一句是创建了一个对象,s指向这个对象。 第二句的s1与s同在栈内存中,s1的值等于abc,与s无关,没有创建对象。第三局话s2创建了对象,等于abc,第一个是false,第二个是false,第三个false

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果把开辟内存空间算作创建对象的话,那么String s = new String("abc");创建了2个对象,因为String类中有字符池的概念。即new String()创建一个对象,在池中添加字符串abc算作一个对象。
回复 使用道具 举报
hamiguadjs 发表于 2014-5-25 10:57
其中代码中的附图1 和 附图2 存放在压缩包里,是String类字符串对象创建的图解,比较了new和直接 ...

解释的好,我也收获了
回复 使用道具 举报
==只是一个指向嘛
按你的顺序依次、一共有:
2个对象
3个对象
5个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马