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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾文泽 高级黑马   /  2013-1-29 12:11  /  2544 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-30 11:21 编辑

String str1="this is a question";
String str2="this is";
String str3=" a question";
String str4=str2+str3;
String str5="this is"+" a question";

System.out.println(str1==str5);   // 结果为 true
System.out.println(str1==str4);   //结果为false      

请高手解释一下这几句代码在内存中的占用问题,还有最后输出结果不一样又是为什么。?

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6

查看全部评分

9 个回复

倒序浏览
自己搜帖子吧,这样的问题太多了,建议去搜搜享元模式的用法
回复 使用道具 举报
最后那里用.equals判断就true了

System.out.println(str1.equals(str4));
回复 使用道具 举报
string str1 = "ABC";
string str2 = "sdf";
str1 == str2;
str1.equal(str2);
-----------------------------------------------
第一个比地址,第二个比里面的值。
我罗嗦一点

== 是比较两对象地址
equals 比的是内容 比内容的根据是比较两者hashCode() 那么lz首先要搞清楚hashcode是什么
equals方法的大致思路

Java code

boolean equals(Object obj){
    if(this == obj){
         ruturn true;
     }
     if(this instanceof obj){
          做个类型转换,在比较两者的hashcode
         相同 return true;
     }
      return false;
}
-----------------------------------------


lz可以拿这段代码试下就知道兄弟说的意思了
  1. public static void main(String[] args) {
  2.         String str1 = new String("abc");
  3.         String str2 = new String("abc");
  4.         
  5.         if (str1 == str2) {
  6.             System.out.println("true");
  7.         } else {
  8.             System.out.println("false");
  9.         }
  10.         
  11.         if (str1.equals(str2)) {
  12.             System.out.println("true");
  13.         } else {
  14.             System.out.println("false");
  15.         }
  16.     }
复制代码
------------------------

== 比较的是hashCode,即是内存的地址。后面的比较的是值,因为类String重写了这个方法。在Object中 这两个都是一样的,都是比较的hashCode.
楼主理解一下 什么情况下定义出来变量的值是放在栈中的常量池中的 什么情况下定义出来变量的值是放在堆空间中的 常量池与堆空间中的值相比较的时候 什么时候是用"==",什么时候用"equals" 这个问题就迎刃而解了
                               

评分

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

查看全部评分

回复 使用道具 举报
闵华勇 发表于 2013-1-29 12:48
string str1 = "ABC";
string str2 = "sdf";
str1 == str2;

hashcode 是内存地址? 完全错误的说的说法....
回复 使用道具 举报
赵文 发表于 2013-1-29 12:52
hashcode 是内存地址? 完全错误的说的说法....

两个对象值相同(x.equals(y) == true),则一定有相同的hash code。
以下是java语言的定义:
1) 对象相等则hashCode一定相等;
2) hashCode相等对象未必相等。
Object的hashCode()默认返回是内存地址
回复 使用道具 举报
闵华勇 发表于 2013-1-29 12:57
两个对象值相同(x.equals(y) == true),则一定有相同的hash code。
以下是java语言的定义:
1) 对象相等 ...

对象一定有内存地址,所以一定有哈希值,因为哈希值是根据地址生成的整数;
Object 的hashCode方法里面就一句返回语句  是 return 类名的 +@+对象内存地址值 , 所以肯定和内存地址值有关系的,
回复 使用道具 举报
jonn 高级黑马 2013-1-29 13:04:06
8#
闵华勇 发表于 2013-1-29 12:57
两个对象值相同(x.equals(y) == true),则一定有相同的hash code。
以下是java语言的定义:
1) 对象相等 ...

对,没错,对象引用的内存地址后十六进制无符号的才是hashcode,但完全有相同存在,即hashcode并不能代表对象所在了内存地址,我这写个方法即可证明
  1. public class HashCodeMeaning {
  2.     public static void main(String[] args) {
  3.         ArrayList list =  new ArrayList();
  4.         int numberExist=0;
  5.         
  6.         //证明hashcode的值不是内存地址
  7.       // 在这我产生了10000个对象,在内存中时不同的地址,实际上这10000个对象的hashcode是完全相同的
  8.         for (int i = 0; i < 10000; i++) {
  9.             Object obj=new Object();
  10.             if (list.contains(obj.toString())) {
  11.                 System.out.println(obj.toString() +"  exists in the list. "+ i);
  12.                 numberExist++;
  13.             }
  14.             else {
  15.                 list.add(obj.toString());
  16.             }
  17.         }   
  18.         System.out.println("repetition number:"+numberExist);
  19.         System.out.println("list size:"+list.size());
  20.     }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
在Java中,哈希码代表对象的特征。
例如对象 String str1 = “aa”, str1.hashCode= 3104
String str2 = “bb”, str2.hashCode= 3106
String str3 = “aa”, str3.hashCode= 3104
根据HashCode由此可得出str1!=str2,str1==str3
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
下面给出几个常用的哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
回复 使用道具 举报
字符串1和5是字符串拼接问题,相当于在同一个字符串上后面追加了长度,地址是同一个;1和4的就是str4属于在字符串池中两个不同的地址所以为false,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马