Java 基础(六)封装类 Object类

Java基础学习笔记:==、equals与包装类的核心考点

哈喽~今天又啃了一波Java基础知识点,主要聚焦在==equals的区别、hashCode的关联,还有包装类的那些易踩坑点,整理成笔记方便以后回顾~

一、== 与 equals:别再傻傻分不清

首先要明确,==equals 不是一回事,核心区别先拎清楚:

  1. == 的比较规则

    • 基本数据类型:比较的是 是否相等(比如int a=10, b=10; a==b → true);
    • 引用数据类型:比较的是内存地址是否相等(毕竟引用类型变量存的是对象的内存地址)。
  2. equals 方法的本质

    • equalsObject类的原生方法,所有类都默认继承,原生equals底层其实就是==(本质还是比较地址);
    • 但很多常用类会重写equals,比如String类:先判断地址(==),地址不同再逐字符比较内容,所以Stringequals是比较内容是否相等;
    • 自定义类(比如示例里的Cat类):如果只重写equals不重写hashCode,会导致HashSet去重失效!因为HashSet是靠hashCode判断对象是否重复(hashCode默认是对象地址的哈希值),即便equals返回true,只要hashCode不同,HashSet仍认为是两个对象。
      ✨ 划重点:重写equals时必须重写hashCode,保证"相等的对象必须有相等的hashCode"(这是Java的约定)。

二、包装类:基本数据类型的"对象化"改造

Java里"万物皆对象",但8种基本数据类型(int、long、float、double、boolean、char、byte、short)并不是对象,包装类就是为了弥补这个短板而生~

  1. 基本数据类型 ↔ 包装类对应关系

    | 基本数据类型 | 包装类 |

    |--------------|--------------|

    | int | Integer |

    | long | Long |

    | float | Float |

    | double | Double |

    | boolean | Boolean |

    | char | Character |

    | byte | Byte |

    | short | Short |

  2. 自动拆装箱(编译期语法糖)

  • 自动装箱:基本类型 → 包装类,编译时会被替换成valueOf()方法
    比如Integer c = 10; → 编译后实际是Integer c = Integer.valueOf(10);
  • 自动拆箱:包装类 → 基本类型,编译时会被替换成xxxValue()方法
    比如int a = c; → 编译后实际是int a = c.intValue();
  1. 经典坑:Integer的"128陷阱"
    测试代码里发现一个有趣的现象:
java 复制代码
Integer d = 128;
Integer e = 128;
System.out.println(d == e); // false
Integer f = 127;
Integer g = 127;
System.out.println(f == g); // true

原因藏在Integer.valueOf()的源码里:

JDK为了优化性能,给-128~127的Integer值做了缓存(一个叫cache的数组)。当自动装箱的值在这个区间时,直接返回缓存里的对象地址;超出区间则新建Integer对象,所以地址不同,==比较就为false

✨ 提醒:比较Integer值建议用equals,而非==

三、补全:基本数据类型与字符串的互转方法

日常开发中经常要把字符串转成基本类型,或把基本类型转成字符串,整理了全量转换方法,再也不用翻源码啦~

1. 字符串 → 各基本数据类型(核心:各包装类的parseXxx()/valueOf()
目标类型 转换方法(示例) 备注
int String s = "123"; int num = Integer.parseInt(s);Integer numObj = Integer.valueOf(s); 超出int范围会抛NumberFormatException
long String s = "123456"; long num = Long.parseLong(s);Long numObj = Long.valueOf(s); -
float String s = "12.3"; float num = Float.parseFloat(s);Float numObj = Float.valueOf(s); 支持科学计数法(如"1.23e2")
double String s = "12.345"; double num = Double.parseDouble(s);Double numObj = Double.valueOf(s); -
boolean String s = "true"; boolean flag = Boolean.parseBoolean(s);Boolean flagObj = Boolean.valueOf(s); 非"true"(忽略大小写)都返回false
char String s = "A"; char ch = s.charAt(0); 字符串转单个字符(无parseChar方法)
byte String s = "127"; byte num = Byte.parseByte(s);Byte numObj = Byte.valueOf(s); byte范围:-128~127
short String s = "32767"; short num = Short.parseShort(s);Short numObj = Short.valueOf(s); short范围:-32768~32767
2. 基本数据类型 → 字符串(3种通用方式)

方法1:拼接空字符串(最简单,可读性高)

java 复制代码
int a = 123;
String s = a + "";

boolean flag = true;
String s2 = flag + "";

方法2:使用String.valueOf()(推荐,无异常风险)

java 复制代码
int a = 123;
String s = String.valueOf(a);

long b = 123456;
String s2 = String.valueOf(b);

float f = 12.3f;
String s3 = String.valueOf(f);

方法3:各包装类的toString()方法

java 复制代码
int a = 123;
String s = Integer.toString(a);

double d = 12.345;
String s4 = Double.toString(d);

byte bt = 10;
String s5 = Byte.toString(bt);

最后小结

今天的知识点看似基础,但都是面试和开发中的高频坑点:

  • 别混淆==equals,重写equals必重写hashCode
  • 包装类的自动拆装箱是编译期语法糖,128陷阱要记牢;
  • 基本类型和字符串互转要熟练,注意NumberFormatException异常;

基础不牢,地动山摇,慢慢啃慢慢记,Java路还长~

相关推荐
Solis程序员2 分钟前
滑动窗口热键探测与三级缓存设计
java·spring·缓存
Land03293 分钟前
Python + RPA 双引擎实战:从手写脚本到可交付自动化应用的完整链路
python·自动化·rpa
好家伙VCC21 分钟前
区块链双向支付通道实战:从签名到结算
java·后端·区块链·asp.net
菜到离谱但坚持23 分钟前
【小白零基础】RAG+LangChain 搭建私有知识库问答系统(完整可运行代码+超详细教程+避坑指南)
python·langchain·rag
ss27329 分钟前
【入门OJ题解】分苹果问题(Python/Java/C 实现)
java·c语言·python
IsJunJianXin32 分钟前
谷歌搜索cookie NID逆向生成
开发语言·python·google搜索·sgss·nid-cookie·算法生成nid·google-cookie
暗夜猎手-大魔王35 分钟前
转载--Hermes Agent 11 | 智能审批与平台化安全:当 AI 来守护 AI
人工智能·python·安全
AIFQuant35 分钟前
量化私募回测系统:高质量股票/外汇历史数据 API 选型与接入
python·websocket·金融·ai量化
Mr.Daozhi38 分钟前
Playwright实战:抓取Meta Ad Library动态页面的三级降级策略
爬虫·python·自动化·playwright·meta广告
weikecms41 分钟前
美团霸王餐报名API接口
java·开发语言