当前位置: 首页 > news >正文

第十二章 常用类

一、Object类

1. Object类概述

(1) Object类位于java.lang包中,是Java里所有类的直接或间接父类,是继承关系的根类。
(2) Object类型的引用可以接收任意Java类型的对象,这是多态特性的基础体现。
(3) Object类中定义的方法,所有子类都可以直接使用,也可以根据需求进行重写。

2. Object类核心方法

(1) getClass() 方法

• 作用:返回对象运行时的实际类型(Class对象),可以用来判断两个引用的实际类型是否一致。

• 示例:
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
// 判断两个对象的实际类型是否相同
System.out.println(a1.getClass() == a2.getClass()); // false
}
}
(2) int hashCode() 方法

• 作用:返回对象的哈希码值,JDK默认根据对象的内存地址生成整数形式的哈希值。

• 注意:不同对象的哈希码值通常不同,同一对象多次调用该方法返回的结果一致。

(3) String toString() 方法

• 作用:返回对象的字符串表示形式,默认格式为类名@哈希码的十六进制形式,通常被子类重写以展示对象的属性信息。

• 重写示例:
public class Student {
private String name;
private int age;
@Override
public String toString() {
return "姓名:" + name + ",年龄:" + age;
}
}
• 对比:getter方法用于获取单个属性值,toString方法会将对象的所有属性拼接为一个字符串返回。

(4) boolean equals(Object obj) 方法

• == 与 equals 的对比:

◦ ==:如果两端是基本数据类型,比较的是数值是否相等;如果两端是引用数据类型,比较的是内存地址是否相同。

◦ equals:Object类中的默认实现和==一致,比较的是对象地址;子类可以重写该方法,实现按对象内容比较。

• 重写equals方法的规范:
public class Student {
private String name;
private int age;

@Override
public boolean equals(Object obj) {
// 自反性判断:判断当前对象和要比较的对象是否是同一个对象
if (this == obj) return true;
// 非空判断:如果要比较的对象为null,直接返回false
if (obj == null) return false;
// 类型一致性判断:判断两个对象的实际类型是否相同
if (this.getClass() != obj.getClass()) return false;
// 强制类型转换:将Object类型转为当前类类型
Student s = (Student) obj;
// 逐一比较对象的属性值
return this.age == s.age && this.name.equals(s.name);
}
}
(5) finalize() 方法

• 调用时机:对象被垃圾回收器(GC)回收之前会自动调用该方法,一般用于资源清理操作。

• 垃圾回收相关概念:

◦ 垃圾对象:没有任何有效引用指向的对象,例如 Student s = new Student(); s = null; 执行后,原对象就成为了垃圾对象。

◦ GC触发时机:当JVM内存不足时,垃圾回收器会自动回收垃圾对象;也可以调用System.gc()建议JVM进行回收,但不保证立即执行。

◦ 注意:开发中不建议在finalize方法中编写业务逻辑,因为该方法的执行时机是不可控的。
二、包装类

1. 概念

包装类是基本数据类型对应的引用类型,位于java.lang包中,作用是将基本数据类型纳入面向对象的体系中。

2. 基本数据类型与包装类对应

基本数据类型byte对应的包装类是Byte,short对应Short,int对应Integer,long对应Long,float对应Float,double对应Double,char对应Character,boolean对应Boolean。

3. 数据类型转换

(1) int ↔ Integer

• int 转 Integer:
// 使用构造方法
Integer i1 = new Integer(123);
// 使用静态方法valueOf
Integer i2 = Integer.valueOf(123);
• Integer 转 int:
int num = i1.intValue();
(2) String ↔ Integer

• String 转 Integer:
Integer i3 = new Integer("456");
Integer i4 = Integer.valueOf("456");
• Integer 转 String:
String s1 = i3.toString();
String s2 = i3 + "";
(3) int ↔ String

• int 转 String:
int a = 789;
String s3 = a + "";
• String 转 int:
int b = Integer.parseInt("789");
• 注意:用于转换的字符串必须是纯数字格式,否则会抛出NumberFormatException异常。

4. 自动装箱与拆箱(JDK5及以上)

• 自动装箱:基本数据类型可以自动转换为对应的包装类,例如 Integer i = 10;。

• 自动拆箱:包装类可以自动转换为对应的基本数据类型,例如 int num = i;。

• 底层原理:自动装箱的底层调用的是Integer.valueOf()方法,自动拆箱的底层调用的是intValue()方法。

• 缓存池特性:Integer类对-128~127之间的整数做了缓存处理,在这个范围内的对象会被直接复用,超出这个范围则会新建对象:
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true

Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); // false
5. 实际开发场景

包装类可以区分有效数据和无效数据,比如int类型的默认值是0,容易和有效的数值0混淆;而Integer类型的默认值是null,可以用来表示无效值,所以在实体类的属性定义中通常会使用包装类。
三、String类

1. 创建字符串的两种方式

(1) String s1 = "abc";:直接在字符串常量池中创建对象,字符串常量池中不会存在重复的对象。
(2) String s2 = new String("abc");:会在堆内存和字符串常量池各创建一个对象(如果常量池中已经存在该字符串,则只会在堆内存创建对象)。

2. 常用方法

• char charAt(int index):获取字符串中指定下标的字符,如果下标超出范围会抛出StringIndexOutOfBoundsException异常。

• boolean contains(CharSequence s):判断当前字符串是否包含指定的子串。

• boolean equals(Object anObject):比较两个字符串的内容是否相等,开发中比较字符串内容必须使用该方法。

• int length():返回字符串的长度,注意和数组的length属性区分。

• String trim():去除字符串前后的空白字符。

• String[] split(String regex):按照指定的规则拆分字符串,返回拆分后的字符串数组。

3. String的不可变性

• 字符串对象一旦创建,其内容就不能被修改,对字符串进行修改操作时,会生成新的字符串对象。

• 字符串拼接的效率较低,频繁拼接会产生大量的中间对象,建议使用StringBuilder或StringBuffer来进行字符串拼接操作。
四、可变字符串类

1. 类对比

StringBuilder是JDK5.0推出的类,线程不安全,但执行效率高;StringBuffer是JDK1.0推出的类,线程安全,但执行效率较低。

2. 常用构造方法

(1) public StringBuilder():无参构造方法,创建一个空的可变字符串对象。
(2) public StringBuilder(String str):带字符串参数的构造方法,创建时包含指定的字符串内容。

3. 常用功能方法

StringBuilder append(String str):用于字符串的拼接操作,拼接效率远高于String类。

4. 面试题:String、StringBuilder、StringBuffer的区别

• String是不可变字符串,进行字符串拼接操作时效率较低。

• StringBuilder是可变字符串,线程不安全,字符串拼接效率较高。

• StringBuffer是可变字符串,线程安全,字符串拼接效率比StringBuilder稍低。
五、BigDecimal类

1. 概述

BigDecimal类位于java.math包中,用于精确表示和计算浮点数,解决浮点数运算精度丢失的问题。

2. 常用构造方法

public BigDecimal(String val):使用字符串形式的参数创建BigDecimal对象,避免精度丢失。

3. 常用运算方法

(1) BigDecimal add(BigDecimal augend):加法运算,计算两个BigDecimal对象的和。
(2) BigDecimal subtract(BigDecimal subtrahend):减法运算,计算两个BigDecimal对象的差。
(3) BigDecimal multiply(BigDecimal multiplicand):乘法运算,计算两个BigDecimal对象的积。
(4) BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):除法运算,参数说明:

• 第一个参数是除数;

• 第二个参数是保留的小数位数;

• 第三个参数是取舍模式,通常使用四舍五入模式(BigDecimal.ROUND_HALF_UP)

http://www.cnnetsun.cn/news/2887370.html

相关文章:

  • Quickshell技术架构解析:QtQuick桌面环境构建的艺术与工程
  • i.MX6ULL平台libmodbus 3.1.6交叉编译实操资源包(含补丁说明与完整构建脚本)
  • Claude Mythos:AI原生安全引擎如何重构漏洞挖掘范式
  • 别让你的SPI Nor跑飞了!100MHz高频下采样延时到底该怎么配?(附XTX芯片实测)
  • 德国法院裁决:谷歌需为 AI 概述虚假陈述负责,或影响全球 AI 搜索引擎
  • 从Hard Label到Soft Label:深入解析Label Smoothing的数学之美与实战调优
  • 如何5秒解锁百度网盘加密资源:智能提取码解析终极指南
  • 如何降低谷歌广告CPC?中小企业常用的低成本方法
  • League Akari:5个智能功能彻底改变你的英雄联盟游戏体验
  • 拓扑透镜的时间延迟公式严格推导(世毫九IGP框架)
  • 永磁同步电机静止状态下用方波注入法估算转子初始位置的Simulink仿真模型
  • PotPlayer百度翻译插件:5分钟搞定免费字幕实时翻译的终极指南
  • 从TIM1到TIM1.5:芯片封装散热设计的范式转移与技术对比
  • 平衡车项目实战:用STM32F103的EXTI中断实时读取MPU6050数据(附完整工程)
  • Vivado工程版本升级中IP缓存状态异常解析:从“Using cached IP results”到“synth_design Complete!”的实战处理
  • STM32F103 USB开发避坑指南:为什么你的端点数据会“神秘消失”?详解BTABLE与缓冲区地址计算
  • Android NDK原生层黑白滤镜实时预览方案(Camera2+OpenGL FBO)
  • C语言链表实战:从零手搓一个学生信息管理系统(附完整源码与内存管理避坑指南)
  • UniShare框架:社交分享场景下的联合推荐技术解析
  • 从‘显示一张地图’到‘定制你的地图’:OpenLayers 7.x 核心四要素实战拆解
  • 上岸必看!【中药学】必背100题及解析(卷号:06111014_07)
  • 杰理之U盘播放无损格式音频导致杰理之家的文件浏览线程运行加载文件信息很慢【篇】
  • 别再死记硬背了!用Wireshark抓包实战,5分钟搞懂IPSec的AH和ESP到底有啥区别
  • 深入IEEE 802.15.4 MAC层:手把手解析ZigBee低功耗与自组网的底层秘密
  • 面向业务落地的情绪识别七步工作法
  • 3个步骤:轻松掌握猫抓插件,成为网页资源嗅探高手
  • NSK重载静音滚珠丝杠BSS4025详析
  • 从《炉石传说》到在线购物:AgentBench如何用游戏和网页任务‘拷问’大模型的真实智商?
  • 华硕笔记本性能优化终极指南:从入门到精通的G-Helper完全手册
  • 手机号码定位查询:3分钟学会免费获取地理位置信息