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路还长~

相关推荐
西洼工作室1 天前
个人开发者接入阿里云号码认证服务AliCloud-NirvanaPns实现一键登录
python·阿里云·uni-app·全栈·认证授权
正儿八经的少年1 天前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【52】Interrupts 中断机制:节点执行前后静态中断
java·人工智能·spring
半城抹茶1 天前
TradingAgents-CN 项目目录文档
python
疯狂成瘾者1 天前
Spring Boot 项目中的 SMTP 邮件验证码服务技术解析
java·spring boot·后端
光影6271 天前
Selenium自动化测试---实战踩坑实录
python·selenium·测试工具·百度
y = xⁿ1 天前
Java并发八股学习日记
java·开发语言·学习
xifangge20251 天前
【深度排障】从 OS 底层寻址剖析 javac 不是内部或外部命令 核心报错:变量空间隔离与自动化部署终极范式
java·开发语言·jdk·自动化
HappyAcmen1 天前
2.lcut返回列表用法
python
肖恩想要年薪百万1 天前
JSP中常用JSTL标签
java·开发语言·状态模式