Day3 | Java基础 | 4常见类

Day3 | Java基础 | 4 常见类

  • 基础版
    • Object类
      • equals
      • hashCode(散列码)
      • hashCode和equals
    • clone方法
    • String类
  • 问题回答版
    • Object类
      • Object类的常见方法有哪些?
      • ==和equals()的区别是什么?
      • 为什么要有hashCode?
      • hashCode和equals的区别是什么?
      • 为什么重写equals()时必须重写hashCode()方法?
      • 深拷贝和浅拷贝有什么区别?
      • 深拷贝有几种实现方式?
    • String类
      • String、StringBuffer、StringBuilder的区别?
      • Java的String类为什么不可变?

基础版

Object类

equals

源码:

public boolean equals(Object obj) {  return (this == obj);  
} 

若使用源码equals比较,不论两个自定义的对象是否相等,结果都是false。所以比较对象前一定要重写equals方法。

hashCode(散列码)

是由对象推导出的一个整型值,这个值为任意整数,包括整数或负数。

散列码没有规律。

  • 如果x和y是两个不同的对象,x.hashCode()和y.hashCode()基本不会相同
  • 如果a和b相等,则a.hashCode()一定等于b.hashCode()

源码:

public native int hashCode(); // native本地方法

在这里插入图片描述在这里插入图片描述

hashCode和equals

规范(不是强制规定)

  • hashCode和equals返回值应该是稳定的,不应有随机性
  • 俩对象==返回true,则这两个对象的equals也应该返回true
  • 俩对象euqals,则这两个对象的hashCode应该相等

扩展

  • 默认对象的hashCode方法返回值永远 ≥ 0
  • 默认对象的hashCode方法返回值不是对象的地址
  • 关于==,有些有“池子”的对象会有特殊效果

clone方法

深拷贝和浅拷贝(没太明白)
一个例子:

//浅拷贝
public class Person {private Name name;private Address address;public Person(Person originalPerson) {this.name = originalPerson.name;this.address = originalPerson.address;// name、address属性与原对象共享}
}//深拷贝
public class Person {private Name name;private Address address;public Person(Person otherPerson) {this.name = new Name(otherPerson.name);this.address = new Address(otherPerson.address);// 创建新的实例}
}

String类

问题回答版


Object类

Object类的常见方法有哪些?

方法描述
protected Object clone()创建并返回一个对象的拷贝
boolean equals(Object obj)比较两个对象是否相等
protected void finalize()当GC(垃圾回收器)确定不存在对该对象有更多引用时,由对象的垃圾回收器调用此方法
Class<?> getClass()获取对象运行时对象的类
int hashCode()获取对象的hash值
void notify()唤醒在该对象上等待的某个线程
void notifyAll()唤醒在该对象上等待的所有线程
String toString()返回对象的字符串表示形式
void wait()让当前线程进入等待状态。直到其他线程调用此对象的notify()方法或notifyAll()方法
void wait(long timeout)让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的notify方法或notifyAll()方法,或者超过参数设置的timeout超时时间
void wait(long timeout, int nanos)与void wait(long timeout)方法类似,多了一个nanos参数,这个参数表示额外时间(以纳秒为单位,范围是0-999999)。因此超时时间还要加上nanos纳秒

==和equals()的区别是什么?

  • ==操作符比较对象的引用,判断是否为同一对象
  • equals()方法比较对象的内容,但默认情况下与==的行为相同(比较内容)
  • 一些类会覆盖equals()方法以便在内容上进行比较,例如String、Integer、Double等
    当需要比较对象的内容时,务必使用正确的方法。同时注意处理参数为null的情况,以及在自定义类中正确地覆盖equals()方法。

为什么要有hashCode?

参考链接
1、用于查询某个集合是否在集合中

  • 不通过hash方式定位元素(的存储位置):只能按照集合的前后顺序,依次访问比对。效率低下。
  • 通过hash计算,可以直接定位出某个值存储的位置。

2、用于比较两个对象是否相等(与equals协同)

  1. 若hashCode相等,再使用equals再次比较,如果前后比较结果均为true,则认定两个对象相等
  2. 其他情况均认为两个对象不相等。(提高比较的效率)

为什么不直接使用hashCode就确定俩对象是否相等?
因为不同对象的hashCode可能相同;但hashCode不同的对象一定不相等。所以用hashCode进行快速初次判断。

hashCode和equals的区别是什么?

-equalshashCode
用途判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定相等。

为什么重写equals()时必须重写hashCode()方法?

如果在重写equals时,不重写hashCode,就会导致在某些场景下,例如将两个相等的自定义对象存储在Set集合时(默认情况下Set进行去重操作时,会先盘算两个对象的hashCode是否相同,如果相同再调用equals方法确认是否对象相等,如果确实相等才进行去重操作),就会出现程序执行的异常。为了保证程序的正常执行,我们需要在重写equals时,也一并重写hashCode方法才行。

深拷贝和浅拷贝有什么区别?

数据位置深拷贝浅拷贝
栈内存
存储基本数据类型
拷贝拷贝
堆内存
存储数组、引用数据类型等
拷贝拷贝

实现深拷贝,修改拷贝对象的属性和内容,不会影响到原对象。

深拷贝有几种实现方式?

  • 实现Cloneable接口,并重写clone方法(最常见):缺点是比较麻烦,需要所有实体类都实现Cloneable接口,并重写clone方法。如果实体类中新增了一个引用对象类型的属性,还需要添加到clone方法中。如果继任者忘了修改clone方法,相当于一个隐患。
  • 使用JSON字符串转换:先把user对象转换成json字符串,再把json字符串转换成user对象。
  • 集合:初始化新对象时,把原对象传入到新对象的构造方法中。

String类

参考链接

String、StringBuffer、StringBuilder的区别?

  • String:提供了构造和管理字符串的各种基本逻辑。是典型的Immutable类,被声明为final class,所有属性也都是final的。因其不可变性,类似拼接、裁剪字符串等动作,都会产生新的String对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
  • StringBuffer:为解决上面提到的产生太多中间对象的问题而提供的一个类。我们可以用append或add方法,把字符串添加到已有序列的末尾或者指定位置。是一个线程安全的可修改字符序列。它的线程安全是通过在各种修改数据的方法上用synchronized关键字修饰实现的。
  • StringBuilder:Java1.5中新增的,能力与StringBuffer没有本质区别,但是去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。

Java的String类为什么不可变?

String的定义:

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];

final关键字修饰。表示不可继承String类。该类的数据存储与char[]数组,这个数组被final修饰,表示String对象不可被更改

这样设计的目的是

  • 保证String对象的安全性。避免String被篡改。
  • 保证hash值不会频繁变更。
  • 可以实现字符串常量池。

通常有两种创建字符串对象的方式:

  • 通过字符串常量的方式:String str = "abc"
    • JVM首先会检查该对象是否在字符串常量池中,如果在,就返回该对象引用,否则在常量池中创建新的字符串。这种方式可以减少同一个值的字符串对象的重复创建,节约内存。
  • 字符串变量通过new的形式:String str = new String("abc")
    • 首先,在编译类文件时,“abc”常量字符串会被放入到常量结构中。类加载时,“abc”会在常量池中创建。
    • 其次,在调用new时,JVM命令将会调用String的构造函数,同时引用常量池中的“abc”字符串,在堆内存中创建一个String对象。
    • 最后,str 将引用String对象。

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

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

相关文章

chrome extension插件替换网络请求中的useragent

感觉Chrome商店中的插件不能很好的实现自己想要的效果,那么就来自己动手吧。 本文以百度为例: 一般来说网页请求如下: 当前使用的useragent是User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safar…

解决WordPress无法强制转换https问题

原因&#xff1a;我在用cs的时候&#xff0c;突然老鸟校园网突然断了&#xff0c;客户端cs连不上了&#xff0c;进程也杀不死&#xff0c;cpu占用100%&#xff0c;只能重启&#xff0c;但是重启后我的blog网站打不开了 开始以为是Nginx的问题&#xff0c;重启它说配置出了问题…

[iOS]从拾遗到Runtime(上)

[iOS]从拾遗到Runtime(上) 文章目录 [iOS]从拾遗到Runtime(上)写在前面名词介绍instance 实例对象class 类对象meta-class 元类对象为什么要有元类&#xff1f; runtimeMethod(objc_method)SEL(objc_selector)IMP 类缓存(objc_cache)Category(objc_category) 消息传递消息传递的…

C语言【文件操作 2】

文章目录 前言顺序读写函数的介绍fputc && fgetcfputcfgetc fputs && fgetsfputsfgets fprintf && fscanffprintffscanf fwrite && freadfwritefread 文件的随机读写fseek函数偏移量ftell函数rewind函数 文件的结束判断被错误使用的feof 结语 …

【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了

目录 一、Nessus 二、AWVS 三、ZAP 四、w3af 五、北极熊 六、御剑 七、网络安全学习路线 &#xff08;2024最新整理&#xff09; 八、学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 渗透测试收集信息完成后&#xf…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

AI换脸原理(3)——人脸对齐介绍

人脸对齐简介 人脸对齐其实包含两个步骤:人脸关键点检测、人脸对齐,英文术语有facial landmark和face alignment,主要用于精确标识眉毛、眼睛、鼻子、嘴巴以及人脸轮廓等特征部位。不同数据集对于关键点的数量有不同的设定,最少的是标记5个关键点,通常包括两只眼睛的瞳孔…

【driver5】调用堆栈函数,printk,动态打印,ftrace,proc,sysfs

文章目录 1.内核函数调用堆栈&#xff1a;4个函数2.printk&#xff1a;cat /proc/cmdline查看consolettyS03.动态打印&#xff1a;printk是全局的且只能设打印等级&#xff0c;动态打印可控制选择模块的打印&#xff0c;在内核配置打开CONFIG_DYNAMIC_DEBUG4.top&perf&…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

2024年软件测试最全jmeter做接口压力测试_jmeter接口性能测试_jmeter压测接口(3),【大牛疯狂教学

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

JavaWeb_请求响应_简单参数实体参数

一、SpringBoot方式接收携带简单参数的请求 简单参数&#xff1a;参数名与形参变量名相同&#xff0c;定义形参即可接收参数。并且在接收过程中&#xff0c;会进行自动的类型转换。 启动应用程序后&#xff0c;在postman中进行测试&#xff1a; 请求成功&#xff0c;响应回了O…

【Ping】Windows 网络延迟测试 ping 、telnet、tcping 工具

ping 命令 属于网络层的ICMP协议&#xff0c;只能检查 IP 的连通性或网络连接速度&#xff0c; 无法检测IP的端口状态。 telnet telnet命令&#xff0c;属于应用层的协议&#xff0c;用于远程登录&#xff0c;也可用于检测IP的端口状态。但是功能有限&#xff0c;只能检测一时…

八股文(C#篇)

C#中的数值类型 堆和栈 值类型的数据被保存在栈&#xff08;stack)上&#xff0c;而引用类型的数据被保存在堆&#xff08;heap&#xff09;上&#xff0c;当值类型作为参数传递给函数时&#xff0c;会将其复制到新的内存空间中&#xff0c;因此在函数中对该值类型的修改不会影…

华为eNSP Pro模拟器下载(普通账号可用)

好消息&#xff01;华为终于开放了普通账号使用权限&#xff01; 安装教程下载后见《指导手册-eNSP Pro V100R001C00.pdf》 华为eNSP Pro模拟器下载&#xff08;普通账号可用&#xff09; 下载地址 华为eNSP Pro模拟器下载&#xff08;普通账号可用&#xff09; - 下一朵云 …

Linux进程间通信方式

每个进程的用户空间都是独立的&#xff0c;不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区&#xff0c;处理速度不同的进程之间的数据传输资源共享&#xff1a;多个进程之间共享同样的资源&#xff0c;一个进程对共享数据的修改&#xff0c…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 &#xff1a;RK3568 开发板 atompi-ca1 默认有两个网口&#xff0c;通过 u-boot mii 命令&#xff0c;可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网&#xff0c;不同…

昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC&#xff0c;适用于5~8s Li-Ion/Polymer电池组&a…

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符&#xff1a; 封装&#xff1a; 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们&#xff0c;在开始本篇文章的内容之前&#xff0c;我想先向大家道个歉&#xff0c;由于…

Unity数据持久化之XML

目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化&#xff08;不支持字典&#xff09;XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…