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

打印 上一主题 下一主题

主题 843|帖子 843|积分 2529

1、Object 类

1.1、什么是 Object 类

Java 通过类来构建代码的布局,类分为两种:
1、Java 提供的工具类,不需要开发者自定义的类,可以直接调用。
2、开发者自定义的类。
Java 程序 = JDK 类库+开发者自定义类+第三方框架
Object 就是 JDK 提供的一个类,并且它很特殊,它是全部类的根节点,Java 中的全部类
包罗 JDK 提供,以及开发者自定义的,第三方框架的全部内容都属于 Object 的派生类。
hashCode:每一个 Java 对象都有本身的 hashCode,什么是 hashCode
在 JVM 内存中将对象存入到一个哈希列表中,返回一个数字类型的映射值,就是该对象的 hashCode。
  1. hashCode 的作用是帮助程序判断两个对象是否相等,比较简单,直接比较两个对象的 hashCode 是否相等,
  2. 1、如果两个对象的 hashCode 不相等,则两个对象一定不是同一个对象。
  3. 2、但是如果两个对象的 hashCode 相等,可能是同一个对象,也可能不是同一个对象。
复制代码
hashCode–>> 利用散列算法将对象的内存地点+内部信息融合到一起。
除了 hashCode 之外,Object 还提供了一个 equals 方法,也是用来判断两个对象是否相等的。
【面试题】
  1. hashCode 和 equals 的区别是什么?如何使用?
  2. 在不重写的情况下,equals 底层就是 = =(双等), 对象的比较,比较的就是 对象内存地址,
  3. 如果比较的是具体数字,equals比较的就是数值。(总之,不管的对象还是数字,都是把栈里面的值拿出来双等对比)
  4. 如果重写了,就另当别论。
  5. hashCode 是返回对象的哈希值。
复制代码
Set 聚集的特点,就是不能存入重复的数据。
Set 判断对象是否相等的时候,将 hashCode 和 equals 结合起来使用的。
1、先用 hashCode 判断两个对象是否相等,假如 hashCode 不相等,则这两个对象肯定不是同一个对象,直接得到结论。
2、假如 hashCode 相等,此时还不能断定两个对象相等,这个就需要再使用 equals 来判断了。
1.2、大概被重写的常用方法

toString:默认返回的是类的信息+hashCode,实际开发中更希望看到的是对象的属性值。
原生的 toString 方法:
  1. public String toString() {
  2.     return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }
复制代码
重写根据类的信息由 IDEA 主动生成一个方法,将属性拼接起来展示。
hashCode:
特殊业务的中,大概需要重写,比如 Student ,根据学生编号来决定它的 hashCode
  1. package com.htl.test;
  2. import java.util.Objects;
  3. public class Student {
  4.     private int id;
  5.     private String name;
  6.     public int getId() {
  7.         return id;
  8.     }
  9.     public void setId(int id) {
  10.         this.id = id;
  11.     }
  12.     public String getName() {
  13.         return name;
  14.     }
  15.     public void setName(String name) {
  16.         this.name = name;
  17.     }
  18.     @Override
  19.     public int hashCode() {
  20.         return 10*id;
  21.     }
  22. }
复制代码
equals:
String 类中的重写,JDK 本身完成的重写
  1. // 默认情况下
  2. String str1 = new String("Hello");
  3. String str2 = new String("Hello");
  4. System.out.println(str1 == str2);                // false
  5. System.out.println(str1.equals(str2));        // true
  6. // 因为默认情况下,每new一个String对象,虽然值一样,但是内存地址却不一样。而==比较的就是内存地址,所以是false。
  7. // 为什么 str1.equals(str2)的结果是true?
  8. // 因为String类对 equals方法重写了。(这时比较的是字符串内容)
复制代码
  1. // String类中的 equals方法源代码。
  2. public boolean equals(Object anObject) {
  3.     if (this == anObject) {
  4.         return true;
  5.     }
  6.     if (anObject instanceof String) {
  7.         String aString = (String)anObject;
  8.         if (!COMPACT_STRINGS || this.coder == aString.coder) {
  9.             return StringLatin1.equals(value, aString.value);
  10.         }
  11.     }
  12.     return false;
  13. }
复制代码
  1. // 上面代码中,StringLatin1.equals()方法
  2. public static boolean equals(byte[] value, byte[] other) {
  3.     if (value.length == other.length) {
  4.         for (int i = 0; i < value.length; i++) {
  5.             if (value[i] != other[i]) {
  6.                 return false;
  7.             }
  8.         }
  9.         return true;
  10.     }
  11.     return false;
  12. }
复制代码
自定义 User 类重写 equals 方法
  1. package com.htl.test;
  2. public class User {
  3.     private int id;
  4.     private String name;
  5.     public int getId() {
  6.         return id;
  7.     }
  8.     public void setId(int id) {
  9.         this.id = id;
  10.     }
  11.     public String getName() {
  12.         return name;
  13.     }
  14.     public void setName(String name) {
  15.         this.name = name;
  16.     }
  17.     @Override
  18.     public String toString() {
  19.         return "User{" +
  20.                 "id=" + id +
  21.                 ", name='" + name + '\'' +
  22.                 '}';
  23.     }
  24.     @Override
  25.     public boolean equals(Object o) {
  26.         if(this == o) return true;
  27.         if(o instanceof User){
  28.             User user = (User) o;
  29.             if(this.id == user.id){
  30.                 return true;
  31.             }
  32.         }
  33.         return false;
  34.     }
  35. }
复制代码
  1. [/code] [size=5]2、包装类[/size]
  2. [size=4]2.1、什么是包装类?[/size]
  3. 把基本数据类型封装成对象,所用到的类就是包装类。
  4. 为什么要将基本数据类型封装成对象?
  5. 基本数据类型不能赋 null
  6. 数据库中会存储业务数据,保不齐字段会有 null 值。
  7. 需要将数据库中的数据读出来,映射成一个对象,根据数据表生成一个对应的类用来存储数据。
  8. null 和 “”
  9. null 压根没有对象
  10. [align=center][img]https://i-blog.csdnimg.cn/direct/acb54a346afa4cb6a1e8b19b5f8b971f.jpeg#pic_center[/img][/align]
  11. “” 有对象,但是值为空
  12. [align=center][img]https://i-blog.csdnimg.cn/direct/d0ac4df6c86d439bbd19c6cc4b93beb5.jpeg#pic_center[/img][/align]
  13. 一共有 8 种包装类
  14. Byte(byte)、Short(short)、Integer(int)、Long(long)
  15. Float(float)、Double(double)、Character(char)、Boolean(boolean)
  16. 都是存放于 java.lang 包中,体系布局。
  17. [align=center][img]https://i-blog.csdnimg.cn/direct/7c2081bc29464041b320aa4535f7697f.jpeg#pic_center[/img][/align]
  18. [size=4]2.2、装箱和拆箱[/size]
  19. 装箱是指将基本数据类型转为对应的包装类
  20. 拆箱是指将包装类类型转为对应的基本数据类型
  21.    装箱的方法
  22.   1、使用构造器
  23. [code]Integer integer1 = new Integer(1);
复制代码

不保举使用,以后尽量别用
2、构造器,参数为 String 类型
  1. Integer integer1 = new Integer("100");
复制代码
3、valueOf 方法
  1. package com.htl.test;
  2. public class Test2 {
  3.     public static void main(String[] args) {
  4.         Integer integer1 = Integer.valueOf(100);
  5.         Byte byte1 = Byte.valueOf((byte)1);
  6.         Short short1 = Short.valueOf((short)1);
  7.         Long long1 = Long.valueOf(1);
  8.         Double double1 = Double.valueOf(10.5);
  9.         Float float1 = Float.valueOf((float) 10.6);
  10.         Character character1 = Character.valueOf('a');
  11.         Boolean boolean1 = Boolean.valueOf("hello");
  12.         System.out.println(boolean1);
  13.     }
  14. }
复制代码
Boolean 的 String 参数方法,假如传入的是 “true” 则效果为 true,否则都为 false。


   拆箱方法
  1、*Value()
每个包管类都有一个 *Value() 方法, * 就是对应的基本数据类型
  1. Integer integer1 = Integer.valueOf(100);
  2. int i = integer1.intValue();
复制代码
2、static parse*(String value)
每个包装类都有一个将 String 转为基本数据类型的方法,除了 Character。
  1. int i = Integer.parseInt("1900");
  2. System.out.println(i);
  3. boolean flag = Boolean.parseBoolean("abc");
  4. System.out.println(flag);
复制代码
实际开发中,使用较多的方法是 parse* 方法,装箱方法用的很少。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表