Object 类概述:
1.Object 类是所有 Java 类的根父类.
2. 如果在类的声明中未使用 extends 关键字指明其父类,
则默认父类为 java.lang.Object 类.
Object 类主要结构:
操作符 ==
1. 基本类型比较值: 只要两个变量的值相等, 即为 true.
2. 引用类型比较引用(是否指向同一个对象): 只有指向同一个对象时,
操作符 == 才返回 true.
3. 用操作符 == 进行比较时, 符号两边的数据类型必须兼容(可自动转换的
基本数据类型除外), 否则编译出错.
equals()格式: obj1.equals(obj2)
1. 所有类都继承了 Object, 也就获得了 equals()方法, 还可以重写.
2. 只能比较引用类型, 其作用与 "==" 相同, 比较是否指向同一个对象.
3. 特例: 当用 equals()方法进行比较时, 对类 File, String, Date 及包装类
(Wrapper Class)来说, 是比较类型及内容而不考虑引用的是否是同一个对象.
原因: 在这些类中重写了 Object 类的 equals()方法.
4. 当自定义使用 equals()时, 可以重写. 用于比较两个对象的 "内容" 是否都相等.
重写 equals()方法的原则:
1. 对称性: 如果 x.equals(y)返回是 "true", 那么 y.equals(x)也应该返回是 "true".
自反性: x.equals(x)必须返回是 "true".
2. 传递性: 如果 x.equals(y)返回是 "true", 而且 y.equals(z)返回是 "true",
那么 z.equals(x)也应该返回是 "true" .
3. 一致性: 如果 x.equals(y)返回是 "true", 只要 x 和 y 内容一直不变, 不管你
重复 x.equals(y)多少次, 返回都是 "true".
4. 任何情况下, x.equals(null), 永远返回是 "false".
5. 任何情况下, x.equals(和 x 不同类型的对象)永远返回是 "false".
操作符 == 和 equals()对比:
1. 操作符 == 既可以比较基本类型也可以比较引用类型.
对于基本类型就是比较值, 对于引用类型就是比较内存地址.
2.equals()是属于 java.lang.Object 类里面的方法,
如果该方法没有被重写过默认也是操作符 ==.
3. 具体要看自定义类里有没有重写 Object 的 equals 方法来判断.
4. 通常情况下, 重写 equals 方法, 会比较类中的相应属性是否都相等.
toString()方法概述:
1.toString()方法在 Object 类中定义, 其返回值是 String 类型, 返回类名和它的引用地址.
2. 在进行 String 与其它类型数据的连接操作时, 自动调用 toString()方法
Date now=new Date();
System.out.println("now="+now); 相当于
System.out.println("now="+now.toString();
3. 可以根据需要在用户自定义类型中重写 toString()方法
如 String 类重写了 toString()方法, 返回字符串的值.
s1="hello";
System.out.printIn(s 1); 相当于 System.out.println(s1.toString());
4. 基本类型数据转换为 String 类型时, 调用了对应包装类的 toString()方法
int a=10; System.out.println("a="+a);
注意事项:
1.public String toString()返回该对象的字符串表示.
2. 通常 toString 方法会返回一个 "以文本方式表示" 此对象的字符串,
结果应是一个简明但易于读懂的信息表达式, 建议所有子类都重写 (覆盖) 此方法.
3.Object 类的 toString 方法返回一个字符串, 该字符串由类名(对象是该类的一个实例),
at 标记符 "@" 和此对象哈希码的无符号十六进制表示组成.
即 getClass().getName() + '@' + Integer.toHexString(hashCode())
4. 对象的字符串表示: 通过一个字符串, 反应对象的有用信息,
覆盖 toString 的内容返回对象的成员变量的值.
- public class ToString {
- public static void main(String[] args) {
- Object o = new Object();
- String s = o.toString();
- System.out.println(s); //java.lang.Object @ 4554617c
- Imitate imitate = new Imitate();
- //String s1 = imitate.imitateToString(o);
- System.out.println(imitate.toString());
- // 输出一个对象, 就是输出的是这个对象的 toString 方法返回的字符串
- System.out.println(imitate);
- //jvm 会默认调用对象的 toString 方法和字符串拼接
- System.out.println("wangdao" + imitate);
- }
- }
- class Imitate {
- int i = 10;
- int j = 20;
- public String imitateToString(Object o) {
- return o.getClass().getName() + '@' + Integer.toHexString(o.hashCode());
- }
- @Override
- public String toString() {
- return "Imitate{" +
- "i=" + i +
- ", j=" + j +
- '}';
- }
- }
hashCode()概述:
1.public int hashCode()返回该对象的哈希码值.
2. 支持此方法是为了提高哈希表 (例如 java.util.Hashtable 提供的哈希表) 的性能.
3. 由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数.
4. 对象映射为整数, 对象的内部地址转换成一个整数来实现的.
hashcode 的常规协定:
1. 在 Java 应用程序执行期间, 在对同一对象多次调用 hashCode 方法时, 必须一致地返回相同的整数,
前提是将对象进行 equals 比较时所用的信息没有被修改.
从某一应用程序的一次执行到同一应用程序的另一次执行, 该整数无需保持一致.
2. 如果根据 equals(Object)方法, 两个对象是相等的,
那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果.
3. 如果根据 equals(java.lang.Object)方法, 两个对象不相等,
那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果.
- public class HashCodeDemo {
- public static void main(String[] args) {
- HashCodeDemo hashCodeDemo = new HashCodeDemo();
- //System.out.println(hashCodeDemo.hashCode());
- // 创建一个对象
- HashCodeDemo hashCodeDemo1 = new HashCodeDemo();
- // 指示 其他某个对象(eaquals 方法接收参数)
- // 是否与 此对象(调用 equals 方法的对象)"相等".
- hashCodeDemo.equals(hashCodeDemo1);
- A a = new A(1);
- A a1 = new A(1);
- System.out.println(a.hashCode());
- System.out.println(a1.hashCode());
- System.out.println("==================");
- // 第一次判断之后
- a1.i = 2;
- System.out.println(a.hashCode());
- System.out.println(a1.hashCode());
- }
- }
- class A {
- int i;
- int j;
- double k;
- public A(int i) {
- this.i = i;
- }
- @Override
- public int hashCode() {
- int result;
- long temp;
- result = i;
- result = 31 * result + j;
- temp = Double.doubleToLongBits(k);
- result = 31 * result + (int) (temp ^ (temp>>> 32));
- return result;
- }
- }
来源: http://www.bubuko.com/infodetail-3373477.html