Java-Object

涎涎原创约 1772 字大约 6 分钟...JavaJava

114-Java-Object.mdopen in new window

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

  • Object介绍及方法
    • Object类是所有类的超类, Object是Java语言中唯一一个没有父类的类。
    • 一个类可以不是Object类的直接子类,但一定是Object类的子类,Java中的每一个类都是从Object扩展来的。
    • 在Object类中定义的方法,在所有类中都可以使用。
    • public boolean equals(Object obj)
      • 比较两个对象引用的值是否相等(比较哈希地址)
    • public int hashCode()
      • 返回十进制整数,唯一标识一个对象
    • public String toString()
      • 返回 类名@hashcode
  • Object类常用方法
    • public boolean equals(Object obj): 比较两个对象引用的值是否相等(比较地址)。指出调用该方法的对象是否与obj对象相等。即地址是否相等。
    • public int hashCode():该方法返回对象的哈希码,哈希码是一个代表对象的十六进制整数,比作对象的身份证号。在程序运行期间,每次调用同一个对象的hashCode()返回的哈希码必定相同,但是多次执行同一个程序,程序的一次执行和下一次执行期间同一个对象的哈希码不一定相同。实际上默认的哈希码是将对象的内存地址通过某种转换得到的,所以不同对象会有不同的哈希码。
    • public String toString():返回 类名@hashcode ;事实上返回这样的字符串没有什么实际的意义。一般子类都会覆盖该方法,让它返回有意义的文本。
  • 通常,子类会覆盖equals( ),改变它的含义,所以有的类中equals( )是比较地址,有的类中该方法就不比较地址,具体的,就看子类新定义的该方法的规定。看看包装类中的equals()方法?
  • 在java中有个规定:如果equals( )返回两个对象是相等的,那这两个对象上调用hashCode( )返回的整数必须相等。否则在使用Hash类型集合时就会产生错误。
  • 所以在我们覆盖equals( )方法同时,还要记得覆盖hashCode( )方法。需要说明,如果equals( )返回两个对象不等,它们的hashCode( )也可以返回相同的整数。但是最好让它们的hashCode( )返回不同的整数,这有利于提高Hash类型集合的性能。
  • 重写equals方法时,一定要重写hashcode()方法吗?
    • 先说说hashcode的调用的条件。 如果你想往map里面放一个类作为map的键值,这个类又是你自己设计的,或者这个类不是你写的但是你修改了这个类的equals方法,这个时候,你就要注意重写hashcode方法。 这样 当你往map里放值得时候,系统会调用这个对象的.hashcode()方法来生成相应的hash值,来映射相应的对象。 如果同一个类的两个对象的属性值相等,那么他们的hashcode一定相等吗 这个要看你具体如何实现你的hashcode,如果你希望他们的值一样hashcode也一样,你就可以这样实现。 但是hashcode的实现,一般要满足几个特征,比如 自反性,传递性什么的。

示例代码1

package Object类介绍;//包名都是小写,这里是特殊情况
/**
* Object类是所有类的超类, Object是Java语言中唯一一个没有父类的类。
一个类可以不是Object类的直接子类,但一定是Object类的子类,Java中的每一个类都是从Object扩展来的。
在Object类中定义的方法,在所有类中都可以使用。
public boolean equals(Object obj) 
比较两个对象引用的值是否相等(比较哈希地址)
public int hashCode()
返回十进制整数,唯一标识一个对象
public String toString()
返回  类名@hashcode

* <p>Title: TestObject</p>  
* <p>Description: </p>  
* @author xianxian 
* @date 2019年7月10日
 */
public class TestObject {

	/**
	 * 1.直接打印输出对象,默读调用toString()方法,
	 * 输出地址,如果想改变,那么可以重写该方法
	 * <p>Title: main</p>  
	 * <p>Description: </p>  
	 * @param args
	 */
	public static void main(String[] args) {
		String s = new String("123");
		//String类重写Object类的toString()方法,返回对象的字符序列值
		/**
		 * 1.如果String对象实例化后没有正式的字符序列形式,
		 * 那么调用toString(),输出空字符序列,就是空,什么都没有
		 * 2.如果String对象为null,那么调用toString(),会抛出空指针异常
		 */
		System.out.println(s.toString());//123
		
		Object o1 = new Object();
		/**
		 * toString():返回对象的字符串表示形式。
		 * 格式:完整的类名+@+对象内存地址的十六进制表示形式
		 */
		System.out.println("o1.toString():" + o1.toString());//o1.toString():java.lang.Object@6d06d69c
		//Integer类重写Object类的toString()方法,返回整数对象的值
		Integer i = new Integer(123);
		System.out.println("Integer 对象的toString():" + i.toString());//Integer 对象的toString():123
//		System.out.println(new Integer("").toString());//不要这样试探,无法把空串变成整数,会抛出异常
		
		Student stu = new Student();
		stu.setId(1234);
		/**
		 * 1.我们自已定义的对象,打印输出该对象,
		 * 那么默认会调用Object类的toString()方法,
		 * 输出:stu:Object类介绍.Student@7852e922
		 * 
		 * 2.如果希望打印对象显示其属性信息,
		 * 那么可以让该对象重写toString(),
		 * 返回对象属性和值的字符串表示形式
		 */
		System.out.println("stu:" + stu);
		
		
		System.out.println("o1.hashcode():" + o1.hashCode());//o1.hashcode():1829164700
		
		System.out.println();
		
	}

}
package Object类介绍;

public class Student {

	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + "]";
	}
}

示例代码2

package Object类介绍;

public class Student {

	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + "]";
	}
	//source -----> Override/Implement Methods
	@Override
	public int hashCode() {
//		return super.hashCode();
		return 123;
	}
}
package Object类介绍;

import java.util.Date;

public class TestHashCode {

	public static void main(String[] args) {

		Object o1 = new Object();
		
		//1.结论:Object类的hasCode方法:返回对象内存地址的十进制表示形式
		System.out.println("o1.hashCode():" + o1.hashCode());//o1.hashCode():1829164700
		/**
		 * toString():返回对象的字符串表示形式。
		 * 格式:完整的类名+@+对象内存地址的十六进制表示形式
		 */
		System.out.println("o1.toString():" + o1.toString());//o1.toString():java.lang.Object@6d06d69c
		
		
		//2.String类重写咯hashCode方法,对哈希值做了加工处理
		String s1 = new String("123");
		System.out.println(s1.hashCode());//48690
		
		String s2 = new String("321");
		System.out.println(s2.hashCode());//50610
		
		//3.Integer类重写咯hashCode方法,返回对象的值
		Integer i = new Integer(123678);
		System.out.println(i.hashCode());//hashCode(123678) -----> 123678
		
		//4.自己定义的类可以重写hashCode方法,但是这样做没有任何意义
		Student stu = new Student();
		System.out.println(stu.hashCode());
		//5.Date类为什么重写hashCode方法
		//比较好的博客地址https://www.cnblogs.com/Model-frog/p/5638014.html
		Date d = new Date();
		System.out.println("d.hashCode():" + d.hashCode());//d.hashCode():-604836364
	}

}

拓展知识

Date类为什么重写hashCode方法open in new window


分割线


相关信息

以上就是我关于 Java-Java API 知识点的整理与总结的全部内容,另附源码open in new window

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4