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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

                String a2="aa";
                String b2=new String("aa");
                sop(a2==b2);
                sop("aa"==b2);
                sop("aa"==a2);
说下运行结果,并说明为什么,我自己运行了,但是不知道原因,特别是最后两句
说下

3 个回复

倒序浏览
本帖最后由 xuxu5112 于 2015-10-2 10:57 编辑
  1. package com.xuchang.start;

  2. public class Tset {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 String a = "a";
  8.                 String b = "a";
  9.                 //先去JVM的常量池中寻找,如果有直接返回该对象的引用
  10.                 //如果没有则先创建对象再把它放到常量池中返回该引用
  11.                 System.out.println(a == b); //true
  12.                
  13.                 String c = "a" + "b";
  14.                 String d = "ab";
  15.                 //因为"a","b"都是常量字符串,所以 c在编译时就可以被确定了
  16.                 //相当于String c = "ab";
  17.                 System.out.println(c == d); //true
  18.                
  19.                 String e =  a + "b";
  20.                 //在编译时 a时变量不能确定所以会创建新的对象
  21.                 System.out.println(d == e);//false

  22.         }

  23. }
复制代码


所以
        String a2 = "aa";//创建"aa"并放入常量池中
                String b2 = new String("aa");//在堆中new一个对象b2 指向常量池中的"aa"
                System.out.println(a2 == b2);//a2指向常量池,b2指向堆显然是false
                System.out.println("aa" == b2);//同上false
                System.out.println("aa" == a2);//这两个指向同一个对象所以true
回复 使用道具 举报
                // String a2 = "aa"创建了一个对象,这个对象在方法区的常量池中,常量池中会为aa开辟一个空间并给一个地址值
                //并把地址值赋值给a2
                //如果常量池中有 那么就直接把这个地址给a2
                String a2 = "aa";
                // String b2 = new String("aa"); 创建了两个对象一个在方法区中的常量池中"aa" , 在堆内存中开辟一个空间,
                //并提供一个地址值然后将常量池中aa这个值复制一份在堆内存中,再将堆内存中"aa"地址值复制给b2
                String b2 = new String("aa");
                // 两个对象等于号所比较的是地址值
                System.out.println(a2 == b2);// flase b2是堆内存中的地址值,所以和a2不一样
                System.out.println("aa" == b2);// flase b2是堆内存中的地址值, 所以地址值和常量池中的aa地址不一样
                System.out.println("aa" == a2);// true a2本身拿的是常量池中的aa地址所以一样
回复 使用道具 举报
二楼正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马