【Java】 目前主要更新Java,一起学习一起进步。
本期主要介绍常用API——Object、StringBuilder、包装类
java.lang.Object 类是 Java 语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使
用。在对象实例
化的时候,最终找的父类就是 Object 。
如果一个类没有特别指定父类,
那么默认则继承自 Object 类。例如
根据 JDK 源代码及 Object 类的 API 文档, Object 类当中包含的方法有 11 个。今天我们主要学习其中
的 2 个:
public String toString() :返回该对象的字符串表示。
public boolean equals(Object obj) :指示其他某个对象是否与此对象 “ 相等 ” 。
方法摘要
public String toString() :返回该对象的字符串表示。
toString 方法返回该对象的字符串表示,其实该字符串内容就是对象的类型 +@+ 内存地址值。
由于 toString 方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符
串表现形式,因
此也需要重写它。
覆盖重写
如果不希望使用 toString 方法的默认行为,则可以对它进行覆盖重写。例如自定义的 Person 类:
在 IntelliJ IDEA 中,可以点击 Code 菜单中的 Generate... ,也可以使用快捷键 alt+insert ,点击
toString() 选
项。选择需要包含的成员变量并确定。如下图所示:
小贴士:
在我们直接使用输出语句输出对象名的时候 , 其实通过该对象调用了其 toString() 方法。
方法摘要
public boolean equals(Object obj) :指示其他某个对象是否与此对象 “ 相等 ” 。
调用成员方法 equals 并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的 “ 相
同 ” 有默认和自定
义两种方式。
默认地址比较
如果没有覆盖重写 equals 方法,那么 Object 类中默认进行 == 运算符的对象地址比较,只要不是同
一个对象,结果
必然为 false 。
对象内容比较
如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆
盖重写 equals 方
法。例如:
这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。大多数 IDE 都可以自动生
成 equals 方法的
代码内容。在 IntelliJ IDEA 中,可以使用 Code 菜单中的 Generate… 选项,也可以使用快捷键
alt+insert ,并选
择 equals() and hashCode() 进行自动代码生成。如下图所示:
tips:Object类当中的hashCode等其他方法,今后学习。
在刚才 IDEA 自动重写 equals 代码中,使用到了 java.util.Objects 类,那么这个类是什么呢?
在 JDK7 添加了一个 Objects 工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组
成,这些方法是
null-save (空指针安全的)或 null-tolerant (容忍空指针的),用于计算对象的 hashcode 、返回对
象的字符串表
示形式、比较两个对象。
在比较两个对象的时候, Object 的 equals 方法容易抛出空指针异常,而 Objects 类中的 equals 方法
就优化了这个问
题。方法如下:
public static boolean equals(Object a, Object b) : 判断两个对象是否相等。
我们可以查看一下源码,学习一下:
由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对
象。例如:
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
根据这句话分析我们的代码,其实总共产生了三个字符串,即 "Hello" 、 "World" 和 "HelloWorld"
。引用变量 s
首先指向 Hello 对象,最终指向拼接出来的新字符串对象,即 HelloWord 。
由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的 String 对象,既耗时,又浪
费空间。为了解
决这一问题,可以使用 java.lang.StringBuilder 类。
查阅 java.lang.StringBuilder 的 API , StringBuilder 又称为可变字符序列,它是一个类似于 String 的
字符串缓冲
区,通过某些方法调用可以改变该序列的长度和内容。
原来 StringBuilder 是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对
其中的字符串进
行各种操作。
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。
StringBuilder 会自动
维护数组的扩容。原理如下图所示:
( 默认 16 字符空间,超过自动扩充 )
根据 StringBuilder 的 API 文档,常用构造方法有 2 个:
public StringBuilder() :构造一个空的 StringBuilder 容器。
public StringBuilder(String str) :构造一个 StringBuilder 容器,并将字符串添加进去。
StringBuilder 常用的方法有 2 个:
public StringBuilder append(...) :添加任意类型数据的字符串形式,并返回当前对象自身。
public String toString() :将当前 StringBuilder 对象转换为 String 对象。
append 方法
append 方法具有多种重载形式,可以接收任意类型的参数。任何数据作为参数都会将对应的字符
串内容添加到
StringBuilder 中。例如:
备注: StringBuilder 已经覆盖重写了 Object 当中的 toString 方法。
toString 方法
通过 toString 方法, StringBuilder 对象将会转换为不可变的 String 对象。如:
Java 提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建
对象使用,因为
对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包
装类,如下:
基本类型与对应的包装类对象之间,来回转换的过程称为 ” 装箱 “ 与 ” 拆箱 “ :
装箱 :从基本类型转换为对应的包装类对象。
拆箱 :从包装类对象转换为对应的基本类型。
用 Integer 与 int 为例:(看懂代码即可)
基本数值 ----> 包装对象
包装对象---->基本数值
由于我们经常要做基本类型与包装类之间的转换,从 Java 5 (
JDK 1.5 )开始,基本类型与包装类的装箱、拆箱动作
可以自动完成。例如:
基本类型转换为 String
基本类型转换 String 总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式:
String 转换成对应的基本类型
除了 Character 类之外,其他所有包装类都具有 parseXxx 静态方法可以将字符串参数转换为对应的
基本类型:
public static byte parseByte(String s) :将字符串参数转换为对应的 byte 基本类型。
public static short parseShort(String s) :将字符串参数转换为对应的 short 基本类型。
public static int parseInt(String s) :将字符串参数转换为对应的 int 基本类型。
public static long parseLong(String s) :将字符串参数转换为对应的 long 基本类型。
public static float parseFloat(String s) :将字符串参数转换为对应的 flfloat 基本类型。
public static double parseDouble(String s) :将字符串参数转换为对应的 double 基本类型。
public static boolean parseBoolean(String s) :将字符串参数转换为对应的 boolean 基本类型。
代码使用(仅以 Integer 类的静态方法 parseXxx 为例)如:
注意 : 如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出
java.lang.NumberFormatException
异常。