学习笔记073——Java中的【Object】和【包装类】

news2024/12/20 0:10:29

文章目录

  • 1、Object 类
    • 1.1、什么是 Object 类
    • 1.2、可能被重写的常用方法
  • 2、包装类
    • 2.1、什么是包装类?
    • 2.2、装箱和拆箱

1、Object 类

1.1、什么是 Object 类

Java 通过类来构建代码的结构,类分为两种:

1、Java 提供的工具类,不需要开发者自定义的类,可以直接调用。

2、开发者自定义的类。

Java 程序 = JDK 类库+开发者自定义类+第三方框架

Object 就是 JDK 提供的一个类,并且它很特殊,它是所有类的根节点,Java 中的所有类

包括 JDK 提供,以及开发者自定义的,第三方框架的所有内容都属于 Object 的派生类。

hashCode:每一个 Java 对象都有自己的 hashCode,什么是 hashCode

在 JVM 内存中将对象存入到一个哈希列表中,返回一个数字类型的映射值,就是该对象的 hashCode。

hashCode 的作用是帮助程序判断两个对象是否相等,比较简单,直接比较两个对象的 hashCode 是否相等,

1、如果两个对象的 hashCode 不相等,则两个对象一定不是同一个对象。

2、但是如果两个对象的 hashCode 相等,可能是同一个对象,也可能不是同一个对象。

hashCode–>> 利用散列算法将对象的内存地址+内部信息融合到一起。

除了 hashCode 之外,Object 还提供了一个 equals 方法,也是用来判断两个对象是否相等的

【面试题】

hashCode 和 equals 的区别是什么?如何使用?

在不重写的情况下,equals 底层就是 = =(双等), 对象的比较,比较的就是 对象内存地址,
如果比较的是具体数字,equals比较的就是数值。(总之,不管的对象还是数字,都是把栈里面的值拿出来双等对比)
如果重写了,就另当别论。

hashCode 是返回对象的哈希值。

Set 集合的特点,就是不能存入重复的数据。

Set 判断对象是否相等的时候,将 hashCode 和 equals 结合起来使用的。

1、先用 hashCode 判断两个对象是否相等,如果 hashCode 不相等,则这两个对象肯定不是同一个对象,直接得到结论。

2、如果 hashCode 相等,此时还不能断定两个对象相等,这个就需要再使用 equals 来判断了。

1.2、可能被重写的常用方法

toString:默认返回的是类的信息+hashCode,实际开发中更希望看到的是对象的属性值。

原生的 toString 方法:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

重写根据类的信息由 IDEA 自动生成一个方法,将属性拼接起来展示。

hashCode:

特殊业务的中,可能需要重写,比如 Student ,根据学生编号来决定它的 hashCode

package com.htl.test;

import java.util.Objects;

public class Student {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return 10*id;
    }
}

equals:

String 类中的重写,JDK 自己完成的重写

// 默认情况下
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);		// false
System.out.println(str1.equals(str2));	// true
// 因为默认情况下,每new一个String对象,虽然值一样,但是内存地址却不一样。而==比较的就是内存地址,所以是false。
// 为什么 str1.equals(str2)的结果是true?
// 因为String类对 equals方法重写了。(这时比较的是字符串内容)
// String类中的 equals方法源代码。
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (!COMPACT_STRINGS || this.coder == aString.coder) {
            return StringLatin1.equals(value, aString.value);
        }
    }
    return false;
}
// 上面代码中,StringLatin1.equals()方法
public static boolean equals(byte[] value, byte[] other) {
    if (value.length == other.length) {
        for (int i = 0; i < value.length; i++) {
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

自定义 User 类重写 equals 方法

package com.htl.test;

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if(this == o) return true;
        if(o instanceof User){
            User user = (User) o;
            if(this.id == user.id){
                return true;
            }
        }
        return false;
    }

}

2、包装类

2.1、什么是包装类?

把基本数据类型封装成对象,所用到的类就是包装类。

为什么要将基本数据类型封装成对象?

基本数据类型不能赋 null

数据库中会存储业务数据,保不齐字段会有 null 值。

需要将数据库中的数据读出来,映射成一个对象,根据数据表生成一个对应的类用来存储数据。

null 和 “”

null 压根没有对象

在这里插入图片描述

“” 有对象,但是值为空

在这里插入图片描述

一共有 8 种包装类

Byte(byte)、Short(short)、Integer(int)、Long(long)

Float(float)、Double(double)、Character(char)、Boolean(boolean)

都是存放于 java.lang 包中,体系结构。

在这里插入图片描述

2.2、装箱和拆箱

装箱是指将基本数据类型转为对应的包装类

拆箱是指将包装类类型转为对应的基本数据类型

装箱的方法

1、使用构造器

Integer integer1 = new Integer(1);

在这里插入图片描述

不推荐使用,以后尽量别用

2、构造器,参数为 String 类型

Integer integer1 = new Integer("100");

3、valueOf 方法

package com.htl.test;

public class Test2 {
    public static void main(String[] args) {
        Integer integer1 = Integer.valueOf(100);
        Byte byte1 = Byte.valueOf((byte)1);
        Short short1 = Short.valueOf((short)1);
        Long long1 = Long.valueOf(1);
        Double double1 = Double.valueOf(10.5);
        Float float1 = Float.valueOf((float) 10.6);
        Character character1 = Character.valueOf('a');
        Boolean boolean1 = Boolean.valueOf("hello");
        System.out.println(boolean1);
    }
}

Boolean 的 String 参数方法,如果传入的是 “true” 则结果为 true,否则都为 false。

在这里插入图片描述

在这里插入图片描述

拆箱方法

1、*Value()

每个保证类都有一个 *Value() 方法, * 就是对应的基本数据类型

Integer integer1 = Integer.valueOf(100);
int i = integer1.intValue();

2、static parse*(String value)

每个包装类都有一个将 String 转为基本数据类型的方法,除了 Character。

int i = Integer.parseInt("1900");
System.out.println(i);
boolean flag = Boolean.parseBoolean("abc");
System.out.println(flag);

实际开发中,使用较多的方法是 parse* 方法,装箱方法用的很少。

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

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

相关文章

面向预测性维护的TinyML技术栈全面综述

论文标题&#xff1a;A Holistic Review of the TinyML Stack for Predictive Maintenance&#xff08;面向预测性维护的TinyML技术栈全面综述&#xff09; 作者信息&#xff1a;Emil Njor, Mohammad Amin Hasanpour, Jan Madsen, Xenofon Fafoutis&#xff0c;均来自丹麦技术…

【MySQL】InnoDB引擎中的Compact行格式

目录 1、背景2、数据示例3、Compact解释【1】组成【2】头部信息【3】隐藏列【4】数据列 4、总结 1、背景 mysql中数据存储是存储引擎干的事&#xff0c;InnoDB存储引擎以页为单位存储数据&#xff0c;每个页的大小为16KB&#xff0c;平时我们操作数据库都是以行为单位进行增删…

【SpringAOP】深入浅出SpringAOP从原理到源码

AOP对象是如何创建的 对于熟悉Spring IOC流程源码的同学来说&#xff0c;一定了解bean的整个生命周期&#xff0c;也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说&#xff0c;是如何保证需要创建代理的对象创建代理的呢。 从图中可以看到&#xff0c;本质…

VMware虚拟机Ubuntu 18.04版本 磁盘扩容

一、版本配置 虚拟机版本&#xff1a;VMware WORKSTATION 16 PRO Ubuntu版本&#xff1a;Ubuntu 18.04 二、磁盘大小介绍 目的&#xff1a;磁盘扩容&#xff08;20G----->100G&#xff09;&#xff0c;从20G扩到100G 查看磁盘大小命令&#xff1a;df -h 扩容前的磁盘大小 …

QT多线程(二):基于互斥锁与读写锁的线程同步

此处需要说明的是&#xff0c;这里的线程同步概念与操作系统中的线程同步并无区别&#xff0c;都是避免多个线程同时访问临界区数据可能产生的读写错误问题。在 Qt 中&#xff0c;有多个类可以实现线程同步的功能&#xff0c;这些类包括 QMutex、QMutexLocker、 QReadWriteLock…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

重新定义页签!Choerodon UI Tabs让管理更高效

01 引言 Tabs 组件通过提供平级区域&#xff0c;将大块内容进行有效的收纳和展现&#xff0c;从而保持界面整洁。但在企业应用的快速发展中&#xff0c;这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…

机器学习之偏差

机器学习中的偏差&#xff08;Bias&#xff09;是指模型的预测值与真实值之间的系统性误差&#xff0c;或者说模型无法准确捕捉数据中复杂模式的能力。偏差通常与模型的假设或学习能力有关&#xff0c;过高的偏差会导致模型的性能不佳&#xff0c;表现为欠拟合。 偏差的来源 模…

SSH连接监控以及新用户创建和系统资源访问限制

目录 监控连接数SSH连接数的限制和影响理论限制可能的影响 创建SSH新用户为每个ssh用户配置系统资源限制1. 使用 /etc/security/limits.conf 限制资源2. 使用 cgroups 控制资源3. 磁盘配额限制4. 限制 SSH 访问5. 使用 PAM 限制6. 监控脚本示例7. 设置定期任务清理8. 检查配置是…

测试工程师八股文04|计算机网络 和 其他

一、计算机网络 1、http和https的区别 HTTP和HTTPS是用于在互联网上传输数据的协议。它们都是应用层协议&#xff0c;建立在TCP/IP协议栈之上&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 ①http和https的主要区别在于安全性。http是一种明…

单片机学习笔记——入门51单片机

一、单片机基础介绍 1.何为单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&a…

【青牛科技】D8563是低功耗的CMOS实时时钟/日历电路,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过IC总线接口串行传递。

概述&#xff1a; D8563是低功耗的CMOS实时时钟/日历电路,它提供一个可编程时钟输出&#xff0c;一个中断输出和掉电检测器&#xff0c;所有的地址和数据通过IC总线接口串行传递。最大总线速度为400Kbitss每次读写数据后&#xff0c;内嵌的字地址寄存器会自动产生增量。 主要特…

安卓获取所有可用摄像头并指定预览

在Android设备中&#xff0c;做预览拍照的需求的时候&#xff0c;我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板&#xff0c;那么就会遇到多摄像头以及外置摄像头问题&#xff0c;简单的指…

R语言学习笔记-1

1. 基础操作和函数 清空环境&#xff1a;rm(list ls()) 用于清空当前的R环境。 打印输出&#xff1a;print("Hello, world") 用于输出文本到控制台。 查看已安装包和加载包&#xff1a; search()&#xff1a;查看当前加载的包。install.packages("package_na…

Windows如何安装go环境,离线安装beego

一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件&#xff1a;分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件&#xff0c;然后解压到指定的路径 2、配置环境变量 需要新建两个环境…

Mac上使用ln指令创建软链接、硬链接

在Mac、Linux和Unix系统中&#xff0c;软连接&#xff08;Symbolic Link&#xff09;和硬连接&#xff08;Hard Link&#xff09;是两种不同的文件链接方式。它们的主要区别如下&#xff1a; 区别&#xff1a; 硬连接&#xff1a; 不能跨文件系统。不能链接目录&#xff08;为…

Unity A*算法实现+演示

注意&#xff1a; 本文是对基于下方文章链接的理论&#xff0c;并最终代码实现&#xff0c;感谢作者大大的描述&#xff0c;非常详细&#xff0c;流程稍微做了些改动&#xff0c;文末有工程网盘链接&#xff0c;感兴趣的可以下载。 A*算法详解(个人认为最详细,最通俗易懂的一…

博弈论3:图游戏SG函数(Graph Games)

目录 一、图游戏是什么 1.游戏特征 2.游戏实例 二、图游戏的必胜策略 1.SG 函数&#xff08;Sprague-Grundy Function&#xff09; 2.必胜策略&#xff08;利用SG函数&#xff09; 3.拿走游戏转化成图游戏&#xff08;Take-away Game -> Graph Game&#xff09; 一、图…

0101多级nginx代理websocket配置-nginx-web服务器

1. 前言 项目一些信息需要通过站内信主动推动给用户&#xff0c;使用websocket。web服务器选用nginx&#xff0c;但是域名是以前通过阿里云申请的&#xff0c;解析ip也是阿里云的服务器&#xff0c;甲方不希望更换域名。新的系统需要部署在内网服务器&#xff0c;简单拓扑图如…

qt-C++笔记之自定义类继承自 `QObject` 与 `QWidget` 及开发方式详解

qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式详解 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QW…