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;
- }
- }
复制代码- [/code] [size=5]2、包装类[/size]
- [size=4]2.1、什么是包装类?[/size]
- 把基本数据类型封装成对象,所用到的类就是包装类。
- 为什么要将基本数据类型封装成对象?
- 基本数据类型不能赋 null
- 数据库中会存储业务数据,保不齐字段会有 null 值。
- 需要将数据库中的数据读出来,映射成一个对象,根据数据表生成一个对应的类用来存储数据。
- null 和 “”
- null 压根没有对象
- [align=center][img]https://i-blog.csdnimg.cn/direct/acb54a346afa4cb6a1e8b19b5f8b971f.jpeg#pic_center[/img][/align]
- “” 有对象,但是值为空
- [align=center][img]https://i-blog.csdnimg.cn/direct/d0ac4df6c86d439bbd19c6cc4b93beb5.jpeg#pic_center[/img][/align]
- 一共有 8 种包装类
- Byte(byte)、Short(short)、Integer(int)、Long(long)
- Float(float)、Double(double)、Character(char)、Boolean(boolean)
- 都是存放于 java.lang 包中,体系布局。
- [align=center][img]https://i-blog.csdnimg.cn/direct/7c2081bc29464041b320aa4535f7697f.jpeg#pic_center[/img][/align]
- [size=4]2.2、装箱和拆箱[/size]
- 装箱是指将基本数据类型转为对应的包装类
- 拆箱是指将包装类类型转为对应的基本数据类型
- 装箱的方法
- 1、使用构造器
- [code]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* 方法,装箱方法用的很少。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |