Java之==和equals的区别、equals和hashcode
2021-06-09 18:04
标签:获取对象 对象 public style 项目 类型 his char 内存 如此老生常谈的问题,竟然还是很深奥。 今天之前 我还是只知道==只能判断值是否相等 equals判断字符串、对象是否相等 那么我们来看打脸时刻 返回的是true啊 同学们 字符串是可以用==号判等的。 但是我在项目里 登录模块 我输入的账号密码 要和数据库拿出来的账号密码进行一个对比。这时候就不能用== 必须用equals方法了。 来看一下为什么。 下面是string的equals源码(jdk8) 先比较是否为同一对象,再每个字符的进行比较。 那么==是怎么进行比较的呢。 在JVM有个方法区 里面有运行时常量池。 这里面储存了各种基础数据类型、字符串常量等,我们假设有两个int值进行 而且两个都是100.==比较是相等的。这是因为对于100这个数我们开辟了内存 值为100 让a指向这个内存,b同样指向这个内存。 上面两个字符串(注意是字符串常量 不能是new String这样是字符串对象)。方法区开辟了“aaaa”的内存,a和b都指向它。所以地址一样 ==返回true; 我们在Java中有一个规律:对象相等 hashcode值肯定相等。两对象hashcode值相等 不一样两对象相等。 所以当我们在创建新的类时 要重写二者方法。如果要重写equals必须要重写hashcode因为这样提升效率。 hashcode是我们jvm的底层运算,速度很快,所以一般判等先判hashcode 在调用equals方法 对于我们的接口 Set区别对象是不是唯一的标准是,两个对象hashcode是不是一样,再判定两个对象是否equals; Map 是先根据Key值的hashcode分配和获取对象保存数组下标的,然后再根据equals区分唯一值(详见下面的map分析) Java之==和equals的区别、equals和hashcode 标签:获取对象 对象 public style 项目 类型 his char 内存 原文地址:https://www.cnblogs.com/cckong/p/14489214.htmlpublic boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
上一篇:java 面向对象编程
下一篇:python-tips
文章标题:Java之==和equals的区别、equals和hashcode
文章链接:http://soscw.com/index.php/essay/92785.html