c++ string类的常用方法_【常用类方法】Object

6ff39533631ebf6481bd0e5e1d210e0f.png

Object类的知识点总结

概述:

1. Object类是所有其他类的父类

2. Object类只有一个构造方法,这也是为什么所有子类在调用构造方法时都会默认先调用父类的无参构造方法

3. Object类没有成员变量

方法:

1. public int hashCode()

2. public final Class getClass()

3. public String toString()

4. public boolean equals(Object obj)

5. protected void finalize()

6. protected Object clone()

具体方法:

  • public int hashCode():

返回此对象的哈希码值(散列码),支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

1. 一致性:在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

2. 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果重写了equals()方法,一定也要重写hashCode()方法

3. 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

重写:

int result = c;

//根据每一个关键域的hashcode去生成

31 * i == ( i << 5 ) - i ;

result = 31 * field.hashCode + result ;

return result;

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

  • public final Class getClass()

返回此 Object运行时类

Class:类类型,用来描述该类型的类

String getName():返回该类的全限定名

注意事项:

a) 返回的是运行时类

b) 用final修饰,所有对象该方法的行为一致

返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。

  • public String toString()

返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object中toString的默认实现是返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成

getClass().getName() + “@” + Integer.toHexString(hashCode())

默认实现不能很好的体现对象,所以推荐子类都重写toString()

重写方式:

1. 根据关键域去重写

2. 快捷键生成

  • public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

默认实现:

return this == obj ;

针对不同的类:

实体类:不同对象代表不同实体,采用默认实现即可

值类:关键域相等,就认为两个对象相等,需要重写equals方法

1. 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

2. 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

3. 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

4. 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

5. 非空性:对于任何非空引用值 x,x.equals(null) 都应返回 false。

(Java语法没有强制要求严格遵循这些原则,但是违反可能会对程序造成灾难性的后果)

重写:

a) 子类没有新的要比较的属性,就用instanceof进行判断

Demo:

public boolean equals(Object obj) {

if(obj instanceof Demo) {
Demo demo = (Demo) obj ;

//用关键属性进行比较

}

return false;

}

里氏替换原则

b) 子类有新的要比较的属性,就用getClass()方法进行判断

Demo:

public boolean equals(Object obj) {

if(obj == null || obj.getClass() != getClass() {
return false ;

}

Demo demo = (Demo) obj;

//用关键属性进行比较

}

没有遵循里氏替换原则

c) 快捷键生成

“==“ 和 equals 的区别

==:

a) 如果比较的是基本数据类型,判断他们的值是否相等

b) 如果比较的是引用数据类型,判断他们是否是同一个对象

equals:

a) 不能比较基本数据类型

b) 比较引用数据类型,如果没有重写Object的equals(),默认判断是否是同一个对象

c) 如果重写了,一般是根据对象的值进行判断

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

  • protected void finalize()

垃圾回收器回收该对象之前,会调用该方法

作用:可以释放系统资源

注意事项

a) 如果直接调用,相当于普通方法的调用,并不会回收该对象

b) 释放系统资源最好不要放在该方法里面,推荐使用try…catch…finally

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

子类重写 finalize 方法,以配置系统资源或执行其他清除。

finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。

Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。

Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。

finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它

  • protected Object clone()

创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。

默认:浅拷贝

如何实现深拷贝:

a) 实现Cloneable接口

b) 调用super.clone(),完成基本数据类型的拷贝

c) 对所有的引用数据类型完成深拷贝(下一级也应该实现深拷贝)

这样做的目的是,对于任何对象 x,表达式:

x.clone() != x为 true,表达式:

x.clone().getClass() == x.getClass()也为 true,但这些并非必须要满足的要求。一般情况下:

x.clone().equals(x)为 true,但这并非必须要满足的要求。

按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。

按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。

Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。

Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 收获地址管理,android UiAutomator添加收货地址的用例

本人在学习UiAutomator的时候&#xff0c;遇到添加收获地址的测试用例&#xff0c;这里的地址的地区是一级一级选择的。所以写了一个随机选择的方法。分享出来&#xff0c;供大家参考。public void addAdress() throws UiObjectNotFoundException {login();waitForResourceIdAn…

python注释以符号什么开始_python注释以什么符号开始

python注释以什么符号开始,注释,中文,代码,批量,符号 python注释以什么符号开始 易采站长站&#xff0c;站长之家为您整理了python注释以什么符号开始的相关内容。 python中的注释有多种&#xff0c;有单行注释&#xff0c;多行注释&#xff0c;批量注释&#xff0c;中文注释也…

verilog 移位运算符 说明_Verilog学习笔记基本语法篇(二)·········运算符...

Verilog HDL的语言的运算符的范围很广&#xff0c;按照其功能大概可以分为以下几类:(1)算术运算符&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%优先顺序&#xff01;~* / % -<< >>< < > > ! !&^ ^~|&&||&…

linux 别名,Linux中的别名就这么简单,如何使用和创建永久别名?

原标题&#xff1a;Linux中的别名就这么简单&#xff0c;如何使用和创建永久别名&#xff1f;输入文本和记命令是Linux命令行爱好者的缺点之一。如果你需要输入并记住同样长的命令&#xff0c;这可能会降低终端的工作效率。如果您可以用自己的短名称替换长命令&#xff0c;或者…

华为手机如何固定横屏_华为手机如何录屏?原来方法这么简单,手把手教你学会...

很多人都不知道&#xff0c;华为手机到底如何录屏&#xff0c;下面给大家分享4种方法&#xff0c;非常简单&#xff0c;手把手教你学会。一、通知栏录屏从手机顶端往下滑动打开通知栏&#xff0c;这个面板上有很多快捷功能&#xff0c;其中就有【屏幕录制】功能&#xff0c;点击…

程序发出的广播其他程序收不到_RabbitMQ 如何实现对同一个应用的多个节点进行广播...

1.背景了解过RabbitMQ的Fanout模式&#xff0c;应该知道它原本的Fanout模式就是用来做广播的。但是它的广播有一点区别&#xff0c;来回顾下它的含义&#xff1a;Fanout类型没有路由键的概念&#xff0c;只要队列绑定到了改exchange上面&#xff0c;就会接收到所有的消息。使用…

android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

我最近做项目用到了基本适配器BaseAdapter&#xff0c;所以写篇博客总结一下&#xff0c;希望也能对你有所帮助什么时候用BaseAdapter(同一项存在多个控件&#xff0c;复杂的列表时)Android中Adapter类其实就是把数据源绑定到指定的View上&#xff0c;然后再返回该View&#xf…

cnn生成图像显著图_基于CNN与图像前背景分离的显著目标检测

基于CNN与图像前背景分离的显著目标检测东野长磊;万文鑫【期刊名称】《软件导刊》【年(卷),期】2020(019)001【摘要】为了解决计算机视觉模拟人眼的视觉机制,显著性目标检测DSS(DeeplySupervisedSalient)在某个场景中人眼首先观察到的目标.基于卷积神经网络和图像前背景分离算法…

api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景

Zookeeper 是一个高性能、高可靠的分布式协调系统&#xff0c;是 Google Chubby 的一个开源实现&#xff0c;目前在分布式系统、大数据领域中使用非常广泛。本文将介绍 Zookeeper 集群架构、数据模型、监听机制&#xff0c;以及Zookeeper典型的应用场景等。1. Zookeeper 集群角…

mysql操作json优点和缺点_SQL-mysql操作json

一 前言MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型&#xff0c;其能在字段中使用json 类型&#xff0c;做到了自动校验是否为json类型数据&#xff0c;否则插入数据会报异常&#xff1b;其次&#xff0c;储存json数据内部做到了优化储存&#xff0c;能够快速读取json…

android多个水波球,android球形水波百分比控件代码

本文主要介绍的是一个球形水波的百分比控件&#xff0c;市面上有各种形形色色的百分比控件&#xff0c;我一直觉得水波是最炫的&#xff0c;UI给了我这个机会&#xff0c;然而网上搜了一大堆&#xff0c;不是太复杂&#xff0c;代码太多(反正我是调不出效果来)&#xff0c;就是…

python数据去重的函数_python pandas dataframe 去重函数的具体使用

今天笔者想对pandas中的行进行去重操作&#xff0c;找了好久&#xff0c;才找到相关的函数 先看一个小例子 from pandas import Series, DataFrame data DataFrame({k: [1, 1, 2, 2]}) print data IsDuplicated data.duplicated() print IsDuplicated print type(IsDuplicate…

合信达 机器人_【中信建投 通信】拓邦股份:中报电话会议干货纪要

原标题&#xff1a;【中信建投 通信】拓邦股份&#xff1a;中报电话会议干货纪要一中信建投通信行业分析师 闫慧辰首先非常感谢大家参加我们举办的拓邦股份2017年中报解读电话会议。拓邦股份是我们5月份开始重点推荐的标的之一。我们观察到了公司业绩的爆发增长&#xff0c;同时…

android 3.0单元测试,Android Studio 3.0 gradle 3.0.0-beta2打破了Kotlin单元测试覆盖率?

我有一个简单的Kotlin课程,如下所示class MyClass {fun justSayHello(yes: Boolean): String {if (yes) {return "Hello"} else {return "Sorry"}}}我有我的测试(这里用Java编写,也可以在Kotlin中)public class MyClassTest {private MyClass myClass new…

c++ 二维数组_【技术篇】C指针与二维数组深度辨析

一、源代码/*第01行*/ CLion 2019.3.4 x64中编写的源代码截图二、深度辨析CLion 2019.3.4 x64中编译的结果截图zippo[4][2]是一个四行二列的int型二维数组①不论一维数组还是二维数组&#xff0c;数组名就是指向数组首个元素的指针&#xff0c;也即数组名就是数组首个元素的…

numberformate php_php number_format函数怎么用?

number_format函数是PHP中的一个内置函数&#xff0c;用于格式化一个包含数千个分组的数字&#xff0c;其语法是“string number_format ( $number, $decimals, $decimalpoint, $sep )”。本篇文章主要给大家介绍php number_format用法&#xff0c;希望对需要的朋友有所帮助&am…

android 脚本模拟点击屏幕,android 脚本模拟点击屏幕,android模拟

android 脚本模拟点击屏幕&#xff0c;android模拟对低概率问题&#xff0c;需要多次测试以复现问题&#xff0c;使用脚本更容易实现&#xff0c;避免频繁人工操作首先要了解手机的众多输入设备&#xff1a;命令&#xff1a;adb shell cat /proc/bus/input/devices/I: Bus0000 …

shiro启动之后页面访问不了_java:shiro入门——4

【7】测试【7.1】启动点击apply然后点击OK【7.2】登录过滤访问http://localhost:8080/platform/home的时候&#xff0c;会被【7.3】角色过滤使用“admin”用户登录&#xff0c;密码&#xff1a;123根据SecurityServiceImpl我们可以知道使用admin账号登录成功之后&#xff1a;此…

Android如何分析native代码,使用android-ndk-profiler对native代码进行性能分析

android-ndk-profiler需要使用gcc进行编译&#xff0c;从NDK r13b 起NDK使用的默认编译器从gcc换成了clang&#xff0c;官方提供了Simpleperf工具进行性能分析&#xff0c;具体情况可以参考https://developer.android.google.cn/ndk/guides/simpleperf 。下载使用编译方面的改动…

python模板语言_django的模板语言

Django模板语言1.基础语法:return render(request,qwe.html,{obj:obj}),render的最后的字典可以以键值对的形式传入多个值,在django模板中只用到两种符号变量相关:{{变量名}} 逻辑相关:{% %}1)变量相关:a: 变量名有字母数字和下划线组成,(.)用来获取对象的属性值,ls.0 --> …