Day3 | Java基础 | 4常见类

news2024/11/18 11:40:20

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 String
    implements 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.coloradmin.cn/o/1657806.html

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

相关文章

单位圆内的正交向量多项式,第一部分:由Zernike多项式的梯度导出的基组

clear all; close all; clc; %% I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存\image\imgs\right\0.bmp)); I2=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.法\image\imgs\right\1.bmp)); I3=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.p\image\imgs…

探秘Tailwind CSS:前端开发的加速器(Tailwind CSS让CSS编写更简洁)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Tailwind CSS 📒📝 快速体验📝 深入学习⚓️ 相关链接 ⚓️📖 介绍 📖 在这个快速迭代的互联网时代,前端开发效率和设计质量的双重要求,使得开发者们不断寻求更高效的工具和方法。今天,我们要介绍的是一个能够极大…

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

IntelliJ IDEA 配置JDK

IntelliJ IDEA-之配置JDK 我们的开发神器IDEA安装好了之后&#xff0c;在实际开发中&#xff0c;我们如何去配置好JDK的版本呢&#xff1f; 注意&#xff1a;需要保证JDK在已经成功安装的情况下&#xff0c;再进行IDEA的配置 现在就行动&#xff0c;让IntelliJ IDEA成为你征…

FebHost:什么是域名DNS服务器?

域名服务器是一种将域名转换为IP地址的计算机。在域名系统&#xff08;DNS&#xff09;中&#xff0c;它起着至关重要的作用。用户只需在浏览器的地址栏输入域名&#xff0c;而无需手动输入网站服务器的IP地址&#xff0c;就可以访问网站。 每个已注册的域名都必须在其DNS记录…

uniapp获取微信小程序头像并上传(前后端代码)

背景 在uniapp实现微信小程序登陆过程中&#xff0c; 我们提供了用户获取自己的头像功能。 但是微信获取的头像都是临时路径。 需要我们进行转换并上传。 本文记录从前后端如何完成这个头像获取&#xff0c;上传到服务器的过程。 //这个就是微信的临时头像路径 wxfile://tmp_…

基于大语言模型的Agent的探索与实践

AI代理是人工智能领域的核心概念之一&#xff0c;它指的是能够在环境中感知、做出决策并采取行动的计算实体。代理可以是简单的&#xff0c;如自动化的网页爬虫&#xff0c;也可以是复杂的&#xff0c;如能够进行战略规划和学习的自主机器人。 AI代理的概念最早源于哲学探讨&am…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

景源畅信电商:抖音小店有哪些比较热门的宣传方法?

抖音小店的热门宣传方法&#xff0c;是许多商家关注的焦点。在数字化营销时代&#xff0c;有效的宣传手段不仅能提升品牌知名度&#xff0c;还能吸引潜在消费者&#xff0c;促进销售。以下是针对抖音小店热门宣传方法的详细阐述&#xff1a; 一、短视频内容营销 作为抖音的核心…

思腾合力受邀参加VALSE 2024视觉与学习青年学者研讨会

在充满学术氛围的五月&#xff0c;思腾合力荣幸受邀参加了于2024年5月5-7日在重庆举行的第十四届VALSE大会。作为视觉与学习领域的顶级交流平台&#xff0c;VALSE大会每年都吸引着全国专家与学者的目光。 本次大会不仅延续了往届的高水平学术研讨&#xff0c;还进一步拓宽了研究…

A100 解析:为何它成为 AI 大模型时代的首选?

前言 NVIDIA A100 Tensor Core GPU 可针对 AI、数据分析和 HPC 应用场景&#xff0c;在不同规模下实现出色的加速&#xff0c;有效助力更高性能的弹性数据中心。A100 采用 NVIDIA Ampere 架构&#xff0c;是 NVIDIA 数据中心平台的引擎。A100 的性能比上一代产品提升高达 20 倍…

Flume进阶

目录 第1关&#xff1a;拦截器的使用 第2关&#xff1a;自定义拦截器 第1关&#xff1a;拦截器的使用 代码文件&#xff1a; # Define source, channel, sink #agent名称为a1# Define source #source类型配置为avro,监听8888端口&#xff0c;后台会自动发送数据到该端口 #拦截后…

Git泄露(CTFHUB的git泄露)

log 当dirsearch 扫描一下&#xff0c;命令&#xff1a; python dirsearch.py -u url/.git 发现存在了git泄露 借助kali里面&#xff0c;打开GitHack所在的目录&#xff0c;然后 输入&#xff1a; python2 GitHack.py -u url/.git/ 必须要用Python2 tree 命令 可以看到…

Paddle 基于ANN(全连接神经网络)的GAN(生成对抗网络)实现

什么是GAN GAN是生成对抗网络&#xff0c;将会根据一个随机向量&#xff0c;实现数据的生成&#xff08;如生成手写数字、生成文本等&#xff09;。 GAN的训练过程中&#xff0c;需要有一个生成器G和一个鉴别器D. 生成器用于生成数据&#xff0c;鉴定器用于鉴定数据的准确性&…

2-6 任务 猜数小游戏(单次版)

本任务要求编写一个猜数小游戏&#xff08;单次版&#xff09;&#xff0c;游戏规则是计算机产生一个0到100之间的随机整数&#xff0c;用户通过输入猜测的数字进行猜测&#xff0c;根据猜测情况给出提示&#xff0c;直到猜对为止。编程思路是利用while循环和多分支结构实现永真…

Linux 第二十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

python面向函数

组织好的&#xff0c;可重复利用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段&#xff0c;避免重复造轮子&#xff0c;增加程序复用性。 定义方法为def 函数名 (参数) 参数可动态传参&#xff0c;即使用*args代表元组形式**kwargs代表字典形式&#xff0c;代替…

探索智能编程新境界:我与Baidu Comate的独特体验之旅

文章目录 一、认识Baidu Comate二、VS Code安装Baidu Comate教程三、Baidu Comate功能体验功能概览具体功能1.根据注释自动生成代码2.函数注释3.行间注释4.代码解释5.生成单元测试6.代码优化7.答疑解惑 四、交互体验五、总结 一、认识Baidu Comate ✨Baidu Comate插件是一款基…

如何在PPT中插入网页?这样操作,免费还高效!

融合课、跨学科课&#xff0c;已经是近两年来教育界的热门词。 在公开课、微课比赛中&#xff0c;不添融合一些较为先进的信息技术&#xff0c;都不好意思拿出手了。 最近&#xff0c;由不坑老师开发制作的Office插件——不坑盒子&#xff0c;实现了在PPT中插入网页&#xff…

鸿蒙开发接口Ability框架:【(StaticSubscriberExtensionAbility)】

StaticSubscriberExtensionAbility StaticSubscriberExtensionAbility模块提供静态订阅者扩展能力的类别的能力。 说明&#xff1a; 本模块首批接口从API version 9 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下…