Java基础之Object类

Posted Ocean:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础之Object类相关的知识,希望对你有一定的参考价值。

Object类

Java中所有类的基类

Java中所有类都是间接或直接继承Object类

Object类的引用数据类型变量可以保存Java中任意数据类型空间的首地址

Object类内规定了一些方法:

  • String toString();

    当前对象建议String类型描述,默认情况是当前类所属包名,类名@十六进制内存地址,如果对于数据类型展示有要求,可以重写toString方法,在暂时的方法中默认执行toString方法

  • int hashCode();

    内存中当前对象的唯一索引值,默认情况下是当前对象所处空间首地址的十进制展示

  • boolean equals();

    比较方法,判断两个对象是否一致,Object类内默认情况下比较方式的是地址比较,两个对象的地址一致(即hashCode值必须一致),表示是相同对象,如果期望修改equals比较规则,可以在当前类内重写

  • 下三个方法与线程有关

  • void wait();

  • void notify();

  • void notifyAll();

  • 与反射有关的方法

  • Class<?> getClass();

toString方法

鸡肋方法,用处不大

shift + alt + s 生成toString

在类中使用

效果如下

equals方法

比较两个对象是否一致,在Object类内默认情况下比较方式的是地址比较

根据项目需求重写equals

注意equals方法重写,hashCode也需要重写

	/*
	 * 重写equals方法
	 * 	1.判断两个对象是否是同一个对象,如果调用方法的类对象和传入参数类对象地址一致,就是同一个对象,返回true
	 * 	2.equals方法参数是Object类型,也就是任何类型的数据都可以作为参数
	 * 	需要首先判断数据类型是否一致,使用关键字instanceOf,相同数据类型再继续运行,非同类型返回false
	 * 	3.判断对象中保存的数据
	 */
	@Override
	public boolean equals(Object obj) {
		// 1.判断是不是同一个对象
		if (this == obj) {
			return true;
		}
		
		// 2.判断类型是否一致
		if(!(obj instanceof Student)) {
			return false;
		}
		
		
		// 数据类型强制转换
		Student stu = (Student) obj;
		return this.id == stu.id
				// 和Object的equals同名不同意
				&& this.name.equals(stu.name)
				&& this.age == stu.age
				&& this.gender == stu.gender;
	}

hashCode重写

在Object类内,hashCode方法,返回的内容是当前对象的首地址十进制展示方式

当前类重写equals方法之后,两个当前类对象比较结果为true,要求这两个对象的hashCode必须一致

hashCode在没有重写之前使用地址作为hashCode对应的数据,重写之后,不使用地址

可以直接使用eclipse或idea的自动补全来实现,这两个编辑器生成的形式不一样效果一样

没有重写之前

重写之后

package cn.ocean888;

public class Student {
	private int id;
	private String name;
	private int age;
	private char gender;
	
	
	public Student() {
		super();
	}


	public Student(int id, String name, int age, char gender) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
	}


	public int getId() {
		return id;
	}


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


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public char getGender() {
		return gender;
	}


	public void setGender(char gender) {
		this.gender = gender;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + gender;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof Student)) {
			return false;
		}
		Student other = (Student) obj;
		if (age != other.age) {
			return false;
		}
		if (gender != other.gender) {
			return false;
		}
		if (id != other.id) {
			return false;
		}
		if (name == null) {
			if (other.name != null) {
				return false;
			}
		} else if (!name.equals(other.name)) {
			return false;
		}
		return true;
	}
}

Set集合

特征:

  • 无序

    添加顺序和存储顺序不一致,【不代表有排序效果】

  • 不可重复

    在一个Set集合中不能出现相同元素

interface Set

​ class HashSet 底层是哈希表存储结构

​ class TreeSet 底层是一个平衡二叉树

实例:

Person类

package obj_set;

import java.time.Period;
import java.util.Objects;

import cn.ocean888.Student;

public class Person {
	int id;
	String name;
	double salary;
	
	public Person() {
	}
	
	public Person(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, name, salary);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof Person)) {
			return false;
		}
		Person p = (Person)obj;
		return this.id == p.id
				&& this.name.equals(p.name)
				&& this.salary == p.salary;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}	
}

Demo1.java

package obj_set;

import java.util.HashSet;

public class Demo1 {
	public static void main(String[] args) {
		HashSet<Person> hashSet = new HashSet<Person>();
		
		Person p1 = new Person(1, "one", 10);
		Person p2 = new Person(2, "two", 11);
		Person p3 = new Person(3, "three", 43);
		Person p4 = new Person(4, "four", 22);
		Person p5 = new Person(5, "five", 33);

		Person p6 = new Person(6, "six", 6);
		Person p7 = new Person(6, "six", 6);
		
		
		hashSet.add(p1);
		hashSet.add(p2);
		hashSet.add(p3);
		hashSet.add(p4);
		hashSet.add(p5);
		hashSet.add(p6);
		hashSet.add(p7);
		
		System.out.println(hashSet);
	}
}

运行结果

[Person [id=1, name=one, salary=10.0], Person [id=3, name=three, salary=43.0], Person [id=4, name=four, salary=22.0], Person [id=2, name=two, salary=11.0], Person [id=5, name=five, salary=33.0], Person [id=6, name=six, salary=6.0]]

有equals的限制,可以看到id相同的元素只能保存一个

TreeSet

Comparator和Comparable

例:使用Comparator接口完成排序算法

形式参数列表:(T[] arr, Comparator comparator

Person.java

package obj_comparable;

import java.util.Objects;

public class Person {
	int id;
	String name;
	double salary;
	
	public Person() {
	}
	
	public Person(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, name, salary);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof Person)) {
			return false;
		}
		Person p = (Person)obj;
		return this.id == p.id
				&& this.name.equals(p.name)
				&& this.salary == p.salary;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}
}

Demo.java

package obj_comparable;

import java.math.BigDecimal;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.Comparator;

public class Demo {
	public static void main(String[] args) {
		Person person1 = new Person(1, "one", 101.11);
		Person person2 = new Person(2, "one", 21.22);
		Person person3 = new Person(3, "one", 342.22);
		Person person4 = new Person(4, "one", 22.89);
		
		Person[] persons = {person1, person2, person3, person4};
		
		selectSort(persons, new Comparator<Person>() {
			@Override
			public int compare(Person o1, Person o2) {
				// 因为浮点数在计算机内保存精度不定,所以需要用BigDecimal
				BigDecimal bd1 = new BigDecimal(o1.getSalary() + "");
				BigDecimal bd2 = new BigDecimal(o2.getSalary() + "");
				// subtract 减    multiply 乘
				return bd2.compareTo(bd1);
			};
		});
		
		System.out.println(Arrays.toString(persons));
	}
	
	
	// Comparator 可以自定义指定排序方法,而Comparable是自然排序顺序
	/**
	 * 满足任意类型数据进行排序操作的算法,但是要求用户根据当前数据类型数组提供对应的比较方法,借助Comparator接口实现类对象传入
	 * 
	 * @param <T> 自定义泛型
	 * @param arr 任意类型数组,同时约束当前泛型T对应的具体数据类型
	 * @param comparator Comparator接口的实现的类对象,对应的具体数据类型和数组一致
	 */
	public static <T> void selectSort(T[] arr, Comparator<T> comparator) {
		if(null == arr || null == comparator || arr.length == 0) {
			throw new NullPointerException();
		}
		
		for (int i = 0; i < arr.length - 1; i ++) {
			int index = i;
			for (int j = i + 1; j < arr.length; j ++) {
				if(comparator.compare(arr[index], arr[j]) > 0) {
					index = j;
				}
			}
			
			if (index != i) {
				T temp = arr[index];
				arr[index] = arr[i];
				arr[i] = temp;
			}
		}
	}
}

运行结果

[Person [id=2, name=one, salary=21.22], Person [id=4, name=one, salary=22.89], Person [id=1, name=one, salary=101.11], Person [id=3, name=one, salary=342.22]]

可以看出结果已经根据salary的值进行了排序

以上是关于Java基础之Object类的主要内容,如果未能解决你的问题,请参考以下文章

Java基础1----Object类解析

Java基础之System类

java基础之Object

Java开发基础知识之学习篇——Object类

大数据基础之java常用API一

java基础之jdk源码Object