精华内容
下载资源
问答
  • 比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON...

    废话少说,直接入题。

    在面向对象语言中,经常会比较两个对象是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map、List互相嵌套成的复杂数据结构。

    比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。

    小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON字符串,用字符串来描述数据结构,避免实现Serializable接口。将对象序列化成字符串后,比较是否相等就相对简单了。

    小菜提供的正是比较两个JSON串是否相等的方法,并不是说JSON串完全一样才叫相等,对于List(或数组)结构而言,如果仅仅是元素排列顺序不同,也是相等的。

    为了保证方法的准确性,请传入标准的JSON串,也就是说key也要加双引号。用过js的童鞋可能会被误导:我在js中写的JSON,key可以不加双引号啊!实际上,你在js中写的是js语言的Object,并不是JSON,只不过它的语法和JSON非常像而已,JSON仅仅是一种字符串规范,而且真正的JSON只有一种,那就是key加了双引号的!

    另外,此方法不依赖任何第三方包。

    最后声明,由于数据结构复杂,小菜对这个方法不可能进行遍历性测试,所以这个方法的准确性有待考究,请谨慎使用!如有问题,欢迎反馈!

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 importjava.util.regex.Matcher;2 importjava.util.regex.Pattern;3

    4 /**

    5 * 比较两个json串是否相同6 *@paramj1 第一个json串(json串中不能有换行)7 *@paramj2 第二个json串(json串中不能有换行)8 *@return布尔型比较结果9 */

    10 public static booleanjsonEquals(String j1,String j2){11

    12 //将json中表示list的[]替换成{}。思想:只保留层次结构,不区分类型13 //这样直接替换,可能会导致某些value中的符号也被替换,但是不影响结果,因为j1、j2的变化是相对的

    14 j1 = j1.replaceAll("\[", "{");15 j1 = j1.replaceAll("]", "}");16 j2 = j2.replaceAll("\[", "{");17 j2 = j2.replaceAll("]", "}");18 //将json中,字符串型的value中的{},字符替换掉,防止干扰(并没有去除key中的,因为不可能存在那样的变量名)19 //未转义regex:(?<=:")(([^"]*{[^"]*)|([^"]*}[^"]*)|([^"]*,[^"]*))(?=")

    20 Pattern pattern = Pattern.compile("(?<=:")(([^"]*\{[^"]*)|([^"]*\}[^"]*)|([^"]*,[^"]*))(?=")");21 j1 =cleanStr4Special(j1, pattern.matcher(j1));22 j2 =cleanStr4Special(j2, pattern.matcher(j2));23 //转义字符串value中的空格24 //未转义regex:"[^",]*?s+?[^",]*?"

    25 pattern = Pattern.compile(""[^",]*?\s+?[^",]*?"");26 j1 =cleanStr4Space(j1, pattern.matcher(j1));27 j2 =cleanStr4Space(j2, pattern.matcher(j2));28 //现在可以安全的全局性去掉空格

    29 j1 = j1.replaceAll(" ", "");30 j2 = j2.replaceAll(" ", "");31 //调用递归方法

    32 returncompareAtom(j1,j2);33 }34

    35 /**

    36 * 比较字符串核心递归方法37 *@paramj138 *@paramj239 *@return

    40 */

    41 private static booleancompareAtom(String j1,String j2){42

    43 if(!j1.equals("?:"?"")){44 //取出最深层原子

    45 String a1 = j1.split("\{",-1)[j1.split("\{",-1).length-1].split("}",-1)[0];46 String a2 = j2.split("\{",-1)[j2.split("\{",-1).length-1].split("}",-1)[0];47 String j2_ =j2;48 String a2_ =a2;49 //转换成原子项

    50 String i1[] = a1.split(",");51 //在同级原子中寻找相同的原子

    52 while(!a2.startsWith(",") &&

    53 !a2.endsWith(",") &&

    54 a2.indexOf(":,")<0 &&

    55 a2.indexOf(",,")<0

    56 ){57 //遍历消除

    58 for(String s : i1){59 a2_ = a2_.replace(s,"");60 }61 //此时a2_剩下的全是逗号,如果长度正好等于i1的长度-1,说明相等

    62 if(a2_.length() == i1.length-1){63 //相等则从j1、j2中消除,消除不能简单的替换,因为其他位置可能有相同的结构,必须从当前位置上消除

    64 int index = 0;65 index = j1.lastIndexOf("{" + a1 + "}");66 j1 = j1.substring(0, index)+j1.substring(index).replace("{" + a1 + "}", "?:"?"");67 index = j2.lastIndexOf("{" + a2 + "}");68 j2 = j2.substring(0, index)+j2.substring(index).replace("{" + a2 + "}", "?:"?"");69 //递归

    70 returncompareAtom(j1, j2);71 }else{72 //寻找下一个同级原子

    73 j2_ = j2_.replace("{" + a2 + "}", "");74 a2 = j2_.split("\{",-1)[j2_.split("\{",-1).length-1].split("}",-1)[0];75 a2_ =a2;76 }77 }78 return false;79 }else{80 //比较是否相同

    81 returnj1.equals(j2);82 }83 }84

    85 /**

    86 * json字符串特殊字符清理辅助方法87 *@paramj 需要清理的json字符串88 *@parammatcher 正则表达式匹配对象89 *@return净化的json串90 */

    91 private staticString cleanStr4Special(String j,Matcher matcher){92 String group = "";93 String groupNew = "";94 while(matcher.find()){95 group =matcher.group();96 groupNew = group.replaceAll("\{", "A");97 groupNew = groupNew.replaceAll("}", "B");98 groupNew = groupNew.replaceAll(",", "C");99 j =j.replace(group, groupNew);100 }101 returnj;102 }103

    104 /**

    105 * json串字符串类型的value中的空格清理辅助方法106 *@paramj 需要清理的json字符串107 *@parammatcher 正则表达式匹配对象108 *@return净化的json串109 */

    110 private staticString cleanStr4Space(String j,Matcher matcher){111 String group = "";112 String groupNew = "";113 while(matcher.find()){114 group =matcher.group();115 groupNew = group.replaceAll(" ", "S");116 j =j.replace(group, groupNew);117 }118 returnj;119 }

    View Code

    展开全文
  • 1、equals的作用及与==的区别equals被用来判断两个对象是否相等。equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等。equals方法默认等同于“==”。Object类中的equals方法定义为判断两...

    f04252194a2cb6c4131e85f94ae3bf26.png

    1、equals的作用及与==的区别

    equals被用来判断两个对象是否相等。

    equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等。

    equals方法默认等同于“==”。

    Object类中的equals方法定义为判断两个对象的地址是否相等(可以理解成是否是同一个对象),地址相等则认为是对象相等。这也就意味着,我们新建的所有类如果没有复写equals方法,那么判断两个对象是否相等时就等同于“==”,也就是两个对象的地址是否相等。

    Object类中equals的方法实现如下:public boolean equals(Object obj) {

    return (this == obj);

    }

    但在我们的实际开发中,通常会认为两个对象的内容相等时,则两个对象相等,equals返回true。对象内容不同,则返回false。

    所以可以总结为两种情况

    1、类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较,即两个对象的地址是否相等。地址相等,返回true,地址不相等,返回false。

    2、类复写equals方法,比较两个对象时,则走复写之后的判断方式。通常,我们会将equals复写成:当两个对象内容相同时,则equals返回true,内容不同时,返回false。

    举个例子:public class EqualTest {

    public static void main(String[] args) {

    Person p1 = new Person(10,"张三");

    Person p2 = new Person(10,"张三");

    System.out.println(p1.equals(p2));

    }

    }

    class Person{

    int age;

    String name;

    public Person(int age, String name) {

    super();

    this.age = age;

    this.name = name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    }

    Person未复写equals方法,则默认使用了Object中的equals,即为两个对象(p1和p2)的内存地址判断,p1和p2很明显内存地址不同,所以输出结果很明显为false。

    如果我们复写equals方法呢?我们认为名字和年龄一样的就是同一个人,那么p1和p2都表示10岁的张三,这两个对象应该是相等的。复写的equals方法如下:@Override

    public boolean equals(Object obj) {

    if (this == obj)

    return true;

    if (obj == null)

    return false;

    if (getClass() != obj.getClass())

    return false;

    Person other = (Person) obj;

    if (age != other.age)

    return false;

    if (name == null) {

    if (other.name != null)

    return false;

    } else if (!name.equals(other.name))

    return false;

    return true;

    }

    同样的,执行上述用例,得到的结果是true。

    BTW:如果equals方法返回true,那么==是否也是true?

    不一定是true。equals返回true有两种可能,一种是两个对象地址相同,一种是两个对象内容相同。当内容相同时,地址可能不同,所以==比较的结果可能为false。

    我们把main方法加上对==的判断,如下:public static void main(String[] args) {

    Person p1 = new Person(10,"张三");

    Person p2 = new Person(10,"张三");

    System.out.println(p1.equals(p2));

    System.out.println(p1 == p2);

    }

    输出结果很明显 p1==p2的结果是false。

    展开全文
  • java比较两个bean对象是否相同,可以有以下几种方法重新实现hashcode()方法和equals()方法两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。在equals ()方法中比较指定的字段...

    java 中比较两个bean对象是否相同,可以有以下几种方法

    重新实现hashcode()方法和equals()方法

    两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。

    在equals ()方法中比较指定的字段

    使用 org.apache.commons的工具类重写重新实现hashcode()方法和equals()方法

    xxx部分是将指定的字段不用比较

    @Override

    public boolean equals(Object obj) {

    return EqualsBuilder.reflectionEquals(this, obj,"xxxx");

    }

    @Override

    public int hashCode() {

    return HashCodeBuilder.reflectionHashCode(this,,"xxxx");

    }

    实现Comparable接口中的compareTo()方法

    返回值为 1,0.-1:

    @Override

    public int compareTo(Book o) {

    //先按 id 再按价格 最后按书名排序 升序

    int result = this.bookId - o.bookId;

    if(result == 0){

    result =this.bookPrice - o.bookPrice;

    }

    if(result == 0){

    result = this.bookName.compareTo(o.bookName);

    }

    return result;

    }

    实现Comparator接口

    java 1.8之前

    Collections.sort(books,new Comparator() {

    @Override

    public int compare(Book o1, Book o2) {

    return o1.getBookPrice() - o2.getBookPrice();

    }

    });

    java 1.8之后

    Collections.sort(books,(Book a, Book b) -> { return a.getBookPrice()-b.getBookPrice(); });

    或者可以简单的写为

    Collections.sort(books,(Book a, Book b) -> a.getBookPrice()-b.getBookPrice());

    甚至,我们可以不使用Collections.sort:

    books.sort((Book a, Book b) -> a.getBookPrice()-b.getBookPrice() );

    展开全文
  • 比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON...

    废话少说,直接入题。

    在面向对象语言中,经常会比较两个对象是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map、List互相嵌套成的复杂数据结构。

    比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。

    小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON字符串,用字符串来描述数据结构,避免实现Serializable接口。将对象序列化成字符串后,比较是否相等就相对简单了。

    小菜提供的正是比较两个JSON串是否相等的方法,并不是说JSON串完全一样才叫相等,对于List(或数组)结构而言,如果仅仅是元素排列顺序不同,也是相等的。

    为了保证方法的准确性,请传入标准的JSON串,也就是说key也要加双引号。用过js的童鞋可能会被误导:我在js中写的JSON,key可以不加双引号啊!实际上,你在js中写的是js语言的Object,并不是JSON,只不过它的语法和JSON非常像而已,JSON仅仅是一种字符串规范,而且真正的JSON只有一种,那就是key加了双引号的!

    另外,此方法不依赖任何第三方包。

    最后声明,由于数据结构复杂,小菜对这个方法不可能进行遍历性测试,所以这个方法的准确性有待考究,请谨慎使用!如有问题,欢迎反馈!

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 importjava.util.regex.Matcher;2 importjava.util.regex.Pattern;3

    4 /**

    5 * 比较两个json串是否相同6 *@paramj1 第一个json串(json串中不能有换行)7 *@paramj2 第二个json串(json串中不能有换行)8 *@return布尔型比较结果9 */

    10 public static booleanjsonEquals(String j1,String j2){11

    12 //将json中表示list的[]替换成{}。思想:只保留层次结构,不区分类型13 //这样直接替换,可能会导致某些value中的符号也被替换,但是不影响结果,因为j1、j2的变化是相对的

    14 j1 = j1.replaceAll("\\[", "{");15 j1 = j1.replaceAll("]", "}");16 j2 = j2.replaceAll("\\[", "{");17 j2 = j2.replaceAll("]", "}");18 //将json中,字符串型的value中的{},字符替换掉,防止干扰(并没有去除key中的,因为不可能存在那样的变量名)19 //未转义regex:(?<=:")(([^"]*\{[^"]*)|([^"]*\}[^"]*)|([^"]*,[^"]*))(?=")

    20 Pattern pattern = Pattern.compile("(?<=:\")(([^\"]*\\{[^\"]*)|([^\"]*\\}[^\"]*)|([^\"]*,[^\"]*))(?=\")");21 j1 =cleanStr4Special(j1, pattern.matcher(j1));22 j2 =cleanStr4Special(j2, pattern.matcher(j2));23 //转义字符串value中的空格24 //未转义regex:"[^",]*?\s+?[^",]*?"

    25 pattern = Pattern.compile("\"[^\",]*?\\s+?[^\",]*?\"");26 j1 =cleanStr4Space(j1, pattern.matcher(j1));27 j2 =cleanStr4Space(j2, pattern.matcher(j2));28 //现在可以安全的全局性去掉空格

    29 j1 = j1.replaceAll(" ", "");30 j2 = j2.replaceAll(" ", "");31 //调用递归方法

    32 returncompareAtom(j1,j2);33 }34

    35 /**

    36 * 比较字符串核心递归方法37 *@paramj138 *@paramj239 *@return

    40 */

    41 private static booleancompareAtom(String j1,String j2){42

    43 if(!j1.equals("?:\"?\"")){44 //取出最深层原子

    45 String a1 = j1.split("\\{",-1)[j1.split("\\{",-1).length-1].split("}",-1)[0];46 String a2 = j2.split("\\{",-1)[j2.split("\\{",-1).length-1].split("}",-1)[0];47 String j2_ =j2;48 String a2_ =a2;49 //转换成原子项

    50 String i1[] = a1.split(",");51 //在同级原子中寻找相同的原子

    52 while(!a2.startsWith(",") &&

    53 !a2.endsWith(",") &&

    54 a2.indexOf(":,")<0 &&

    55 a2.indexOf(",,")<0

    56 ){57 //遍历消除

    58 for(String s : i1){59 a2_ = a2_.replace(s,"");60 }61 //此时a2_剩下的全是逗号,如果长度正好等于i1的长度-1,说明相等

    62 if(a2_.length() == i1.length-1){63 //相等则从j1、j2中消除,消除不能简单的替换,因为其他位置可能有相同的结构,必须从当前位置上消除

    64 int index = 0;65 index = j1.lastIndexOf("{" + a1 + "}");66 j1 = j1.substring(0, index)+j1.substring(index).replace("{" + a1 + "}", "?:\"?\"");67 index = j2.lastIndexOf("{" + a2 + "}");68 j2 = j2.substring(0, index)+j2.substring(index).replace("{" + a2 + "}", "?:\"?\"");69 //递归

    70 returncompareAtom(j1, j2);71 }else{72 //寻找下一个同级原子

    73 j2_ = j2_.replace("{" + a2 + "}", "");74 a2 = j2_.split("\\{",-1)[j2_.split("\\{",-1).length-1].split("}",-1)[0];75 a2_ =a2;76 }77 }78 return false;79 }else{80 //比较是否相同

    81 returnj1.equals(j2);82 }83 }84

    85 /**

    86 * json字符串特殊字符清理辅助方法87 *@paramj 需要清理的json字符串88 *@parammatcher 正则表达式匹配对象89 *@return净化的json串90 */

    91 private staticString cleanStr4Special(String j,Matcher matcher){92 String group = "";93 String groupNew = "";94 while(matcher.find()){95 group =matcher.group();96 groupNew = group.replaceAll("\\{", "A");97 groupNew = groupNew.replaceAll("}", "B");98 groupNew = groupNew.replaceAll(",", "C");99 j =j.replace(group, groupNew);100 }101 returnj;102 }103

    104 /**

    105 * json串字符串类型的value中的空格清理辅助方法106 *@paramj 需要清理的json字符串107 *@parammatcher 正则表达式匹配对象108 *@return净化的json串109 */

    110 private staticString cleanStr4Space(String j,Matcher matcher){111 String group = "";112 String groupNew = "";113 while(matcher.find()){114 group =matcher.group();115 groupNew = group.replaceAll(" ", "S");116 j =j.replace(group, groupNew);117 }118 returnj;119 }

    View Code

    展开全文
  • 比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON...
  • /*** 比较对象是否发生了改变* @param obj1* @param obj2* @return*/public static boolean contrastObj(Object obj1, Object obj2) {boolean isEquals = true;if (obj1 instanceof objec && obj2 ...
  • 展开全部首先先确定到底是要判断62616964757a686964616fe59b9ee7ad9431333363373764是同一个对象还是两个对象里面的内容一毛一样,若是要判断是否是同一个对象直接用“==”就好了,若是判断内容是否一毛一样...
  • 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2,obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,...
  • 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2,obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,...
  • Object类中的equals方法用于...然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等...
  • a == b //false如果Long的值在[-127,128]之间,用“==”判断是否相等是没问题的,如果不在这个区间,是不能用“==”的,原因如下源码解释:public static Long valueOf(long l) {final int off...
  • java判断两个对象是否相等的方法发布时间:2020-06-25 13:48:38来源:亿速云阅读:197作者:...java中可以使用equals()方法判断两个对象是否相等,equals() 方法用于将字符串与指定的对象比较。如果给定对象与字符...
  • java 比较两个对象是否相等 java语言中,比较两个Object是否相等,需重写equal()方法和hasCode()方法 public class UserHistory implements Serializable{ private static final long ...
  • 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2,obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,...
  • 废话少说,直接入题。... 比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。 小菜的思路是可以把对象序列化,由于这些对象均是用来表达数...
  • 1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象(java中如果两对象...)2.obj1.equals(Object obj2),用来判断两个对象是否相等。(如果两个变量引用的是两个不同地址...
  • 通常我们会比较基本类型、引用类型、数组等是否相等,很少会 比较对象的Class实例对象是否相等,那么class实例对象如何比较相等呢? 可以使用“==”比较是否相等 obj.getClass() == ClassEqualTest.class 可以...
  • java比较两个对象,可以通过重写equals()实现。 1.比较对象时, ==比较的是地址,而equals()比较的是对象内容 2.重写equals()方法必须重写hashCode() 示例代码如下: Person.java 可以自动生成get()、set()、...
  • —-最起码得保证里面的每一项都相同才算相等。—-boolsequenceEqual=oldList.SequenceEqual(newList);—-假设二个list值都是一样的,怎么应怎么做?高人给个示例啊—-取两者差集,看差集是否为0个ListoldList=new...
  • Object类中的equals方法用于检测一个对象是否等于另外一个对象。...例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状...
  • java比较两个对象是否相等 java比较两个对象,可以通过重写equals()实现。 1.比较对象时, ==比较的是地址,而equals()比较的是对象内容 2.重写equals()方法必须重写hashCode() 示例代码如下: Person.java 可以...
  • java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的。 例如: Person person1 =new Person("张三"); Person person2 =new Person("张三"); boolean falg = person1.equals(person1); falg 的...
  • 我需要比较两个对象是否相同。如果它们相同,则需要将它们添加到另一个列表(commonList)中,如果它们恰好是不同的,则需要将它们添加到另一个列表(differentList)中。我写了以下代码: ClassA clsA = null; public ...
  • java中可以使用equals()方法判断两个对象是否相等,equals() 方法用于将字符串与指定的对象比较。如果给定对象与字符串相等,则返回 true;否则返回 false。该方法的源码如下:public boolean equals(Object obj) {...
  • 一、需求需要对比这2个json字符串是否完全一样(不用管顺序)1 String dui = "{\"adGroupVO\":{\"campaignId\":\"CAMPAIGN201912101000004559\",\"adGroupChannel\":{\"channelType\":\"SMS\",\"resourceCode\":\...
  • 展开全部首先先确定到底是要判断是同一636f70793231313335323631343130323136353331333363373764个对象还是两个对象里面的内容一毛一样,若是要判断是否是同一个对象直接用“==”就好了,若是判断内容是否一毛一样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,612
精华内容 1,444
关键字:

java比较对象是否相等

java 订阅