手册:JAVA引用类型的常用方法_进阶篇
一、Object类(java.lang.Object)
1.1、概述
java.lang.Object 类是Java语言中的根类(祖宗类),即所有类的父类,每一个类都直接或间接地继承了Object类。该类中描述的所有方法子类都可以使用。
1.2、常用方法
1.2.1、String toString();
/*返回该对象的字符串表示。*/
(1)概述:toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
(2)最常见的system.out.println()函数若打印参数为对象名,则将调用该对象的toString方法,若该方法没有被覆盖重写,则执行的是Object类的toString方法,即最终打印的是对象的地址值。
(3)快捷重写:Alt+Insert(代码生成器)---->toString
(4)关于String类重写的toString,内容如下:
public String toString() {
return this;
}
1.2.2、boolean equals(Object obj);
/*指示其他对象是否与此对象“相等”*/
(1)概述:如果没有覆盖重写equals方法,那么Object类中默认进行== 运算符的对象地址比较,只要不是同一个对象,结果必然为false。如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。
(2)比较两个对象的地址没有意义,通常需要重写来判断两个对象的属性值,来解决实际问题。
(3)重写equals的注意事项:由于此方法的参数为Object类的对象,所以这里隐含了作为参数的对象的向上转型为Object类型,即隐含了多态形式。但是多态的弊端是向上转型的对象无法使用原类型特有的属性和方法,所以在重写equals方法的时候需要对该对象使用向下转型(即强制转型)。
(4)为了提高重写的equals的效率,在比较两个对象之前,应先判断传入的对象是否是它本身,若是,返回true;其次要判断传入对象是否为空,或者是否属于不同类,若是,返回false;最后才要判断指定的各个属性是否分别完全相同。这样可避免程序进行很多不必要的判断,大幅提高代码效率。
(5)快捷重写:Alt+Insert(代码生成器)---->equals和hashcode---->建议使用java7+版本的代码生成器
二、Objects类(java.util.Objects)
2.1、引入
在equals的快捷重写中的JAVA7+版本中,用到了Objects工具类的equals方法,在这里对Objects类进行简要分析。
2.2、概述
在JDK7版本中,java新添加了一个Objects工具类,它提供了一些方法操作对象,是由一些静态方法组成的,所以这些方法可以用类名加点直接使用(无需创建对象)。这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
以equals方法为例,若一个对象为空,使用该对象.equals时会出现空指针异常,为了解决这个问题,可使用Objects.equals()方法使两个对象进行比较,例如现有对象a和b,可使用Objects.equals(a, b);
三、Date类(java.util.Date)
3.1、概述
java.util.Date类表示特定的瞬间,精确到毫秒。是表示日期和时间的类。
3.2、毫秒值的作用
毫秒值可以用来计算日期和时间,例如计算某年某月某日到另一个日期有多少天,可以换算成这之间有多少毫秒。默认1970年1月1日00:00:00为0毫秒,要注意中国的时区为东八区,0毫秒对应的时间需要加八个小时。
3.3、构造方法与成员方法
3.3.1、构造方法
(1)Date();/*空参数构造方法,获取系统现在的日期和时间*/
例:
Date date = new Date();
System.out.println(date); /*Mon Apr 13 17:43:59 CST 2020*/
(2)Date(Long date);/*\传递毫秒值,把毫秒值转换为date日期和时间 */
例:
System.out.println(new Date(0L)); /* Thu Jan 01 08:00:00 CST 1970*/
System.out.println(toLocalString(new Date(0L)));/*1970-01-01 08:00:00*/
3.3.2、常用方法
public long getTime(); /*把日期对象转换成对应的时间毫秒值。
等同于System.currentTimeMillis();*/
四、DateFormat类(java.text.DateFormat)
4.1、概述
java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
4.1.1、格式化
按照指定的格式,从Date对象转换为String对象。
4.1.2、解析
按照指定的格式,从String对象转换为Date对象。
4.1.3、拓展
DateFormat的父类Format有三个子类,为DateFormat、MessageFormat、NumberFormat。
4.2、构造方法
4.2.1、格式
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat 。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为
public SimpleDateFormat(String pattern) ;*/用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
参数pattern是一个字符串,代表日期时间的自定义格式。*/
4.2.2、关于构造方法的模式
参数String pattern是一个字符串,区分大小写。常用的字母含义如下:
表示字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
全部的字母含义如下:
例:// 对应的日期格式如:2018‐01‐16 15:06:38
DateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");
模式中的字母不可改变,但是连接字符可以改变,其中英文字母大小写均用作模式转义,若要打印字母或字母形式的字符串,需用单引号引起来,如果需要打印单引号则需要用两个单引号(’’)来表示单个单引号(’)
4.3、常用方法
(1)public String format(Date date) :将Date对象格式化为字符串。
(2)public Date parse(String source) :将字符串解析为Date对象。/*该方法声明(throws)了ParseException异常,调用一个声明异常的方法,可以继续在调用此方法的方法声明(throws)该异常,以此类推直到main方法也声明了该异常为止;或者(try…catch)自己处理该异常。*/
五、Calendar类(java.util.Calendar)
5.1、概述
Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间1970年1月1日00:00:00.000格里高利历)的偏移量。
由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:
Calendar静态方法 public static Calendar getInstance() :使用默认时区和语言环境获得一个日历
例如:
import java.util.Calendar;
public class Demo06CalendarInit {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
}
}
5.2、常用方法
(1)public int get(int field)
:返回给定日历字段的值。
(2)public void set(int field, int value)
:将给定的日历字段设置为给定值。(有重载形式可输入三个参数分别为年月日)
(3)public abstract void add(int field, int amount)
:根据日历的规则,为给定的日历字段添加或减去指定的时间量。
(4)public Date getTime()
:返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
六、System类(java.lang.System)
该类提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System类的API文档中,有两个常用方法:
(1)public static long currentTimeMillis()
:返回以毫秒为单位的当前时间
应用:可用来测试程序执行的效率,如:
public class SystemTest1 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("共耗时毫秒:" + (end ‐ start));
}
}
(2)public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将数组中指定的数据拷贝到另一个数组中。
七、StringBuilder类(java.lang.StringBuilder)
7.1 解决的问题
如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder 类。
7.2 StringBuilder概述
StringBuilder又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。
原来StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图所示:(默认16字符空间,超过自动扩充)
7.3 String类对比StringBuilder类
字符串是常量;他们的值在创建之后不能更改。字符串的底层是一个被final修饰的数组,不能改变,是一个常量。
private final byte[] value;
进行字符串的拼接,内存就会有多个字符串,占用空间多,效率低下。
字符串缓冲区可以提高字符串的操作效率(看成一个长度可以变化的字符串)
底层也是一个数组,但是没有final修饰,可以改变长度
byte[] value = new byte[16];
7.4 构造方法
public StringBuilder();//构造一个空的StringBuilder容器
public StringBuilder(String str);//构造一个StringBuilder容器,并将字符串添加进去。
7.5 常用成员方法
public StringBuilder append(...);//添加任意类型数据的字符串形式,并返回当前对象自身。
public String toString();// 将当前StringBuilder对象转换为String对象。
public StringBuilder reverse();// 反转内容。
八、包装类(java.lang.*)
8.1 概述
基本类型数据没有对应的方法来操作这些数据,所以可以使用一个类,把基本类型包装起来,称为包装类。
在包装类中可以定义一些方法,用来操作基本类型的数据。
8.2 装箱与拆箱
装箱:从基本类型转换为对应的包装类对象。
构造方法:
Integer(int value);//构造一个新分配的Integer对象,它表示指定的int值
Integer(String s);//构造一个新分配的Integer对象,
//它表示String参数指定的int值
//(若字符串表示的不是基本类型会抛出数字格式化异常)
静态方法:
static valueOf(int i): 返回一个表示指定的int值的Integer实例。
static valueOf(String s): 返回保存指定的String的值的Integer对象。
拆箱:从包装类对象转换为对应的基本类型。
成员方法:int intValue() 以int类型返回该Integer的值
其中构造方法会有横线,表示方法过时。
8.3 自动装箱与拆箱
由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。
例如:
Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
//加法运算完成后,再次装箱,把基本数值转成对象。
ArrayList也用到了此特性。
8.4 基本类型与字符串之间的转换
对与基本类型转化为字符串,使用“” + 的方式最为常见。(重点)
或者使用包装类的toString方法。(了解)
再或者使用以下String类的valueOf方法。(了解)
字符串转化为基本类型,使用包装类的静态方法
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);//将字符串参数转换为对应的float基本类型。
public static double parseDouble(String s) ;//将字符串参数转换为对应的double基本类型。
public static boolean parseBoolean(String s) ;//将字符串参数转换为对应的boolean基本类型。