Java 核心基础:常用类精讲与实战
一、Object类
1. Object类的介绍
- Object 类位于 java.lang 包中,是所有类的超类,任何类都直接或间接继承自它。
- Object类型的引用可以指向任何类型的对象。
- Object类中定义的方法,所有类都可以直接使用。
2. Object类中常用方法
- getClass(): 返回对象的实际类型。
- 应用:判断两个引用指向的对象是否属于同一类型。
java
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
Animal a1 = new Cat();
Animal a2 = new Dog();
System.out.println(a1.getClass() == a2.getClass()); // 输出 false
- hashCode(): 返回对象的哈希码值。
- 哈希码由对象的内存地址转换而来,不同对象通常有不同的哈希码。
- toString(): 返回对象的字符串表示。【开发重点】
- 作用:方便打印对象信息,子类通常会重写此方法。
- 重写原则:通常将所有属性拼接成一个字符串返回。
java
public String toString() {
return "name=" + name + ", age=" + age;
}
- 与get方法的区别:get方法获取单个属性,不改变类型;toString获取所有属性,返回字符串。
- equals(Object o): 比较对象内容是否相同。【开发应用重点】
- == 的作用:
- 比较基本类型时,判断数值是否相等。
- 比较引用类型时,判断地址是否相同。
- equals方法的重写:
- Object类的equals默认比较地址,开发中通常需要重写以比较内容。
- 重写原则:
java
public boolean equals(Object obj) {
// 1. 自反性:引用是否指向同一对象
if (this == obj) return true;
// 2. 非空性:判断对象是否为null
if (obj == null) return false;
// 3. 类型一致性:判断是否为同一类型
if (this.getClass() != obj.getClass()) return false;
// 4. 强制类型转换
Student s = (Student) obj;
// 5. 属性比较:基本类型用==,引用类型用equals
return this.age == s.age &&
this.score == s.score &&
this.name.equals(s.name);
}
- finalize(): JVM垃圾回收时自动调用的方法。【面试】
- 垃圾对象:没有任何引用指向的对象。
- 垃圾回收器(GC):负责回收垃圾对象,释放内存。
- 回收时机:JVM内存不足时自动回收,或通过 System.gc() 手动建议回收。
- 注意: finalize() 方法的执行时机不确定,不建议在其中编写重要逻辑。
二、包装类 (位于 java.lang 包中)
1. 概念:基本数据类型对应的引用类型,便于在需要对象的场景中使用。
2. 基本数据类型与包装类对应关系:【重点】
基本数据类型 包装类类名
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
3. 数据之间转换:【了解】
- int 和 Integer 之间的转换
- int -> Integer : Integer i = new Integer(12); 或 Integer.valueOf(12);
- Integer -> int : int a = i.intValue();
- String 和 Integer 之间的转换
- String -> Integer : Integer i = new Integer("123"); 或 Integer.valueOf("123");
- Integer -> String : String s = i.toString(); 或 String s = i + "";
- String 和 int 之间的转换
- int -> String : String s = 123 + "";
- String -> int : int a = Integer.parseInt("123"); 【开发应用重点】
- 注意:字符串必须是纯数字,否则会抛出 NumberFormatException 。
4. 自动装箱、自动拆箱
- JDK5.0后引入,允许基本类型和包装类型之间自动转换。
- 自动装箱: Integer i = 12; (基本类型 -> 包装类型)
- 自动拆箱: int a = i; (包装类型 -> 基本类型)
- 实现原理:自动装箱调用 valueOf() 方法,自动拆箱调用 xxxValue() 方法。
5. 包装类实际开发应用:【开发重点】
- 用于区分有效数据和无效数据。例如, 0 是有效年龄,而 null 表示年龄未填写。
- 通常将类的属性定义为包装类型。
三、String类 【开发重点】
1. 创建字符串的方式:【面试重点】
- String s1 = "hello"; :在字符串常量池中创建对象,若已存在则直接引用。
- String s2 = new String("world"); :在堆内存中创建对象,同时检查常量池。
2. String类中常用方法
- charAt(int index): 根据下标获取字符。
- 下标范围: 0 到 length()-1 ,超出会抛出 StringIndexOutOfBoundsException 。
- contains(String str): 判断是否包含指定子串。
- equals(String str): 比较字符串内容是否相同。【开发重点】
- 注意:比较字符串内容必须使用 equals() 方法,不能用 == 。
- length(): 获取字符串长度。
- 与数组的区别:数组长度是 数组名.length (属性),字符串长度是 字符串名.length() (方法)。
- trim(): 去除字符串前后的空白字符。
- 应用场景:处理用户输入,如 Integer.parseInt(age.trim()) 。
- split(String regex): 根据指定规则拆分字符串,返回字符串数组。
3. String的不可变性:【面试题目】
- String对象一旦创建,其内容就不可改变。
- 字符串拼接操作会创建新的String对象,原有对象不变。
- 效率问题:大量字符串拼接时,String的效率很低。
- 编译优化: String s = "a" + "b"; 编译后直接变为 String s = "ab"; 。
四、可变长的字符串 (位于 java.lang 包)
为解决String拼接效率低的问题,引入了可变长字符串类。
- StringBuffer: JDK1.0版本,线程安全,但效率较低。
- StringBuilder: JDK5.0版本,线程不安全,但效率较高。【开发首选】
1. 常用构造方法
- public StringBuilder() : 创建一个空的可变字符串。
- public StringBuilder(String str) : 根据指定字符串创建。
2. 常用功能方法
- append(String str): 追加字符串,这是最核心的方法。
java
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World"); // 链式调用
System.out.println(sb.toString()); // 输出 "Hello World"
3. 面试题目:String、StringBuilder、StringBuffer的区别。
- String:不可变,拼接效率低,线程安全。
- StringBuilder:可变,拼接效率高,线程不安全。
- StringBuffer:可变,拼接效率高,线程安全。
五、BigDecimal类 【了解】
1. BigDecimal类:位于 java.math 包中。
2. 作用:精确表示和计算浮点数,解决 float 和 double 的精度丢失问题。
3. 常用构造方法
- public BigDecimal(String val) : 推荐使用字符串构造,避免精度问题。
4. 常用方法
- 加法: BigDecimal result = bd1.add(bd2);
- 减法: BigDecimal result = bd1.subtract(bd2);
- 乘法: BigDecimal result = bd1.multiply(bd2);
- 除法: BigDecimal result = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);
- 参数1: 除数
- 参数2: 保留小数位数
- 参数3: 取舍模式, ROUND_HALF_UP 表示四舍五入
更多推荐
所有评论(0)