常用API学习02(Java)

news2024/11/16 18:35:40

Object

在java中,Object是类层次中的根类,即Object是所有类的父类-任何类都是 object的子类。任何一个类的对象都可以使用object来声明。

类<?> getClass()     返回此object的运行

int hashCode()     返回对象的哈希码

protected Object clone()     创建并放回此对象的副本(拷贝)

String toString()     返回对象的字符串表示形式,当打印对象的时候,实际底层在调用这个对象的toString

boolean equals()     指示一些对象是否等于此

事实上还有notify(),notifyAll(),wait()这些都是多线程中使用到的方法,我在之前的博客中有提到。
 

下面演示getClass()和hashCode():

package com.itheima.math;

public class MathDemo03 {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = "abc";
        Object o3 = new int[]{1,2,3,4,5};
        Object o4 = 10.3;

        //getClass 获取对象的实际类型
        System.out.println(o1.getClass());
        System.out.println(o2.getClass());
        System.out.println(o3.getClass());
        System.out.println(o4.getClass());

        //hashCode 获取对象的哈希码
        //哈希码是根据哈希散列算法计算出来的,哈希散列算法不是一个算法而是一套算法
        //哈希散列算法的结果一定是散列的-数据只要有一丁点的不同,那么计算的结果就差别很大
        System.out.println(o1.hashCode());
        System.out.println(o2.hashCode());
        System.out.println(o3.hashCode());
        System.out.println(o4.hashCode());


    }
}

运行结果:

#补充:哈希码是根据哈希散列算法计算出来的,哈希散列算法不是一个算法而是一套算法。哈希散列算法的结果一定是散列的 - 数据只要有一丁点的不同,那么计算的结果就差别很大。同一个对象利用相同的哈希算法计算出来的结果肯定是相同。哈希算法算出来的结果称之为哈希码。哈希值不具有自反性:可以根据对象和哈希算法计算出来哈希码,但是根据哈希码和哈希算退出原始数据是不可能的。

下面演示clone()和toString():

package com.itheima.math;

public class MathDemo04 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("张三",19,"男");
        Person p2 = p1.clone();
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
    }
}
class Person implements Cloneable{
    private String name;
    private int age;
    private String gender;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
    protected Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}

运行结果:

#补充: clone(克隆),在Java中,一个对象想要克隆,那么这个对象的类必须实现Cloneable接口。这个方法中没有任何的方法,只是为了标识当前的类可不可以被克隆。使用clone()时,需要复写clone()。

在打印对象时,如果重写了toString方法,则执行最新的toString方法,如果没有重写,则执行object的toString方法。

 就会打印这些:

下面演示equlas():

package com.itheima.math;

import java.util.Objects;

//null调用任何的属性或者方法都会出现空指针异常
//默认情况下:equals使用==来判断两个对象的,实际上是判断的是两个对象的地址是否相同
public class MathDemo05 {
    public static void main(String[] args) {
        Student s1 = new Student("小丽",18,"女");
        Student s2 = new Student("小丽",18,"女");
        System.out.println(s1.equals(s2));
    }
}
class Student{
    private String name;
    private int age;
    private String sex;

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //重写equals
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name) &&
                Objects.equals(sex, student.sex);
    }
    /*public boolean equals(Object o){
        //判断地址是否相同
        if(this == o)return true;
        //判断参数是否为空
        if(o == null)return false;
        //判断类型是否一致
        if(this.getClass() != o.getClass())return false;
        //强转
        Student s = (Student) o;
        //判断属性
        //判断年龄是否一致
        if(this.age != s.age)return false;
        //姓名是否一致

        return true;
    }*/
}

运行结果:

补充:默认情况下:equals使用==来判断两个对象的,实际上是判断的是两个对象的地址是否相同。null调用任何的属性或者方法都会出现空指针异常(存在参数设置为null的情况,不应该忽视)。仅使用默认情况下的equals是不够的,因为他只会判断地址,而不会判断内容,所以通常情况下,需要去重写equals。

如果我们去掉这个重写的equals,把s1的小丽改为小红,它的运行结果为:

我们再把小红改为小丽:

这玩意压根判断不了,我们把重写的equals给它加上去就可以判断了。

 包括其它参数都是可以判断的。

#这个重写的equals(),可以快捷生成,也可以手写,在idea中可使用快捷键ALT+INSERT找到。

#拓展:

在上面提到的拷贝方法被称之为:浅拷贝

浅拷贝对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值

基本数据类型:保存的是值本身;
引用类型:保存的是指向堆中数据的地址;


浅拷贝对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址,
那么就显而易见了修改拷贝后的值就会影响到拷贝源的值
我们来简单测试一下另外写的代码:

package com.itheima.object;

import java.util.Arrays;

public class Teacher implements Cloneable{
    private String name;
    private int age;
    private int[] id;

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + Arrays.toString(id) +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int[] getId() {
        return id;
    }

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

    public Teacher(String name, int age, int[] id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }
    protected Teacher clone() throws CloneNotSupportedException {
        return (Teacher)super.clone();
    }
}
package com.itheima.object;

public class ObjectDemo01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] id1 = {1,2,3,4,5,6,7,8,9,10};
        Teacher t1 = new Teacher("李章",47,id1);
        Teacher t2 = t1.clone();
        System.out.println(t1);
        System.out.println(t2);
    }
}

那么这段代码的运行结果是这样的:

此时,我们对代码进行一点小修改:

package com.itheima.object;

public class ObjectDemo01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] id1 = {1,2,3,4,5,6,7,8,9,10};
        Teacher t1 = new Teacher("李章",47,id1);
        Teacher t2 = t1.clone();
        id1[9] = 0;
        System.out.println(t1);
        System.out.println(t2);
    }
}

因为我们是拷贝过来的,当我们需要一个与源文件一样的副本,都是又希望这个副本是独立的,就不会希望出现这种情况:

 会发现明明在拷贝完成后修改的数据,副本依旧出现了变化,这是因为对于引用数据类型,它保存的不是数据本身,而是数据在数据堆中的地址。也就是”浅拷贝“

下面介绍深拷贝:

深拷贝又成为深度拷贝,所拷贝的对象的内部的引用类型也需要实现clone()这个方法,其目的就是实现对引用数据也拷贝其本身。

由于手写深拷贝过于麻烦,遇到数据量大的代码直接无从下手,所以这里我们建议使用第三方工具:

将jar包导入到idea或者eclipse中即可。

像这样可以打开的,就说明导入成功了。

接下来展示用第三方工具实现深拷贝:

package com.itheima.object;

import com.google.gson.Gson;

public class ObjectDemo01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] id1 = {1,2,3,4,5,6,7,8,9,10};
        Teacher t1 = new Teacher("李章",47,id1);
        System.out.println(t1);
        //编写代码
        Gson gson = new Gson();
        //把对象变成一个字符串
        String s = gson.toJson(t1);
        //再把字符串变会对象就可以了
        Teacher t2 = gson.fromJson(s,Teacher.class);
        //打印对象
        System.out.println(t2);
    }
}

这是还没进行操作的运行结果:

接下来我们对引用数据进行修改:

package com.itheima.object;

import com.google.gson.Gson;

public class ObjectDemo01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] id1 = {1,2,3,4,5,6,7,8,9,10};
        Teacher t1 = new Teacher("李章",47,id1);
        //编写代码
        Gson gson = new Gson();
        //把对象变成一个字符串
        String s = gson.toJson(t1);
        //再把字符串变会对象就可以了
        Teacher t2 = gson.fromJson(s,Teacher.class);
        //打印对象
        int[] id2 = {9,8,7,6,5,4,3,2,1};
        t2.setId(id2);
        System.out.println(t1);
        System.out.println(t2);
    }
}

 改动后运行结果:

 我们发现引用数据并没有受到影响,那么这个时候就实现了深拷贝

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

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

相关文章

Day53| 1143.最长公共子序列、1035.不相交的线 、 53. 最大子序和 动态规划

1143.最长公共子序列 1.题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺…

SEED实验复现

SEED 项目由雪城大学教授杜文亮于 2002 年启动雪城大学。它由美国总共1万美元资助 美国国家科学基金会。现在&#xff0c;SEED 实验室正在被超过 全球数千个研究所。SEED 代表 &#xff08;SEcurity EDucaton&#xff09;。 https://github.com/seed-labs/seed-labs 该项目使用…

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就…

spring boot面向切面编程aop

一、什么是AOP AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程 举个例子来理解 如果我们的业务需要额外做三件事情&#xff0c;判断是否已经登录&#xff0c;记录日志&#xff0c;统计业务执行时长 传统的做法是这样子的&#xff1a; 而apo的实现是这…

vue2的数据数据双向绑定

遍历data里面的属性&#xff0c;通过Object.defineProperty的set方法监听属性值的变化&#xff0c;最后通知视图更新 先问自己两个问题&#xff1a; 1.app.message修改数据的时候&#xff0c;Vue内部是如何监听message数据发生改变的 使用Object.defineProperty ->监听对…

概率论的学习和整理17:EXCEL里直接对应的分布公式计算概率(未完成)

1EXCEL计算这些特殊分布的方差 1.1 用原始的概率&#xff0c;期望和方差的方法 虽然计算概率&#xff0c;需要用对应分布的公式P(xn) 想了解的随机变量是总次数n&#xff0c;需要对应几何分布&#xff0c;负二项分布P(xk) 想了解的随机变量是成功次数k&#xff0c;需要对应超几…

算法竞赛,机器学习,深度学习ai学习方向如何规划,搭建环境等答疑

目录 1了解人工智能的背景知识 2 补充数学或编程知识 3 熟悉机器学习工具库 4 系统的学习人工智能 5 动手去做一些AI应用 1了解人工智能的背景知识 本文可以让你避免踩坑走弯路&#xff0c;一些虽然存在但是在研究或者工业上不常用的知识&#xff0c;为自己腾出更多的时间…

Ubuntu软件包安装失败:代码 bionic 和 focal的区别

问题 我在Ubuntu上使用apt安装软件时总是报一些错误&#xff0c;不是版本不对&#xff0c;就是依赖关系不对。尝试了各种方法&#xff0c;突然想到是不是软件源有问题。 查看/etc/apt/sources.list文件&#xff0c;发现使用了阿里云的软件源&#xff1a; deb http://mirrors…

FreeRTOS实时操作系统(十六)内存管理

系列文章 FreeRTOS实时操作系统&#xff08;一&#xff09;RTOS的基本概念 FreeRTOS实时操作系统&#xff08;二&#xff09;任务创建与任务删除&#xff08;HAL库&#xff09; FreeRTOS实时操作系统&#xff08;三&#xff09;任务挂起与恢复 FreeRTOS实时操作系统&#x…

Android调用google原生裁剪,兼容三方相册裁剪功能

Android调用google原生裁剪&#xff0c;兼容三方相册裁剪功能 效果图实现功能编写CropImage类继承 ActivityResultContract调用 效果图 实现功能 本篇文章裁剪功能实现兼容Android6&#xff0c;解决部分google手机&#xff08;有部分Android10的Google手机无法使用google自带裁…

“遇见0和1”小程序正式开源

开源地址 https://gitee.com/lingstudy/meet0and1-applets-share 纯云开发&#xff1a;微信小程序 —“遇见0和1”开源发布 关于小程序 小程序前端使用 ColorUI 组件库&#xff0c;并且参考了大佬“爱敲代码的猫” 的开源项目 WeHalo 的页面设计&#xff0c;后端使用小程序纯云…

stm32读写nand flash

文章目录 1.简介2.频率设置3.FSMC参数设置4.修改宏定义 NAND_DEVICE5.程序测试5.1.简单测试5.2.擦除、写入、读取测试 注意 1.简介 目前我在使用stm32f407ZGT6来读写三星的nand flash【K9F1G08U0E】。 板子我是在这里买的 【STM32F407ZGT6最小系统板/核心板/转接板/开发板/加1…

Python应用实例(二)数据可视化(一)

数据可视化&#xff08;一&#xff09; 1.安装Matplotlib2.绘制简单的折线图2.1 修改标签文字和线条粗细2.2 矫正图形2.3 使用内置样式2.4 使用scatter()绘制散点图并设置样式2.5 使用scatter()绘制一系列点2.6 自动计算数据2.7 自定义颜色2.8 使用颜色映射2.9 自动保存图表 数…

QT实现雷达扫描

参考链接&#xff1a;https://www.jb51.net/article/279998.htm 在此基础上做了优化。 效果图&#xff1a; 鼠标左键点击显示当前点相对于圆心的距离和方位 // 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <Q…

Java并发编程(11) —— CountDownLatch原理详解

一、CountDownLatch介绍 在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务&#xff0c;并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。在 CountDownLatch 出现之前一般都使用线程的join()方法来实现这一点&#xff0c;但是 join 方法不够灵活&…

jq实现网站-点击标签,添加到一个盒子中,再次点击去掉该标签

实现效果&#xff1a; 代码逻辑&#xff1a; 首先使用hasClass()方法判断点击的标签是否已经存在于盒子中。如果标签已经存在于盒子中&#xff0c;则使用removeClass()方法移除标签的’active’类名&#xff0c;并使用filter()方法找到盒子中与点击的标签文本相同的元素&#…

CAN总线(三)CAN总线链路层的三个标准

1、高速CAN总线 ISO 11898-2中定义了通信速率为125Kbps~1Mbps的高速闭环CAN通信标准,当通信总线长度≤40米,最大通信速率可达到1Mbps,高速闭环CAN(高速CAN)通信如下图所示: 1.1、电气特性 高速CAN总线上为显性电平(逻辑0)时,CAN_H为3.5V、CAN_L为1.5V,此时电压差是…

Qt应用开发——下载安装和HelloWorld

目录 1、下载和安装 2、HelloWorld 1、下载和安装 工欲善其事&#xff0c;必先利其器。第一步环境安装好是必要的过程。Qt 在23年4月份已经更新到了6.5.0&#xff0c;相对于其他的工具&#xff0c;Qt不断在维护升级这一点就非常的友好&#xff0c;这里对版本的迭代更新内容不…

由变上限积分求导到随机变量的概率分布

变上限积分求导书推导 推导过程根据导数的定义和积分的几何意义&#xff0c;看图&#xff1a; 随机变量的概率密度推导 若随机变量x 在 &#xff08;负无穷&#xff0c;正无穷&#xff09;的区间上服从f(x)的概率密度&#xff0c;设y g(x), x h(y)&#xff0c;求y 的概率…

web前端开发工程师的工作职责(合集)

web前端开发工程师的工作职责1 职责&#xff1a; 1.Web前端功能设计、开发和实现&#xff0c;与后台工程师协作&#xff0c;完成数据交互、动态展现; 2.对UI设计的结果进行页面制作(CSS/css3xhtml[表情]ml5JS); 3.熟悉编写可复用的用户接口组件; 4.从视觉和易用性角度&…