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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© twtzhongxin 中级黑马   /  2014-3-4 23:58  /  1067 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;

  2. public class EasyTest7 {
  3.         public static void main(String[] ags){
  4.                 String a=new String("abc");
  5.                 String b="abc";
  6.                 String c="abc";
  7.                 System.out.println(a==b);//false
  8.                 System.out.println(b==c);//true
  9.                 Integer i=1;
  10.                 Integer j=1;
  11.                 Integer k=new Integer(1);
  12.                 System.out.println(i==j);//true
  13.                 System.out.println(i==k);//false
  14.         }
  15. }
复制代码


为什么一个结果是true,一个结果是false?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
System.out.println(a==b);//false
System.out.println(b==c);//true
因为String在new的时候会在堆中申请新的地址,而直接赋值是直接从字符串池中获取相匹配的字符串,他们指向的内存地址是不相同的。

System.out.println(i==j);//true
System.out.println(i==k);//false
true就不用说了,k本身的值是一个地址值不是1。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
上面的这段代码:
               String a=new String("abc");
               String b="abc";
               String c="abc";
总共有两个字符串对象,a指向的是一个对象,b,c指向同一个对象,所以b==c。a和b指向不同的对象所以a!=b
上面的结果有:a==b:false
                     a==c:false
                     b==c:true
Iteger也类似。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Dora 发表于 2014-3-5 00:09
System.out.println(a==b);//false
System.out.println(b==c);//true
因为String在new的时候会在堆中申请新 ...

package com.itheima;

public class EasyTest7 {
        public static void main(String[] ags){
                Integer i=1;
                int j=1;
                Integer k=new Integer(1);
                System.out.println(i==j);//true
                System.out.println(k==j);//true
                System.out.println(i==k);//false

        }
}
我已经搞不懂了
回复 使用道具 举报
开始也搞不懂,在网上找了很多资料。总结如下,希望能帮到。
  1. public class TestDemo2 {
  2.         public static void main(String[] ags){
  3.                 String a=new String("abc");        //先看字符串池,发现池中没有相同值的字符串,然后在堆内存中创建一份,但是不会从堆中复制到池中,把它在堆内存中的地址赋给a
  4.                 String b="abc";        //比较字符串池发现没有相同字符串,则在字符串池中创建"abc",把它所在字符串池中的地址赋给b
  5.                 String c="abc";        //b和c指向同一个对象(字符串池地址)
  6.                 System.out.println(a==b);//false,地址值不同,打印false
  7.                 System.out.println(b==c);//true,地址值相同,打印true
  8.               
  9.                 Integer i1=1;
  10.                 Integer j1=1;        //i1和j1指向同一个对象
  11.                 Integer k1=new Integer(1);        //重新开辟一个堆内存地址
  12.                 System.out.println(i1==j1);//true,两个地址相同,打印true
  13.                 System.out.println(i1==k1);//false,两个地址不同,打印false
  14.             
  15.                 Integer i=1;        //引用数据类型,在堆内存中
  16.                 int j=1;        //基本数据类型,在栈内存中
  17.                 Integer k=new Integer(1);        //在堆内存中重新开辟内存
  18.                 System.out.println(i==j);//true,jdk1.5后自动拆箱、装箱,i和j比较,转换成同一类型(int型),它们值相等,所以打印true
  19.                 System.out.println(k==j);//true,也都转换成int型,值相同,打印true
  20.                 System.out.println(i==k);//false,两个引用数据类型,因为有一个是new出来的,所以地址不同,打印false               
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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