java中hashcode方法
classA(){Stringname="abc";A(Stringname){thisname=name;}publicinthashcode(){returnname...
class A(){
String name="abc";
A(String name){
this name=name;
}
public int hashcode(){
return name.hashCode();
}
public static void main(String[] args){
A a=new A(“abcd”);
A a1=new A("abcd");
A a2=new A();
A a3=newA();
}
}
我的问题是a与a1的哈希值同不同,a2与a3的哈希值同不同,求解释清楚,还有这两个abcd是不是在main方法的栈真中,是不是同一个对象?这两个abc是不是在堆区的不同对象中,求大神告诉我,等不到答案,我不睡了。。。。。还有最后一个,默认的哈希值是不是就是地址而已,它是怎么算的,jvm自己算的吗?????详细回答的我给50 展开
String name="abc";
A(String name){
this name=name;
}
public int hashcode(){
return name.hashCode();
}
public static void main(String[] args){
A a=new A(“abcd”);
A a1=new A("abcd");
A a2=new A();
A a3=newA();
}
}
我的问题是a与a1的哈希值同不同,a2与a3的哈希值同不同,求解释清楚,还有这两个abcd是不是在main方法的栈真中,是不是同一个对象?这两个abc是不是在堆区的不同对象中,求大神告诉我,等不到答案,我不睡了。。。。。还有最后一个,默认的哈希值是不是就是地址而已,它是怎么算的,jvm自己算的吗?????详细回答的我给50 展开
2个回答
2018-07-28 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
从一般角度来看,Equality 是不错的,但是 hash code 更则具技巧性。如果我们在 hash code上多下点功夫,我们就能了解到 hash code 就是用在细微处去提升性能的。
大部分的数据结构使用equals去检查是否他们包含一个元素。例如:
List<String> list = Arrays.asList("a", "b", "c");
boolean contains = list.contains("b");
这个变量 contains 是true。因为他们是相等的,虽然b的实例化(instance)虽然不完全一样(再说一次,忽略String interning)。
将传递给 contains 的实例与每个元素进行比较很浪费时间。还好,整个这类数据结构使用了一种更高效的方法。它不会将请求的实例与每个元素比较,而是使用捷径,找到可能与之相等的实例,然后只比较这几项。
这个捷径就是哈希码——从对象计算出来的一个能代表该对象的整数值。与哈希码相同的实例不必相等,但相等的实例一定有相同的哈希码。(或者说应该有,我们稍后会对这个问题进行简单讨论)。这类的数据结构常常使用这种技术命名,在名称中加入 Hash 以便识别,其中最具代表性的就是 HashMap。
大部分的数据结构使用equals去检查是否他们包含一个元素。例如:
List<String> list = Arrays.asList("a", "b", "c");
boolean contains = list.contains("b");
这个变量 contains 是true。因为他们是相等的,虽然b的实例化(instance)虽然不完全一样(再说一次,忽略String interning)。
将传递给 contains 的实例与每个元素进行比较很浪费时间。还好,整个这类数据结构使用了一种更高效的方法。它不会将请求的实例与每个元素比较,而是使用捷径,找到可能与之相等的实例,然后只比较这几项。
这个捷径就是哈希码——从对象计算出来的一个能代表该对象的整数值。与哈希码相同的实例不必相等,但相等的实例一定有相同的哈希码。(或者说应该有,我们稍后会对这个问题进行简单讨论)。这类的数据结构常常使用这种技术命名,在名称中加入 Hash 以便识别,其中最具代表性的就是 HashMap。
展开全部
后面带不带参数,区别就是调用不同的构造方法,对不对name重新进行赋值
public class A {
String name="abc";
A(String name){
this.name=name;
}
public A() {
// TODO Auto-generated constructor stub
}
public int getHashcode(){
return name.hashCode();
}
public static void main(String[] args) {
A a=new A("abcd");
System.out.println(a.getHashcode());
A a1=new A("abcd");
System.out.println(a1.getHashcode());
A a2=new A();
System.out.println(a2.getHashcode());
A a3=new A();
System.out.println(a3.getHashcode());
}
}
打印输出结果:
2987074
2987074
96354
96354
更多追问追答
追问
这个两个abc地址相同吗?两个abcd地址相同吗?为什么?
追答
不是同一个对象了,你再次new了一个,那么这个name的地址就和上一个对象的地址不一样
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询