本帖最后由 王广亚 于 2013-9-4 11:21 编辑
想知道字符串的地址是不是这个字符串的哈希值?如果是的话请看下面视频中毕老师讲的。问题中有点自己的推理,有点长,请耐心看。
先做个验证:只要String s1=new String("abc");这样创建的字符串对象都是开辟了新的空间。String s2="abc";String s3="abc";只要前面有了s2,s3就不会开辟新的空间。
- <P>package toString;</P>
- <P>public class Xiangdeng {</P>
- <P> public static void main(String[] args) {
- String a1="abc";
- String a2="abc";
- String a3=new String("abc");
- String a4=new String("abc");
- System.out.println((a1==a2)+"..."+(a1.equals(a2))+"..."+(a1==a3)+"..."+(a1.equals(a3))+"..."+(a3==a4)+"..."+(a3.equals(a4)));</P>
- <P> }</P>
- <P>}
- </P>
复制代码 接下来才是正题:
- <P>package exception;
- import java.util.*;
- public class HasCodeTest
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- HashSet hs = new HashSet();
- hs.add(new Person1("a1",11));
- hs.add(new Person1("a2",12));//new Person("a2","12");当创建这个对象时要调用Person的构造函数,(请顺着我的思路转到构造方法的代码)
- hs.add(new Person1("a3",13));
- hs.add(new Person1("a2",12));//我的思路是从此处开始(请顺着思路走):因为是HashSet集合,这个集合里的值是不能重复的,当添加新的对象时会调用hashCode先判断这个对象的哈希值,哈希值一样再调用equals比较内容</P>
- <P> //两个结果都通过了是,就说明集合了已经有了这个元素,就不再往里添加。默认的hashCode判断的是对象的哈希值,equals判断的是地址值。所以要覆写他们。
- //(接下面话题)此处也相当于String name=“a2”;这样创建的字符串对象吧。既然上面添加的new Person1("a2",12));对象和这个是一样的说明他们是同一个地址值</P>
- <P> //(请再跳到下面的hashCode方法)</P>
- <P>Iterator it = hs.iterator();
- while(it.hasNext())
- {
- Person1 p = (Person1)it.next();
- sop(p.getName()+"::"+p.getAge());
- }
- }
- }
- class Person1
- {
- private String name;
- private int age;
- Person1(String name,int age)//(接上面的据需说)把值传过来后相当于:String name=“a2”;(这写字符串这块,age于此问题无关就不说了),而不是String name=new String("a2");</P>
- <P> //(请再转到上面的集合添加了第二个a2处——hs.add(new Person1("a2",12))
- {
- this.name = name;
- this.age = age;
- }
- public int hashCode()
- {
- System.out.println(this.name+"....hashCode");
- return name.hashCode()+age*37;// 因为上面的字符串创建方法就不能判断name.hashCode()返回的值是相同的了。(因为我问的第一个问题是“字符串的地址是不是这个字符串的哈希值”</P>
- <P> //当然这些话题都是在这个问题的结论成立的基础上)。那么,我如果把hashSet集合添加第二个hs.add(new Person1("a2",12));时改为</P>
- <P> //hs.add(new Person1(new String("a2"),12));这样添加的话,是不是在判断name.hashCode()时他们就不是同一个值了,那么就会把这个new String("a2"),12));对象</P>
- <P> //也添 加进hashSet集合了?,按这个逻辑推理应该是,对吧。但是运行时却不是这样的结果,他并没有添加进去,求解释。。。。。。。。。。。。。?</P>
- <P> //随便提醒一下此处的name.hashCode()的hashCode是字符串覆写Object类后的字符串特有的方法,并没有他自己调用他自己。
- }
- public boolean equals(Object obj)
- {
- if(!(obj instanceof Person1))
- return false;
- Person1 p = (Person1)obj;
- System.out.println(this.name+"...equals.."+p.name);
- return this.name.equals(p.name) && this.age == p.age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
- </P>
复制代码 |