当我有空的时候,我会密切关注读者的一举一动,不让他们的任何问题帮助他们成长,虽然这不是我应该做的我最好,但我真的很喜欢和他们交流的感觉。毕竟,我可以帮助一个人。也许我的一个小小的举动,就能让他们的成长过程迈出一大步——请给我一个骄傲的机会。有一次,我在“石器时代”组发现了一个有趣的问题:“Howtocomparetwoarraysforequalityandhowtodetectmismatches?”严格来说,这是两个问题,一是比较数组是否相等,二是如果数组不相等,是哪些元素导致的。01.比较数组是否相等,可以使用Arrays.equals()方法比较两个数组是否相等。数组可以是基本数据类型、引用数据类型和泛型类型。我们先以字符串为例。String[]str1={"沉","莫","王","二"};String[]str2={"沉","莫","王","二"};String[]str3={"沉","莫","王","三"};现在,让我们比较一下:str1是否等于str2,str1是否等于str3。(虽然不用代码对比也能猜出答案,请假装配合)String[]str1={"Shen","Mo","Wang","Two"};String[]str2={"Shen"","墨","王","二"};String[]str3={"申","墨","王","三"};System.out.println(Arrays.equals(str1,str2));System.out.println(Arrays.equals(str1,str3));程序输出如下:truefalse很好,正好符合我们的预期。另外,我们还可以判断指定的是否两个数组中的范围相等通过以下方法:booleanequals(Object[]a,intaFromIndex,intaToIndex,Object[]b,intbFromIndex,intbToIndex)比较str1和str3中的前三个元素是否相等:System.out.println(Arrays.equals(str1,0,3,str3,0,3));程序的输出如下:true现在,让我们定义一个类Writer,它有两个字段:int类型的年龄,和String类型的名称,并重写equals()和hashCode()方法。publicclassWriter{privateintage;privateStringname;@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Writerwriter=(Writer)o;returnage==writer.age&&Objects.equals(name,writer.name);}@OverridepublicinthashCode(){returnObjects.hash(age,name);}publicWriter(intage,Stringname){this.age=age;this.name=name;}//getter/setter}创建3种Writer类型的数组:Writer[]writer1={newWriter(18,"SilenceKing2"),newWriter(16,"SilenceKing3")};Writer[]writer2={newWriter(18,"沉默之王2"),newWriter(16,"沉默之王3")};Writer[]writer3={newWriter(18,"沉默之王1"),newWriter(16,"沉默之王3"))};比较一下:writer1是否等于writer2,writer1是否等于writer3。System.out.println(Arrays.equals(writer1,writer2));System.out.println(Arrays.equals(writer1,writer3));程序的输出看起来像这样:truefalse答案完全符合预期,因为我们重写了equals()方法——如果年龄和名字相等,则表示两个Writer对象相等。如果我们不重写这个方法,此时我们可以使用Comparator比较器。Comparator
