0. "==" 和 equals区别
Object类中的equals方法和“==”是一样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址。而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,他们比较的是值是不是相等
//“==”对于基本数据类型,判断两个变量的值是否相等。/“equal”不能用于基本数据类型
1、为什么要重写ToString?
所有的对象都会有这个方法【继承Object】,如下默认情况下:getName+@+hashCode的16进制
//java.lang.Object
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
?正常情况下:我们需要将对象按照字符串的方式输出出来,也就是说,需要知道这个对象的各个变量的值。所以需要进行toString()重写
@Data 注解会生成如下的结果
public String toString() {
return "Person(name=" + getName() + ", age=" + getAge() + ")";
}
Person
@Data
@AllArgsConstructor
public class Person {
String name;
Integer age;
}
Solution
public class Solution {
public static void main(String[] args) {
Person person = new Person("luoyu", 12);
System.out.println(person);
System.out.println(JSON.toJSONString(person));
String s = "{\"age\":12,\"name\":\"luoyu\"}";
Person parseObject = JSON.parseObject(s, new TypeReference<Person>() {
});
System.out.println(parseObject.getAge());
}
}
?输出结果
Person(name=luoyu, age=12) {"age":12,"name":"luoyu"} 12
//特殊说明:使用JSON可以直接对对象进行序列化和反序列化?
?2.?Java中的Collection有两类,一类是List,一类是Set
equals和HashCode深入理解以及Hash算法原理_K_天道酬勤-CSDN博客_hashcode算法原理
List内的元素是有次序的,元素可以重复。Set元素无序,但元素不可重复?
Set里面的判断重复,使用了Hash原理
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,再这个区间里调用equeals方法。【特别注意】这里需要注意的是:当俩个对象的hashCode值相同的时候,Hashset会将对象保存在同一个位置,但是他们equals返回false,所以实际上这个位置采用链式结构来保存多个对象。
?
?
package com.luoyu.json;
/**
* @author :luoyu
* @version :1.0
* @date : 2022/2/26 1:53 上午
* @description
*/
public class RectObject {
public int x;
public int y;
public RectObject(int x,int y){
this.x = x;
this.y = y;
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
final RectObject other = (RectObject)obj;
if(x != other.x){
return false;
}
if(y != other.y){
return false;
}
return true;
}
}
package com.luoyu.json;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* @author :luoyu
* @version :1.0
* @date : 2022/2/25 4:51 下午
* @description
*/
public class Main {
public static void main(String[] args) {
HashSet<RectObject> set = new HashSet<RectObject>();
RectObject r1 = new RectObject(3,3);
RectObject r2 = new RectObject(5,5);
RectObject r3 = new RectObject(3,3);
set.add(r1);
set.add(r2);
set.add(r3);
set.add(r1);
System.out.println("size:"+set.size());
}
}
我们向HashSet中存入到了四个对象,打印set集合的大小,结果是多少呢? 运行结果:size:2 为什么会是2呢?这个很简单了吧,因为我们重写了RectObject类的hashCode方法,只要RectObject对象的x,y属性值相等那么他的hashCode值也是相等的,所以先比较hashCode的值,r1和r2对象的x,y属性值不等,所以他们的hashCode不相同的,所以r2对象可以放进去,但是r3对象的x,y属性值和r1对象的属性值相同的,所以hashCode是相等的,这时候在比较r1和r3的equals方法,因为他么两的x,y值是相等的,所以r1,r3对象是相等的,所以r3不能放进去了,同样最后再添加一个r1也是没有没有添加进去的,所以set集合中只有一个r1和r2这两个对象
下面我们把RectObject对象中的hashCode方法注释,即不重写Object对象中的hashCode方法,在运行一下代码: 运行结果:size:3 这个结果也是很简单的,首先判断r1对象和r2对象的hashCode,因为Object中的hashCode方法返回的是对象本地内存地址的换算结果,不同的实例对象的hashCode是不相同的,同样因为r3和r1的hashCode也是不相等的,但是r1==r1的,所以最后set集合中只有r1,r2,r3这三个对象,所以大小是3 ?
下面我们把RectObject对象中的equals方法中的内容注释,直接返回false,不注释hashCode方法,运行一下代码: 运行结果:size:3 这个结果就有点意外了,我们来分析一下: 首先r1和r2的对象比较hashCode,不相等,所以r2放进set中,再来看一下r3,比较r1和r3的hashCode方法,是相等的,然后比较他们两的equals方法,因为equals方法始终返回false,所以r1和r3也是不相等的。 r1和r1的hashCode以及Equals都是相同的。所以是3.
|