Object类是 Java 中所有类的父类(基类)
Object类有构造方法可以直接被实例化
构造方法:
Object()
Object中常用的三个方法:
1.返回对象的字符串表示形式。结果是一个简明扼要的表达,容易让人阅读
| 返回值类型 | 方法名 | 语法格式 |
|---|---|---|
| String | toString( ) | public String toString() |
2.返回的是一个boolean类型,来判断两个对象的地址是否相等,不看内容
| 返回值类型 | 方法名 | 语法格式 |
|---|---|---|
| boolean | equals(Object obj) | public boolean equals(Object obj) { return (this == obj) } |
案例:比较两个对象的内容是否一样,如果一样返回true。
package com.qfedu.a_object;
import java.util.Objects;
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//重写equlas,要求去比较内容,如果内容一样的额话,返回true
//stu1.equals(stu2)
//stu2赋值给了 o 向上转型 Object o =new Student();
@Override
public boolean equals(Object o) {
if (this == o) {//比较是地址
return true;
}
//如果地址不一样的话,再去比较内容,如果内容一样也返回true
if (o instanceof Student) {
//才去比较值 name age
Student stu = (Student)o;//向下转型
//stu1.equals(stu2) stu就是stu2 this 是stu1
return stu.age == this.age && stu.name.equals(this.name);
}
return false;
}
}
public class Demo2 {
public static void main(String[] args) {
Student stu1 = new Student("老邢", 89);
Student stu2 = new Student("老邢", 89);
//stu1是Object类子类,用的是object 类面的equals方法
//Object类下面的equals方法比较是 地址 this==obj
//System.out.println(stu1.equals(stu2));//false
//现在我的需求是当两个对象的内容一致的时候返回的额是true
//内容不一样的时候,返回是false
//就意味着Object类的equals方法已经满足不了Student类的需求了
//咋解决? 重写equals方法
System.out.println(stu1.equals(stu2));//true
}
}
3.返回对象的哈希码值是一个int类型的数据。
int hashCode();
hashCode的注意事项:
-
只要在执行Java应用程序时多次在同一个对象上调用该方法,
hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。 -
如果根据
equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。 -
不要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用
hashCode方法必须产生不同的整数结果。 但是,不等对象生成不同的整数结果可能会提高哈希表的性能。由Object类定义的hashCode方法确实为不同对象返回不同的整数。
请注意:无论何时重写equals方法,通常都需要重写hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码值。(如果两个对象的hash值一样,对象不一定一样。但是如果两个对象相等那么hash值一定相等)
案例:
package com.qfedu.a_object;
import java.util.Objects;
class Dog {
int id;
String name;
public Dog(int id, String name) {
this.id = id;
this.name = name;
}
public boolean equals (Object o) {
if (this == o) {
return true;
}
if (o instanceof Dog) {
Dog dog = (Dog)o;
return this.id == dog.id && dog.name.equals(this.name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode() + id;
}
}
public class Demo5 {
public static void main(String[] args) {
Dog dog1 = new Dog( 3, "a");
Dog dog2 = new Dog( 2, "b");
//现在关注的是内容,如果内容一样 调用equals方法的时候
//必须返回一个true
System.out.println(dog1.equals(dog2));//true
//此时这个两个对象的hash值一样不一样?因为内存地址不一样的
System.out.println(dog1.hashCode());
System.out.println(dog2.hashCode());
//现在hashCode不一样咋办? 重写hashCode即可
//如果根据equals(Object)方法两个对象相等,
// 则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
//如果两个对象的hash值一样,对象是不一定一样的。但是如果两个对象相等
//那么hash值一定相等
}
}
set集合
Set集合也是一个接口,他的父接口是Collection。存储数据的特征是:无序的,不可重复的
Set接口有两个实现类:
HashSet:依靠hash值进行存储的,如果两个元素的hash值一样的话,就不在储存(可以直接存对象)
TreeSet:底层是二叉树,对存储数据进行自然排序保证数据的唯一行,存储也是无序的
TreeSet在存对象的时候要去实现Comparable这个接口的抽象方法
抽象方法语法格式:返回的是一个interesting行数据
compareTo(T o)
意思:将此对象与指定的对象进行比较以进行排序。返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。
最后
以上就是土豪鸵鸟最近收集整理的关于Java中集合的Object类的全部内容,更多相关Java中集合内容请搜索靠谱客的其他文章。
发表评论 取消回复