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.mzph.cn/pingmian/9120.shtml

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

相关文章

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

JAVA文件的简单操作

文件IO&#xff08;Input和Output&#xff09; 文件的输入和输出是人为规定的&#xff0c;那么什么是输入&#xff1f;什么是输出捏&#xff1f;在这里统一已CPU为基准 例如&#xff1a;将文件由内存写入硬盘就是输出&#xff0c;有硬盘写入内存就是输入。可以总结为&#xff…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

Cmake编译源代码生成库文件以及使用

在项目实战中&#xff0c;通过模块化设计能够使整个工程更加简洁明了。简单的示例如下&#xff1a; 1、项目结构 project_folder/├── CMakeLists.txt├── src/│ ├── my_library.cpp│ └── my_library.h└── app/└── main.cpp2、CMakeList文件 # CMake …

Python sqlite3库 实现 数据库基础及应用 输入地点,可输出该地点的爱国主义教育基地名称和批次的查询结果。

目录 【第11次课】实验十数据库基础及应用1-查询 要求: 提示: 运行结果&#xff1a; 【第11次课】实验十数据库基础及应用1-查询 声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 1.简答题 数据库文件Edu_Base.db&#…

国内唯一!阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”

近日&#xff0c;在MongoDB用户大会纽约站上&#xff0c;阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”。这是阿里云连续第五年斩获MongoDB合作伙伴奖项&#xff0c;也是唯一获此殊荣的中国云厂商。 MongoDB是当今全球最受欢迎的非关系型数据库之一。凭借灵活的模式和丰富…

Unity 修复Sentinel key not found (h0007)错误

这个问题是第二次遇到了&#xff0c;上次稀里糊涂的解决了&#xff0c;也没当回事&#xff0c;这次又跑出来了&#xff0c;网上找的教程大部分都是出自一个人。 1.删除这个路径下的文件 C:\ProgramData\SafeNet Sentinel&#xff0c;注意ProgramData好像是隐藏文件 2.在Windows…

Redis(安装及配置)

1.什么是redis Redis 全称 Remote Dictionary Server&#xff08;即远程字典服务&#xff09;&#xff0c;它是一个基于内存实现的键值型非关系&#xff08;NoSQL&#xff09;数据库&#xff0c;由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 2.优势 性能极高&#xff…

如何进行资产梳理

前言 为什么要进行资产梳理&#xff1f; 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些&#xff1f; 一,账号权限风…

【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…

《ESP8266通信指南》14-连接WIFI(基于Lua)

往期 《ESP8266通信指南》13-Lua 简单入门&#xff08;打印数据&#xff09;-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ES…

谷歌明年6月关闭 Google Fit 运动记录API,要求开发者迁移至Android Health平台 | 最新快讯

5 月 6 日消息&#xff0c;谷歌近日发布官方新闻稿&#xff0c;宣布将在明年 6 月使用 Android Health 平台取代 Google Fit 运动记录 API&#xff0c;开发人员应当尽早启动迁移计划。 谷歌自 2022 年起逐渐扩大对 Android Health 平台的投资&#xff0c;旨在减少平台碎片化&am…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…

Linux学习笔记1---Windows上运行Linux

在正点原子的教程中学习linux需要安装虚拟机或者在电脑上安装一个Ubuntu系统&#xff0c;但个人觉得太麻烦了&#xff0c;现在linux之父加入了微软&#xff0c;因此在Windows上也可以运行linux 了。具体方法如下&#xff1a; 一、 在Windows上的设置 在window的搜索框内&#…

【Java】还不会数组?一文万字全搞定

前言&#xff1a;前面两章我们详细讲解了Java基本程序设计结构中的基本知识&#xff0c;&#xff0c;包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串&#xff0c;输入输出&#xff0c;控…

写爬虫代码抓取Asterank中小行星数据

2024年5月4日 问题来源 解决方案 回顾2023年7月14日自己写的爬虫代码 import requests import re import pandas as pd texts[] def getData(page):#每页评论的网址urlhttps://item.jd.com/51963318622.html#comment#添加headers&#xff0c;伪装成浏览器headers{User-Agent:…

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

vivado 低级别 SVF JTAG 命令、多链 SVF 操作

多链 SVF 操作 以下示例显示了如何在 SVF 链上处理操作。 每个链中连接有 2 个器件 &#xff1a; xcku11 和 xcku9 。配置存储器连接到链中的第 2 个器件 (xcku9) 。为访问此配置存储器 &#xff0c; SVF 会使用 HIR 、 HDR 、 TIR 和 TDR 命令来生成命令。为刷写此…

路由模块封装

目录 一、问题引入 二、步骤 一、问题引入 随着项目内容的不断扩大&#xff0c;路由也会越来越多&#xff0c;把所有的路由配置都堆在main.js中就不太合适了&#xff0c;所以需要将路由模块抽离出来。其好处是&#xff1a;拆分模块&#xff0c;利于维护。 二、步骤 将路由相…