JAVA的一些便捷性方法(Object)

在IDEA中,如何查看JDK的源码?

CTRL + B;

常用方法:

1.equals()

 booleanequals(Object obj)
          指示其他某个对象是否与此对象“相等”。

与 == 的比较:

==,即可判断基本类型,也可判断引用类型

equals();默认判断引用类型,子类往往重写该方法,用于判断内容是否相等 

 

package com.hspedu.extend_.exercise.object;

public class EqualsExercise01 {
    public static void main(String[] args) {
        Person person1 = new Person("jack", 10, '男');
        Person person2 = new Person("jack", 10, '男');

        System.out.println(person1.equals(person2));//false  --> true
    }
}

class Person{
    private String name;
    private int age;
    private char gender;
    //重写object的equals方法去判断值

    @Override
    public boolean equals(Object obj) {
        //判断如果比较的是同一对象,直接返回true
        if (this == obj) return true;
        //类型判断
        if(obj instanceof Person) {
            //类型转化(因为要取得obj的各个属性)
            Person p = (Person)obj;
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }
        return false;
    }



    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }


}

练习一下:

package com.hspedu.extend_.exercise.object;

public class EqualsExercise02 {
    public static void main(String[] args) {
        String s1 = new String("as");
        String s2 = new String("as");
        System.out.println(s1.equals(s2)); //true,String类中,equals被重写了
        System.out.println(s1 == s2); //false,不是同一个对象

        int it = 65;
        float fl =65.0f;
        System.out.println(it == fl); //true,基本类型判断的是值
        char ch1 = 'A';
        System.out.println(it == ch1);//true,字符本质上是整数
        //System.out.println("hello" == new java.sql.Date());//无关系导致报错
    }
}

2.hashCode()

inthashCode()
          返回该对象的哈希码值。

这个方法的主要目的是为了在使用哈希表的情况下提高查找效率。

哈希表是一种数据结构,它使用哈希函数将键映射到存储桶中。在哈希表中查找键的过程是通过键的哈希值来直接访问存储桶的,这比线性搜索数组或链表等数据结构要快得多。

hashCode() 方法的作用就是计算对象的哈希码,这个哈希码可以用来在哈希表中定位该对象的存储桶。如果两个对象相等(即 equals() 方法返回 true),那么它们的哈希码必须相等。但是,不同的对象可能会产生相同的哈希码,这就是所谓的哈希冲突。

默认情况下,hashCode() 方法的实现是根据对象的内存地址计算出来的,所以对于不同的对象,它们的哈希码通常是不同的。但是,如果你想让两个实际上相等的对象在哈希表中占据同一个位置(即让它们的哈希码相同),那么你可以重写 hashCode() 方法。

例如,对于一个 Person 类,你可能希望根据人的姓名和年龄来重写 hashCode() 方法,而不是根据内存地址。这样做可以提高查找效率,因为如果你在哈希表中查找特定姓名和年龄的人,你只需要比较哈希码就可以了,而不需要比较每个对象的实际内容。

总结:

1)提高具有哈希结构的容器的效率!
2) 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

3) 两个引用,如果指向的是不同对象,则哈希值是不一样的
4) 哈希值主要根据地址号来的!,不能完全将哈希值等价于地址。
5) 后面在集合,中hashCode如果需要的话,也会重写

 3.toString()

StringtoString()
          返回该对象的字符串表示。

 注意点和代码一起写了。

package com.hspedu.extend_.exercise.toString;

public class ToString {
    //Object的toString源码
    //功能为 默认返回:全类名 + @ + 哈希值的十六进制  --> 重写
    //public String toString() {
    //return getClass().getName() + "@" + Integer.toHexString(hashCode());
    //},
    public static void main(String[] args) {
        Monster monster = new Monster("小妖怪", "巡山的", 1000);
        //重写前:com.hspedu.extend_.exercise.toString.Monster@1b6d3586
        System.out.println(monster.toString());
        //重写后Monster{name='小妖怪', job='巡山的', sal=1000.0}

        //当直接输出一个对象后,toString 会默认调用
        System.out.println(monster);
        //结果:Monster{name='小妖怪', job='巡山的', sal=1000.0}
    }

}


class Monster {
    private String name;
    private String job;
    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    //重写toString方法,输出对象属性

    @Override
    public String toString() {
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

 4.finalize()

protected  voidfinalize()
          当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

finalize() 是Java中的一种特殊方法,它在垃圾收集器决定回收对象之前被调用。这个方法是在Java的 Object 类中定义的,所有的类都从 Object 类中继承了这个方法。

finalize() 方法的主要目的是在进行垃圾回收之前,允许程序员执行一些特定的清理操作,如关闭文件或释放系统资源。这个方法的调用是由Java的垃圾收集器自动管理的,你无法直接调用它。

然而,使用 finalize() 方法应该谨慎。首先,这个方法不能保证一定会被调用,因为Java的垃圾收集器无法保证何时运行。其次,如果在程序中依赖 finalize() 方法进行资源清理,那么当程序在多线程环境中运行时,可能会出现资源竞争的问题。此外,如果在 finalize() 方法中出现异常,那么可能会阻止其他资源的正确释放。

因此,尽管 finalize() 方法在某些情况下可能有用,但通常建议使用其他方法来管理资源,例如使用try-with-resources语句来自动关闭资源,或者使用Java的 AutoCloseable 接口和 Closeable 接口来提供更好的资源管理。

package com.hspedu.extend_.exercise;

public class Finalize {
    public static void main(String[] args) {
        Car car = new Car("宝马");
        car = null;
        //默认调用finalize,可以重写自己加业务逻辑
        System.gc();//主动调用垃圾回收器
        System.out.println("退出");
        //退出
        //销毁汽车 宝马
    }
}

class Car {
    private String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable {
        //super.finalize();
        System.out.println("销毁汽车 " + name);  //涉及垃圾回收机制
    }
}

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

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

相关文章

从0开始学习JavaScript--JavaScript对象封装

JavaScript中的对象封装是一种重要的编程概念,它允许将数据和方法组织成一个独立的单元,实现了数据的保护和抽象。本文将深入探讨JavaScript对象封装的原理、实践和最佳实践。 封装的基础概念 封装是面向对象编程的基础概念之一,它强调将数…

笔记十七、认识React的路由插件react-router-dom和基本使用

react-router 分类 web使用 react-router-dom native使用 react-router-native anywhere(使用麻烦) react-router 安装 yarn add react-router-dom main.jsx import React from "react"; import ReactDOM from "react-dom/client"…

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目 九宫幻方https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&name%E4%B9%9D 思路和解题方法 一 (DFS) 首先,定义了一些全局变量和数组。vis数组用于标记已经出现过的数字,a数组用于存储数独的初始状态…

轻松配置PPPoE连接:路由器设置和步骤详解

在家庭网络环境中,我们经常使用PPPoE(点对点协议过夜)连接来接入宽带互联网。然而,对于一些没有网络专业知识的人来说,配置PPPoE连接可能会有些困难。在本文中,我将详细介绍如何轻松配置PPPoE连接&#xff…

动静分离+多实例实验(nginx+tomcat)

Nginx服务器:192.168.188.14:80 Tomcat服务器1:192.168.188.11:80 Tomcat服务器2:192.168.188.12:8080 192.168.188.12:8081 部署Nginx负载均衡器 关闭防火墙 systemctl stop firewalld setenforce 0 安装依赖 yum -y install pcre-dev…

经典神经网络——AlexNet模型论文详解及代码复现

一、背景 AlexNet是在2012年由Alex Krizhevsky等人提出的,该网络在2012年的ImageNet大赛上夺得了冠军,并且错误率比第二名高了很多。Alexnet共有8层结构,前5层为卷积层,后三层为全连接层。 论文地址:ImageNet Classif…

稳定视频扩散数据管理解密【stable video diffusion】

Stability AI 最近于 2023 年 11 月 21 日推出了其最新模型—稳定视频扩散(SVD)。视频生成模型的这一突破取决于数据管理的关键作用。 除了模型检查点之外,他们还发布了一份技术报告。 让我们在 Stability AI 的技术报告和一些引人注目的示例…

LeetCode Hot100 394.字符串解码

题目: 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的…

虚幻学习笔记—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2,两种方式分别为:点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件:这一步很重要,如图2.1.1所示:在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

解密人工智能:线性回归

导言 人工智能(AI)已经成为当今科技领域的热门话题,其应用领域涵盖了各个行业。线性回归作为人工智能中的一种关键统计学方法,被广泛应用于预测和决策支持系统中。本文将为您详细介绍线性回归在人工智能中的应用原理与方法&#x…

相同JS代码,多次混淆加密能得到不同的结果吗?

一份相同的JavaScript代码,进行多次混淆加密,能得到不同的结果吗? 答案是肯定的,能。 JShaman可以实现这个效果。即:加密结果具有多态性、变化性。 下面实测展示。 来到JShaman网站,用它默认的示例代码…

案例分析-FATfs文件系统移植单片机内存不够问题分析和解决

在通过cubeMX自带的FATfs 文件系统在STM32F103C8T6上进行移植,正式调用后,发现系统报错,出现内存空间不足问题。如下: 更改更大容量的单片机进行编译,通过了 说明刚开始分析空间不够是对的,是flash不够还是…

【vue】浏览器安装vue插件不生效

上一篇:浏览器安装vue插件 https://blog.csdn.net/m0_67930426/article/details/134598104 目录 问题情景 解决办法 问题情景 输入框无内容 解决办法 添加 Vue.config.devtools true; 并且控制台不显示的vue又出现

红米手机如何远程控制荣耀手机?

很多人都知道,华为体系有【畅联】,与华为手机或平板“畅连”通话时,可共享屏幕给对方,一边聊天一边演示,还可在屏幕上涂鸦帮助理解。同样,小米体系有【小米通话】,它的远程协助功能可以帮助朋友…

JAVA配置jdk17 Graa1VM

按照网上内容下载好对应的jdk17版本的Graa1VM, 解压后,修改环境变量中的JAVA_HOME为当前的目录,例如 D:\ruanjian\jdk\gra_jdk17\graalvm-ce-java17-22.3.0 。 然后在命令行中输入java -version的时候, 返回的并不是 Graa1VM 相关…

【Java Spring】SpringBoot 五大类注解

文章目录 Spring Boot 注解简介1、五大类注解的作用2、五大类注解的关系3、通过注解获取对象4、获取Bean对象名规则解析 Spring Boot 注解简介 Spring Boot的核心就是注解。Spring Boot通过各种组合注解,极大地简化了Spring项目的搭建和开发。五大类注解是Spring B…

Selenium 连接到现有的 Google Chrome 示例

python 3.7 selenium 3.14.1 urllib3 1.26.8 Google Chrome 119.0.6045.160 (64位) chromedriver.exe 119.0.6045.105(win32) 1 Google Chrome 添加参数 "--remote-debugging-port9222" 2 测试效果(chromedriver.exe 要和 Google Chrome 版本…

vue2使用ts vue-class-component

目前,对于Vue3来说,TypeScript的支持已经相当成熟,但公司的老项目一直处于迭代和维护无法从v2重构成v3,并且重构的成本也是很大的一个问题,所以记录一下vue2如何去搭配TypeScript。 目录 一、脚手架创建项目 二、vu…

【AUTOSAR-DoIP】通过 DoIP 进行符合 Autosar 的车辆诊断

前言 通信协议 DoIP(互联网协议诊断)可通过以太网、WLAN 和移动通信对系统进行灵活而强大的诊断:无论是车间外的诊断还是车载诊断,以及驾驶时的远程访问。 DoIP 可以通过多种方式使用:现代车辆中的电子控制系统高度互连并执行各种复杂的功能。 Autosar 支持的通信协议 Do…

vue3中shallowReactive与shallowRef

shallowReactive与shallowRef shallowReactive: 只处理了对象内最外层属性的响应式(也就是浅响应式) shallowRef: 只处理了value的响应式, 不进行对象的reactive处理 总结: reactive与ref实现的是深度响应式, 而shallowReactive与shallowRef是浅响应式。 什么时候用浅响应…