java的Object类
来源:互联网 发布:红色痘印怎么消除 知乎 编辑:程序博客网 时间:2024/05/18 02:17
Object类的描述
Object类是类层次结构的根类,每个类都使用Object类作为超类,所有对象都实现这个类的方法。 在java中只有基本类型不是对象,例如数值、字符和布尔类型的值。但是基本类型有包装类,包装类另做介绍。
Object类的摘要
Object类中的方法
equals方法
格式:public boolean equals(Object obj)作用:检测两个对象是否相等
equals与”==”的比较
"=="比较基本数据类型就是比较其值
String s1 = "a"; String s2 = "a"; System.out.println(s1==s2); //true int a = 3; int b = 3; System.out.println(a==b); //true
"=="比较对象是比较两个对象的内存地址
String aa = new String("aa"); String bb = new String("aa"); System.out.println(aa==bb); //false
注意:给Integer赋予in数值在-128~127之间时直接从cache中获取,这些cache引用对Integer对象地址是不变的,但不在这个范围内的数值就会new Integer()进行创建,地址不可能一样
Integer i1 = 1; Integer i2 = 1; System.out.println(i1==i2); //true Integer i3 = 150; Integer i4 = 150; System.out.println(i3==i4); //false
equals
默认情况下,equals也是比较两个对象是否指向同一块地址空间,与"=="作用一致。对于自定义的类想要比较两个对象的内容,就必须重写equals方法,子类定义的equals方法必须先调用超类的equals方法,超类的检测成功了才继续检查子类的实例域注意:如果重新定义equals方法就必须重新定义hashCode方法,以便用户可以将对象插入散列表中
public class Person { private String name; private Double salary; 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() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((salary == null) ? 0 : salary.hashCode()); return result; } @Override public boolean equals(Object obj) { //检查是否引用同一个对象 if (this == obj) return true; //检查是否为空 if (obj == null) return false; //检查是否属于同一个类 if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (salary == null) { if (other.salary != null) return false; } else if (!salary.equals(other.salary)) return false; return true; }}
equals特性
- 自反性:对于任何非空引用x,x.equals(x)返回true
- 对称性:x.equals(y)返回true,则y.equals(x)也应该返回true
- 传递性:x.equals(y)返回true,y.equals(z)也返回true,则x.equals(z)也应该返回true
- 一致性:如果x,y引用的对象没有发生改变,则反复调用x.equals(y)应该返回同样的结果
- 对于任意非空引用x,x.equals(null)应该返回false
hashCode方法
散列码
由对象导出的一个整数值,无规律,不同对象的散列值基本不会相同
字符串和对象的散列码
字符串的散列码由内容导出,而没有自定义hashCode方法的对象的散列码是由Object类默认的hashCode方法导出的对象存储地址
String s = "OK"; //2524StringBuilder sb = new StringBuilder(s); //930384804System.out.println(s.hashCode()+" "+sb.hashCode());String t = new String("OK"); //2524StringBuilder tb = new StringBuilder(t); //1148967021System.out.println(t.hashCode()+" "+tb.hashCode());
注意:equals与hashCode的定义必须一致,如果x.equals(y)返回true,则x.hashCode()就必须与y.hashCode()值相同。
toString方法
用于返回表示对象值的字符串
绝大多数格式
类名,后跟方括号括起的域值
toString方法的调用
直接调用 或 对象与一个字符串通过+连接起来
自定义类
如果没有重写toString方法,那么输出来的默认的字符串内容是“类名+哈希编码”System.out.println(new Person().toString());//com.zhu.Person@3c1
clone方法
> 创建并返回此对象的一个副本> 默认的clone方法执行的是浅拷贝> 如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个被引用的对象必须也要实现Cloneable接口并且实现clone方法。
finalize方法
垃圾回收其清除对象释放内存之前调用。不能依赖于使用finalize方法回收资源,因为不知何时回调用该方法。对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。
wait方法
在其他线程调用此对象的notify()或notifyAll()方法,或者中断此线程,或者设置的等待时间到达之前,当前线程等待。
notify方法
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
notifyAll方法
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
注释:上述关于线程的三个方法在并发出在做详细介绍
阅读全文
1 0
- java的Object类
- java的Object类
- Java的Object类
- java的Object类
- Java的Object类
- Java的Object类
- Java的Object类详解
- Java--Object类的介绍
- JAVA的API: Object类
- JAVA Object类的方法
- java object类的方法
- 【Java】Object类的方法
- Java的根类Object
- java的object类详解
- Java day07 复写Object 类的equals(Object)方法
- 【Java相关】Java的Object类
- java的Object类的学习
- Java类的共同父类Object
- git 遇到的问题
- VirtualAPK框架接入
- Kotlin之Lambda表达式原理及应用
- MySQL 自动编号与主键约束
- C++17尝鲜:结构化绑定声明(Structured Binding Declaration)
- java的Object类
- LeetCode 454. 4Sum II (Medium)
- 最透彻的关于“随机数种子”和“伪随机数”的产生原理
- Spring Boot与Log4j2集成之java.lang.IllegalStateException: Logback configuration error detected:
- 过滤器和拦截器的区别
- [Scala--基础]---Scala枚举使用
- MySQL 初涉唯一约束
- 通过HttpClient来调用Web Api接口
- Oracle 删除归档日志