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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© boboyuwu 高级黑马   /  2016-2-9 22:28  /  621 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class StringDemo_01
{
        public static void main(String []args) {
        String str1="wu";
                String str2="bo";
        String str3=str1+str2;
                String str4="wubo";
                System.out.println(str3);
                //为什么str3==str4   值是false??
                //提出问题: 打印str3的hashCode 值等于3660715 然后打印str4的hashCode 值也等于
                //660715,那么高潮来了,这个str3 的值是一个地址  ,str4的值也是一个地址,2个变量的地址
                //值相等为什么==结果是false 求大牛解答.
        }
}

6 个回复

倒序浏览
因为两者比较的是具体的对象吧,地址值相等的原因是当对内存中已经存在了同样的对象时,就不会再重新创建新的对象,只是把地址值引用了
回复 使用道具 举报
一个变量str3 内存分配地址 一个变量str4 内存也分配地址
==比较的是地址 难道还能是true??

而且str3 和str4 指向的都是字符池里的wubo  所以hashcode值一样
回复 使用道具 举报
本帖最后由 zmhlnrs 于 2016-2-12 12:03 编辑

内存中是有堆栈的  str3 和str4 的内存地址不一样
内存中还有一片区域叫字符创常量池   他们的值是保存在字符串常量池里,新建一个变量后会在堆栈中给出对应的地址值,==比较的是地址值,所以==为false,而给他们赋值的时候就会去字符串常量池里面去找,如果有就不创建,如果没有就新创建出这个值放在里面,如果你用的equals那么他们的值为true。

评分

参与人数 1黑马币 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
== 比较的是地址值,二者的地址值是不一样的

评分

参与人数 1黑马币 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
两个不同的变量 地址值不同
回复 使用道具 举报
为什么hashCode值相等而两个字符串变量不相等,其实并不能简单地把hashCode值看做变量地址,因为你查看底层代码可以发现,String类重写了hashCode方法.而返回的值确只与String的内容有关。
  1.   public int hashCode() {
  2.         //hash默认初始化为0
  3.         int h = hash;
  4.        //value可以看做String.toCharArray拆成的字符数组
  5.         if (h == 0 && value.length > 0) {
  6.             char val[] = value;
  7.           //哈希码计算过程
  8.             for (int i = 0; i < value.length; i++) {
  9.                 h = 31 * h + val[i];
  10.             }
  11.             hash = h;
  12.         }
  13.         return h;
  14.     }
复制代码

假设         String s1="abc";
               String s2="ab";
               String s3="c";
               String s4=s2+s3;
h=(97*31+98)*31+99
你会发现s1.hashCode()会与s4hashCode()相等都为96354,但是s1并不等于s4,因为他们内存地址不等
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马