欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 学习笔记073——Java中的【Object】和【包装类】

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

2024/12/22 0:01:28 来源:https://blog.csdn.net/code__bee/article/details/144497687  浏览:    关键词:学习笔记073——Java中的【Object】和【包装类】

文章目录

  • 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;}@Overridepublic 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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}@Overridepublic 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* 方法,装箱方法用的很少。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com