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 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.mfbz.cn/a/607610.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】适配器模式

文章目录 前言 1. 适配器的介绍2. 仿函数2.1 sort函数的模板参数2.2 priority_queue类的模板参数 3. priority_queue模拟实现3. stack & queue 模拟实现3.1 deque的介绍3.2 deque的优点与缺陷3.3 STL标准库中对于stack和queue的模拟实现 前言 C中的适配器是一种设计模式&am…

【强训笔记】day16

NO.1 代码实现&#xff1a; class StringFormat { public:string formatString(string A, int n, vector<char> arg, int m) {string ret;int j0;for(int i0;i<n;i){if(A[i]%){if(i1<n&&A[i1]s){retarg[j];i;}else {retA[i];}}else {retA[i];}}while(j&l…

wlan二层旁挂组网实验

实验拓扑图 代码&#xff1a; SW1 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn sw1 [sw1]undo info-center enable Info: Information center is disabled. [sw1]vlan batch 10 20 30 Info: This operation may take a few seconds. …

基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园悬赏任务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口&#xff0c;并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后&#xff0c;系统将自动生成…

二分查找向下取整导致的死循环69. x 的平方根

二分查找向下取整导致的死循环 考虑伪题目&#xff1a;从数组arr中查找出目标元素target对应的下标&#xff0c;如果数组中不存在目标元素&#xff0c;找 到第一个元素值小于target的元素的下标。 编写二分查找算法如下&#xff1a; Testvoid testBinarySearch(){int[] arr n…

LeetCode 142.环形链表Ⅱ

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

CSS和JavaScript

CSS 在html中引入CSS 我们需要先在该项目先建立css文件 html引入CSS,在<head></head>中添加<link>标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

JavaScript原理篇——理解对象、构造函数、原型、继承

对象:在JavaScript中&#xff0c;几乎所有的东西都是对象&#xff0c;包括基本数据类型的包装对象。对象是属性的集合&#xff0c;每个属性都有一个键和一个值。对象可以通过字面量、构造函数或Object.create()等方式创建。 构造函数:构造函数是用来创建对象的函数&#xff0c;…

5月9(信息差)

&#x1f30d; 可再生能源发电量首次占全球电力供应的三成 &#x1f384;马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界&#xff0c;实现控制机械臂、轮椅等 马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界&#xff0c;实现控制机械臂、轮椅等…

Python turtle绘制图形详解

Python 的 Turtle 模块是一个简单而直观的绘图工具&#xff0c;可以帮助初学者理解基本的图形绘制概念。 1.导入 Turtle 模块&#xff1a; import turtle 2.创建 Turtle 对象&#xff1a; t turtle.Turtle() 3.绘制图形&#xff1a; 4.移动Turtle对象&#xff1a;t.forward(di…

【PMP战报】2024.3.10 PMP考试成绩出炉

PMP成绩查询及电子版证书下载 https://mp.weixin.qq.com/s/HgWrZWjJ0cScEYs4w1b4iwPMP项目管理学习专栏https://blog.csdn.net/xmws_it/category_10954848.html?spm1001.2014.3001.5482 2024年3月中国大陆的认证考试已经顺利结束。 从2024年5月7日开始&#xff0c;大约一周内…

小程序如何注销

随着移动互联网的深入发展&#xff0c;管控也越来越严格。现在小程序都要求进行ICP备案&#xff0c;不管是新注册的还是以往注册的。很多商家的小程序本身处于无运营状态&#xff0c;现在要求备案&#xff0c;还不如直接注销。下面&#xff0c;将详细介绍小程序注销的步骤和注意…

报错(已解决):无法加载文件 D:\code\NodeJs\pnpm.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; 在vscode运行uniapp项目需要拉取全部依赖&#xff0c;需要使用到pnpm&#xff0c;在vscode终端运行命令&#xff1a;pnpm install后报错&#xff1a; 解决办法&#xff1a; 1&#xff1a;我未安装pnpm&#xff0c;首先打开电脑cmd&#xff0c;运行下列命令&a…

XXL-JOB定时任务

1. xxl-job初识 1.1 xxl-job介绍 xxl-job 是大众点评大佬徐雪里开源的一款分布式任务调度框架&#xff0c;具有简单易用、轻量级、可扩展的特点。相比于Spring Task, Quartz&#xff0c;xxl-job有记录执行日志和运行大盘&#xff0c;方便开发人员和运维人员更好的管理任务。 …

震惊,现在面试都加科技与狠货了

震惊&#xff0c;现在面试都加科技与狠货了 生成式AI盛行的现在&#xff0c;程序员找工作变容易了吗我和老痒喝着大酒&#xff0c;吃着他的高升宴&#xff0c;听他说他面试的各种细节&#xff0c;老狗我只恨自己动作慢了一步&#xff0c;不然现在在那侃侃而谈的就是我了。 面试…

基于springboot+jsp+Mysql的商务安全邮箱邮件收发

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

概述: 大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。 什么是LL…

探索全新商业模式:循环购的奥秘

你是否曾经遇到过这样的疑问&#xff1a;为何有的商家会推出“消费1000送2000”的优惠活动&#xff1f;每天还有钱可以领取&#xff0c;甚至还能提现&#xff1f;这背后究竟隐藏着怎样的商业逻辑&#xff1f;今天&#xff0c;作为你们的私域电商顾问&#xff0c;我将带大家深入…

【C++】继承 — 继承的引入、赋值切片详细讲解

前言 我们知道C语言是一门面向对象编程的语言&#xff0c;而面向对象编程有三大特性&#xff0c;它们分别是&#xff1a; 封装继承多态 目录 1. 继承的概念及定义1.1继承的概念1.2继承的定义格式1.3 继承的使用 2 基类和派生类对象赋值转换3 继承中的作用域3.1 派生类对象的存…
最新文章