==,equals和hashCode
1.==和equals
==
作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象
基本数据类型==比较的是值
引用数据类型==比较的是内存地址
equals
作用是判断两个对象是否相等。有两种使用情况:
- 类没有覆盖equals()方法。通过equals()比较该类的两个对象时,等价于通过“==”比较两个对象
- 类覆盖了equals()方法。一般,需要覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(认为这两个对象相等)
总结: - String中的equals方法是被重写过的,因为Object的equals方法是比较的对象的内存地址,而String的方法比较的是对象的值
- 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋值给当前引用,如果没有就在常量池中重新创建一个String对象
2.hashCode和equals
1.hashCode()
作用是获取哈希码,也称为散列码;实际上返回一个int整数。哈希码的作用是确定这个对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,意味着Java中任何类都包含hashCode()函数
2.为什么要有hashCode?
hashSet如何检查重复?
把对象加入hashSet时,hashSet先计算对象的hashCode值来判断对象加入的位置,同时与该位置其他已经加入的对象的hashCode值比较,如果没有相符的hashCode,那么会假设对象没有重复出现。如果发现相同hashCode值的对象,这时会调用equals()方法来检查hashCode相等的对象是否真的相同。如果两者相同,那么不会让其加入,如果不同,则会重新散列到其他位置。大大减少了equals的次数,大大提高了执行速度。
hashCode()和equals()的相关规定
- 如果两个对象相等,则hashCode一定也是相同的
- 如果两个对象相等,对两个对象分别调用equals方法都会返回true
- 如果两个对象有相同的hashCode值,它们不一定是相等的
- 如果equals方法被覆盖过,那么hashCode方法也必须要被覆盖
(这是为什么要重写equals时也要重写hashCode) - hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何也不会相等(即使这两个对象指向相同的数据)
序列化
如果序列化中有些字段不想进行序列化,使用transient关键字进行修饰。
这个关键字的作用:阻止实例中的那些用这个关键字修饰的变量序列化;
当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法
常用的获取键盘输入
Scanner
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
sc.close();
BufferedReader
BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));
String str=bu.readLine();
BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
可以通过构造函数指定缓冲区大小也可以使用默认大小。