java中users[i].name.equals(name))怎么理解
前言这一篇文章是对java的Object的方法的equals的描述,也包括对重写方法写的一些理解。
一、Object类的equals方法?
1. Object是什么?
首先要明确Object类中有什么,它是什么?
Object类在《java核心技术1》中是这样描述的是Java中所有类的始祖,每个类都是尤其扩展出来的。所以我们创建的类应该都会有应该有这样的表达:
public class Classname extends Object{ }
登录后复制
但其实上公司早已经考虑过这个问题了,所以每个类都是默认继承Object的。所以直接就可以就可以引用Object类中的方法,编译器是不会报错的。
2. equals方法的解析
1、 为什么需要这个方法?
因为传统的逻辑判断“ == ”,是去判断数据在内存堆中地址,基础数据在堆中内存是相同的,所以 “ ==”最后是对数据的值来进行比较的。
2、 equals方法在书上的解析
在《Java核心技术1》中对equals方法的描述是用于检查一个对象是否等于另一个对象,这两个对象是否具有相同的引用。然后接下来我会使用代码,以及代码运行的结果对这个方法进行讲解。
/*
我们创造一个Employee类来验证——一个对象是否等于另一个对象,这两个对象是否具有相同的引用
*/
public class Employee extends Person{
private int salary;
private int worktime;
public Employee(String name, String sex,int salary, int worktime) {
this.name = name;
this.sex = sex;
this.salary = salary;
this.worktime = worktime;
}
/*
现在我们目标是使用equals方法
具体实现是:
1.首先先使用Employee类来进行信息的比对
2.再使用Student类和Employee类进行比对
*/
//step1
Employee employee1 = new Employee("啊狗","男",2000,12);
Employee employee2 = new Employee("啊狗","男",2000,12);
//现在我们创造两个数据皆相同的对象我们现在进行equals方法的判断
System.out.println(employee1.equals(employee2));
登录后复制

终端会给我们输出false,我们可以开调试来看看为什么会输出flase。我们可以看到employee1和employee2地址会不同,这就能解释到《Java核心技术1》对Object类中的equals方法是对比一个对象是否等于另外一个对象。这不仅仅局限于数据的相同,也需要去判断数据存放的地址是否相同。
3. 对上公司的Object类方法的理解
深入的我们可以去看看上公司如何写Object类的equals方法。
public boolean equals(Object obj)
return (this == obj);
}
登录后复制
这里的equals方法接入的是Object类, (this == obj)这句话的意思是当前对象和传入obj地址是否相等,因为 “==”的作用就是比较两者地址是否相同。
4. 对上公司对重写的equals方法的一些理解
那么接下来我们研究方向就是如何让两个数据相同的对象相同,这一点由为之重要。上公司已经非常贴心地为我们重写好了这个方法,我们可以一起看看这个方法地实现。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return salary == employee.salary && worktime == employee.worktime;
}
登录后复制
if (this == o) return true;
登录后复制
这句话是自反性的体现,先使用this调用当前对象,然后再将对象o放入判断语句中,也就是书中所说的对于非空引用x,x.equals(x)会返回true。
if (o == null || getClass() != o.getClass()) return false;
登录后复制
这句话是将调用getClass()方法,因为两个不同的类不可以做比较,会直接返回false的。具体我们可以利用我们的Student类和Employee类来做比较。
Employee employee1 = new Employee("啊狗","男",2000,12);
Student student = new Student("啊猫","男",18,"智能科学");
//2.再使用Student类和Employee类进行比对
System.out.println(employee1.equals(student));
登录后复制
无论从直观上还是客观上来看,我们都能会觉得终端会输出false,事实如此,确实最后终端是输出了false。
Employee employee = (Employee) o;
登录后复制
这句话又是什么意思呢?这个涉及一个强制类型转化的知识,因为所有类都默认继承或者间接继承Object类,因为前面已经使用getClass方法来判断类是否相同,所以这里不需要进行instanceof来判断两个类是否相同,如果两个类不同的话,直接运行java会抛出ClassExceptionError错误。这一步就是让传入的值获得自己私有得信息,这一个点是涉及多态的缺点的缘由。
return salary == employee.salary && worktime == employee.worktime;
登录后复制
这一句话我们可以通过调试来看看到底相比较的是什么?我们可以看到是将当前对象的salary和worktime的值来和传入对象的salary和worktime的值比较,这样就可以免除“==”比较地址而造成最后的结果和主观感觉不一样的预期。
总结
这篇文章是我第一次写博客,文章结合《java核心技术1》对Object类中的equals方法的一点理解的,本来想写Object类常用API的一个汇总,但是鉴于能力的不足,所以最后仅仅只是写了equals方法的理解。这一次编写博客的过程中,我明显发现自己对很多不理解的地方,本文如果有讲解错误,或者讲解不当的地方,希望大家能指正我的错误,感谢!
绛旓細鍙互銆俿[i]鏄瓧绗︿覆鐨勭i涓瓧绗︼紝n鏄瓧绗︿覆鐨勯暱搴︼紝^琛ㄧず姹傚箓銆傜┖瀛楃涓茬殑鍝堝笇鍊间负0銆傚彉閲廼鐢ㄦ潵瀛樻斁瀛楃涓叉暟缁勪笅鏍囷紝鍒欏簲濉叆s[i]
绛旓細in.close(); return ; } ArrayList<HashMap.Entry<String, String>> list; HashMap<String, String> map = new HashMap<>(); //String [][]contact = new String [n][2]; for(int i = 0; i < n; i ++) { String []...
绛旓細boolean flag1 = true;boolean flag2 = true;boolean flag3 = true; int i=0;Account[] users=new Account[50]; //users灞閮ㄥ彉閲忓彲浠ュ湪鏁翠釜main()鏂规硶涓繘琛岃闂畐hile(flag1) { while(flag2) { System.out.println("璇疯緭鍏ヤ綘瑕佸垱寤鐨璐︽埛鍚:"); //Account[] users=new Accoun...
绛旓細1銆佸鏋滀綘鎯冲湪Java涓瀹氫箟涓涓嚱鏁扮殑璇濓紝棣栧厛鎴戜滑闇瑕佸畾涔変竴涓嚱鏁板悕锛屽嵆锛歩mport java.util.name;name=new name(system.in);2銆佸鏋滄兂瑕佷粠閿洏杈撳叆涓涓瓧绗︿覆鐨勮瘽锛屾垜浠彧闇瑕佸湪Java閲岄潰杈撳叆锛歴tring n=name.next();3銆佷絾鏄湪杈撳叆瀛楃涓蹭箣鍓嶏紝鎴戜滑闇瑕佸厛瀹氫箟鏁板煎瀷锛屽鏋滄槸瀹氫箟鏁村瀷锛岄渶瑕佽緭鍏ワ細int...
绛旓細import java.util.Scanner;Scanner sc=new Scanner(System.in);//璁剧疆鎺у埗鍙拌緭鍏 int n=sc.nextInt();//杈撳叆涓涓暣鏁皀锛屽瓨鏀惧埌鍙橀噺n褰撲腑 double [][] arr=new double[n][2];for(int i=0;i<n;i++){ arr[i][0]=sc.nextDouble();//杈撳叆涓涓猟ouble arr[i][1]=sc.nextDouble();...
绛旓細package t2;import java.util.Scanner;public class test {public static void main(String[] args) {for(;;){Scanner input = new Scanner(System.in);System.out.println("璇疯緭鍏ュ鐢鐨鍒嗘暟锛");double score = input.nextDouble();int level1,level2;if(score>=90.0 && score<=100.0){ ...
绛旓細public static void main(String[] args) { Scanner input = new Scanner(System.in);System.out.print("please input a number:");int n = input.nextInt();int arr[][] = new int[n][n];System.out.println("please output:");for (int i = 0; i < n; i++){ for (int j...
绛旓細import java.util.Scanner;public class test { public static void main(String[] args) { Scanner sc = new Scanner(System.in);System.out.println("璇疯緭鍏ヨ缁熻鏁版嵁鐨涓暟锛宯=");int n = sc.nextInt();int sum_zero = 0;int sum_positive = 0;int sum_negative = 0;int temp = ...
绛旓細System.out.println("\n\n杈撳叆鐨瀛︾敓鐨勪俊鎭涓:\n");System.out.print("\t濮撳悕\t瀛﹀彿\t鐢佃瘽\n");for(int i=2; i<s.length;i++){ String[] arr = im.converString2Arr(s[i]);System.out.print("绗"+(i-1)+"涓:\t");im.printResult(arr);System.out.println();} } / 杈...
绛旓細public static void main(String[] args) { Scanner sc=new Scanner(System.in);List<String> li=new ArrayList<String>();System.out.println("杈撳叆涓涓暣鏁帮細");int n;n=sc.nextInt();System.out.println("杈撳叆"+n+"涓崟璇嶏細");for(int i=0;i<n;i++){ String word=sc.next();...