java中Object相关的几个方法
protected Object clone()创建并返回此对象的一个副本。
String toString()返回该对象的字符串表示。
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。 (不是值相等,而是是不是指向同一块内存空间)
int hashCode()返回该对象的哈希码值。 与垃圾回收相关
protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 与反射相关
Class<?> getClass()返回此 Object 的运行时类。 与线程相关
void notify()唤醒在此对象监视器上等待的单个线程。
void notifyAll()唤醒在此对象监视器上等待的所有线程。
void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。 Object类这些方法的重写方式:
右键->Source->override/implement Methods equal方法
先看看Object中equal方法的定义
public class Object { private static native void registerNatives();
static {
registerNatives();
} public boolean equals(Object obj) {
return (this == obj);
} //.....
}
从这里可以看出,只有当两个对象是同一个对象时(同一块内存空间),equals方法才会返回true
比如我们定义一个类(包含两个构造器)
public class Person {
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
然后我们定义一个Set:
public static void main(String[] args) {
Set set = new HashSet(); Person p1 = new Person();
set.add(p1);
set.add(p1); System.out.println(set.size());
}
我们知道Set集合中不能存放相同的元素,所以输出结果是1
比较两个元素是否一样,主要是用到equals方法,所以Set集合的add方法之前其实首先是调用了p1对象的equals方法,查看集合中是否有相同对象。
而Person集合中没有重写equal方法,所以调用的父类的equals()方法。
public static void main(String[] args) {
Set set = new HashSet(); set.add(new Person("AA",12));
set.add(new Person("AA",12)); System.out.println(set.size());
}
而这时候的输出结果是2,很明显这是两个对象Person p1=new Person("AA",12)); Person p2=new Person("AA",12)); p1和p2不是同一个对象
其实我们的目的是当两个Person对象的属性值一样时,就当成是相同对象,不再加入
问题在于new出来的两个对象的equals方法比较的返回值是false。而Set的add方法的判断标准是equals方法的返回值
如果想让equals返回true,就不能在使用Object定义的equals方法,要重写
(java的IDE提供了关于Set的equals方法自动重写功能,右键->Source->Generate hashCode() and equals())
package com.atguigu.java; public class Person {
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
} @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 (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }
这下在运行,输出的结果就是1
toString方法
Object中的定义
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以我们直接输出一个对象名或者对象名.toString(),都是调用的这个方法(在未重写的情况下)
java中Object相关的几个方法的更多相关文章
- java中常用的字符串的截取方法
java中常用的字符串的截取方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
- Java中Object类hashCode的底层实现
Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
- Java中的五种单例模式实现方法
[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...
- 谈谈java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
- Java中创建数组的几种方法
Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...
随机推荐
- 动态代理 Proxy InvocationHandler
前奏 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常 ...
- plsql 把数据导出成为 .sql文件,记住了
今天上午,同事 提醒我.可以直接把数据导出成 .sql 文件,类似于 反编译.见下图
- react服务端渲染(同构)
学习react也有一段时间了,使用react后首页渲染的速度与seo一直不理想.打算研究一下react神奇服务端渲染. react服务端渲染只能使用nodejs做服务端语言实现前后端同构,在后台对re ...
- 重新开始学习javase_对象的摧毁
一.概述(转:@深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版) ) 经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了 ...
- Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》
一.什么是sqoop Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ...
- delphi服务程序(service)的调试方法
方法一: 1.调试delphi 写的服务程序,有这么一个办法.原来每次都是用attach to process方法,很麻烦.并且按照服务线程的执行线路,可能会停不到想要的断点.笨办法是,在proced ...
- Javascript模块化编程:模块的写法
声明:本文转载自:阮一峰的网络日志,原文地址http://www.ruanyifeng.com/blog/2012/10/javascript_module.html,http://www.ruany ...
- Windows Phone 使用 WriteableBitmap后台生成图片
这几天项目是遇到一个需求,需要后台把几个元素生成到一张图片上,并保存到文件中 private void cutscreen_Click(object sender, EventArgs e) { Gr ...
- VBoxManage命令详解
转自:http://zhang-ly520.iteye.com/blog/300606 由于最近工作对vbox有一定涉猎,发现这个写的比较好,先转来,稍有空时再根据自己的心得整理一下. VBoxMan ...
- angularjs现学现记之—$apply()和$digest()
angularjs的双向数据绑定是个重要的特性,它让我们的代码简洁了许多,然而它又是如何知道数据发生了变化并改变页面的呢.最近看了一篇介绍觉得十分有用 首先,在angularjs中是有$watch事件 ...