第十二章:常用类
(2) boolean contains(String str):判断一个字符串中是否包含 str子串,包含-true;(6) String[] split(String str) : 将当前字符串进行拆分,拆分结果封装为一个String类型的数组。(垃圾回收器回收垃圾对象)(JVM性能调优时关注)(1) Object 类位于 java.lang 包中,是继承关系的根类、超类,是所有类的父类(直接
一、Object类
1. Object类的介绍
(1) Object 类位于 java.lang 包中,是继承关系的根类、超类,是所有类的父类(直接的父类或是间接父类)
(2) Object类型的引用可以用于存储任意类型的对象。
(3) Object类中定义方法,所有类都可以直接使用。
2. 8Object类中常用方法:
(1) getClass() : 返回引用中实际存储的对象类型。【理解】
开发实际应用:用于判断两个引用中实际存储的对象类型是否一致,一致-true;不一致-false。
(2) int hashCode() : 返回对象的整数哈希码值。对象的哈希码值来源是将 十六进制的地址,转换十进制的整
数的结果。
注意:由于不同的对象在堆空间中有不同的十六进制的地址,所有不同的对象具有不同哈希码值。
(3) String toString() : 返回该对象字符串的变现形式。【开发重点】
a. 作用:方便展示对象的信息,子类通常将 toString方法覆盖。toString方法覆盖的原则如下:
通常将所有的属性拼接为一个 字符串进行结果返回。
b. 案例:public String toString(){
return "name="+name+",age="+age; // this. 省略
}
c. get 方法和 toString 方法 区别:
I. get方法是返回对象的单个属性的信息,并且不会改变属性对应数据类型
II. toString 方法获取所有属性的信息,并且将 所有属性拼接为 一个String类型的结果进行返回。
(4) boolean equals(Object o):用于比较对象内容是否相同。【开发应用重点】
a. == 的应用
I. 如果 == 两端 为基本数据类型的变量,则判断变量中数值是否相同
如果 == 两端 为引用类型的变量,则判断引用中存储的地址是否相同。
II. 开发中 == 两端为引用类型的实际应用:通常用于判断两个引用是否指向同一个对象。
引用名1 == 引用名2 : 结果为 true,代表两个引用指向同一个对象;
结果为false,代表两个引用指向不同的对象。
b. equals 方法的应用:
I. 父类 Object类中 equals方法实现原理如下:
public boolean equals(Object obj) {
return (this == obj);
}
注意:父类中的equals方法是用于比较两个引用是否同一个对象,但是开发时,通常用equals方法比
较对象的内容,所以父类中equals方法不足以满足子类的 需求,则需要覆盖父类Object中
equals方法。
II. equals方法覆盖的原则:
面试重点: == 和 equals方法的区别。
解析:
(1) ==的应用
== 两端为基本数据类型,比较变量中数值是否相同
==两端为引用类型的变量,比较引用存储地址是否相同
(2) equals 方法:Object类中方法用于实现用(==)实现,比较对象地址;但是实际开发时,需要将
equals方法进行覆盖,用于比较对象的内容是否相同。
(5) finalize() : JVM进行垃圾回收时,自动调用的方法。(垃圾回收器回收垃圾对象)(JVM性能调优时关注)
【面试】
a. 垃圾对象:没有任何引用指向的对象。
Student s= new Student();
s = null ; // 将 s 指向的对象设置为 垃圾对象
b. 垃圾回收器:用于JVM回收垃圾对象。简称为gc / GC
c. 垃圾回收的目的:清除垃圾对象,释放空间,提高空间利用率。
d. 垃圾回收器回收垃圾对象时机:
① 自动回收机制:当JVM内存耗尽时,不能再为新创建的对象分配空间时,JVM中垃圾回收器会自动
将所有的垃圾对象一次性进行回收,垃圾回收器进行回收垃圾对象时,自动调用finalize方法。
② 手动回收机制:利用 System.gc() ; 通知 垃圾回收器(GC)进行垃圾回收,如果 GC空闲,则进行垃
圾回收,如果GC繁忙,则暂不回收。
注意:开发时,finalize方法中不写任何重要代码,finalize方法的执行节点不可控。
二、包装类(位于 java.lang 包中)
1. 概念:基本数据类型对应引用类型,称之为基本数据类型的包装类。
2. 基本数据类型对应的包装类:【重点】
基本数据类型 包装类类名
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
3. 数据之间转换【了解】
(1) int 和 Integer 之间的转换
int -----> Integer
a. Integer i1 = new Integer(12); // 借助构造方法
b. Integer i2 = Integer.valueOf(12); // 借助Integer类中的静态方法
Integer ----> int
a. int a1 = i1.intValue() ; // 借助Integer类中的成员方法 intValue()
(2) String 和 Integer之间的转换
String ----> Integer
a. Integer i3 = new Integer("123"); // 借助Integer类中的构造方法
b. Integer i4 = Integer.valueOf("123"); // 借助Integer类中的静态方法
Integer ----> String
a. String s1 = i4.toString();
b. String s2 = i4+""; //借助字符串的拼接
(3) int 和 String 之间的转换
int ---> String
a. int a = 3;
String s3 = a+"";
String ----> int 【开发应用重点】
int a = Integer.parseInt("123"); // 借助 Integer类中静态方法
注意:将String类型的数据转换为 int/Integer类型的数据,要求要转换的String数据类型必须是纯数
字,否则运行报错,错误信息如下:
java.lang.NumberFormatException (数字格式转换异常)
4. 自动装箱、自动拆箱
(1) JDK5.0之后提供自动装箱和自动拆箱的功能,基本数据类型和对应包装类型之间可以相互自动转换
(2) 自动装箱:基本数据类型可以直接赋值给其对应的包装类型。
自动拆箱:包装类型的引用可以直接赋值给其对应的基本数据类型的变量。
(3) 案例: Integer i = 12; // 自动装箱
int a = i ; // 自动拆箱
(4) 自动装箱实现的原理:自动装箱底层调用的时Integer类中 静态的 valueOf方法: 【面试难点】
public static Integer valueOf(int i) {
if (i >= -128 && i <= 127)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i); // 如果 传入数据不在-128~127之间,则new Integer类型对象
}
注意:Java中将 -128~127常用数据段的内容进行了预先的包装处理,转换数据只要在-128~127之间不
需要每次创建对象,而是从处理结果中直接获取即可,-128~127处理结果存储在缓冲区中、常量池。
面试题目: Integer i1 = 12;
Integer i2 = 12;
System.out.println(i1==i2); // true
Integer i3 = 150;
Integer i4 = 150 ;
System.out.println(i3==i4); // false
5. 包装类实际开发应用【开发重点】
(1) 可以用于区分有效数据和无效数据:例如 0 和 null , 0.0 和 null.
(2) 场景:开发时,通常将类中属性定义为基本数据类型对应包装类型。-->区分有效数据和无效数据的
三、String类【开发重点】
1. 创建字符串的方式:【面试重点】
(1) String s1 = "hello"; // 只会创建一个对象,在串池中产生
(2) String s2 = new String("world"); // 产生两个对象。一个在堆空间中,一个在串池中产生。
注意:如果串池中已经存在的字符串对象,不会重复创建。
2. String类中常用方法:
(1) char charAt(int index):根据下标获取对应的字符。
注意:String类中封装了一个 char类型数组,下标范围 0~字符串的长度-1,如果指定的下标超出下标
范围,则运行报错,错误信息为:java.lang.StringIndexOutOfBoundsException(数组下标越界)
(2) boolean contains(String str):判断一个字符串中是否包含 str子串,包含-true;否则-false.
(3) boolean equals(String str):比较两个字符串内容是否相同,相同-true;否则-false.
注意:开发时,比较字符串内容,需要用 equals方法比较。
(4) int length() : 获取字符串的长度。
注意:获取数组的长度:数组名.length ;
// 思考:如何遍历字符串????
(5) String trim() : 去除字符串前后的空格。
注意:应用场景结合 :将String转换int/Integer时应用
String age = "18 ";
int n = Integer.parseInt(age.trim());
(6) String[] split(String str) : 将当前字符串进行拆分,拆分结果封装为一个String类型的数组。
3. String的不可变性【面试题目】
(1) String的字面值是字面常量,如果在字符串上进行操作,在原有字符串的基础上拷贝一个副文本,在副
文本上完成操作(字符串拼接)。
(2) 由于String具有不可变性,所以在完成字符串拼接时,效率较低。
注意: String s = "a" + "b";
上面的字符串的拼接只创建一个对象。原因:如果+ 两端都为字符串常量时,编译器在编译阶
段将"a"+"b" 直接编译为 "ab",称为编译器可知。
四、可变长的字符串(位于java.lang包)
1. StringBuffer: JDK1.0版本,线程安全,运行效率慢
StringBuilder: JDK5.0版本,线程不安全,运行效率快。
2. 常用的构造方法:
(1) public StringBuilder() : 无参数的构造方法
(2) public StringBuilder(String str) : 带有字符串类型参数的构造方法
3. 常用功能方法:
StringBuilder append(String str):字符串的拼接
4. 注意:StringBuilder是可变长字符串,所有拼接效率远远高于 String。
面试题目:String 和 StringBuilder、StringBuffer的区别。
解析:
(1) String 是不可变长的字符串,在完成字符串拼接时效率较低。
String线程安全。
(2) StringBuilder是可变长的字符串,在完成字符串拼接时效率较高。
StringBuilder线程不安全。
(3) StringBuffer是可变长的字符串,在完成字符串拼接时效率较高
StringBuffer线程安全。
五、BigDecimal类【了解】
1. BigDecimal类:位于java.math 包中
2. 作用:精确的表示、计算浮点数
3. 常用的构造方法:
public BigDecimal(String n) : 带有字符串类型构造方法
4. 常用的方法:
(1) BigDecimal r1 = bd1.add(bd2); // 加法 bd1 + bd2
(2) BigDecimal r2 = bd1.subtract(bd2); // 减法 : bd1 - bd2
(3) BigDecimal r3 = bd1.multiply(bd2); // 乘法 : bd1*bd2
(4) BigDecimal r4 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP); // 除法: bd1/bd2
参数说明:
第一个参数:分母数据
第二个参数:指定保留到小数点后几位
第三个参数:取舍模式,通常采用四舍五入(BigDecimal.ROUND_HALF_UP)
更多推荐
所有评论(0)