day12【Object类、常用API】
一. Object类
1. Object类的特点
- Object是所有类的父类, 每一个类都直接或者简介的继承自Object.
- 所有对象(包括数组), 都可以使用Object类中的方法
2. toString()
// 如何查看源代码
// 找到具体的类: ctrl + n
// 在类中找到具体的方法: ctrl + F12
/*
getClass().getName(): 获取类的全限定类名(包名+类名)
"@" : at, 在
Integer.toHexString(hashCode()) : 十六进制的地址值
*/
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
总结: Object类中的toString()方法, 就是用来打印地址值.但是打印地址值没有意义. 所以我们一般会重写toString方法(只需要自动生成)
3. 输出语句打印
疑问:
-
数组打印是地址值
-
集合打印是元素
-
打印时调用toString和不调用toString效果是一样的
-
字符数组打印的是元素
解答
-
println()方法的源代码
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); // 打印s newLine(); // 换行 } } // ↓ // String中的valueOf()方法 public static String valueOf(Object obj) { // obj就是我们传入的p // 先判断obj是否为null // 如果是null, 就直接返回"null" // 如果不是null, 调用了toString()方法 return (obj == null) ? "null" : obj.toString(); // 输出语句默认调用toString(). }
4. equals()
== :
比较基本数据类型时, 比较的是值
比较引用数据类型时, 比较的是地址值
p1.equals(p2)
// =================================
public boolean equals(Object obj) {
// this: 谁来调用我(我所在的方法), 我就代表谁
// this: p1
// obj: p2
return (this == obj);
}
总结: Object类中的equals方法是用来比较地址值, 没有意义. 所以我们会重写Object类中的equals()方法, 重写之后要比较的是属性值(只需要自动生成).
二. 日期时间相关的类
1. Date
构造方法
Date() : 创建Date对象, 用来代表当前时间
Date(long millis) : 创建Date对象, 表示从1970年1月1日 00:00:00加上参数中的毫秒数
成员方法
getTime(): 获取该Date对象代表的毫秒值
2. SimpleDateFormat(重点)
作用
- 格式化(日期Date >> 文本String)
- 解析(文本String >> 日期Date)
构造方法
SimpleDateFormat(String): 创建SimpleDateFormat对象, 并指定转换时使用的模式
模式:
"yyyy/MM/dd HH:mm:ss"
成员方法
String format(Date) : 格式化, 将Date格式化成字符串
Date parse(String) : 解析: 将字符串解析成Date对象
3. Calendar
- 日历
创建对象
Calendar.getInstance();
成员方法
get(字段): 获取指定字段对应的值
set(字段, 值): 修改指定字段的值
set(年, 月, 日, 时, 分, 秒)
了解:
add(字段, 加上的值)
getTime() : 将Calendar对象, 转换成Date
三. System类
工具类中的成员都是使用static修饰的, 所以会多做一步将构造方法使用private修饰.
静态方法
- currentTimeMillis
public static long currentTimeMillis() : 获取当前时间的毫秒值
- arrayCopy
public static void arrayCopy(
Object src, // 原数组
int srcPos, // 从原数组的哪个索引开始拷贝
Object dest, // 目标数组
int destPos, // 从目标数组的哪个索引开始拷贝
int len // 拷贝的长度(元素的个数)
)
- exit
public static void exit(int status) : 退出Java虚拟机
四. StringBuilder(重点)
- StringBuilder: 字符串缓冲区
构造方法
StringBuilder() : 创建字符串缓冲区, 表示的是 ""
StringBuilder(String) : 创建字符串缓冲区, 表示的是与参数相同的字符序列
成员方法
append(Object) : 字符串缓冲区的拼接功能
toString() : 将StringBuilder转换成String字符串
需求
- 将数组{1,2,3,4,5}转换成字符串, 指定格式"[1, 2, 3, 4, 5]"
/**
* 此方法用于将数组转换成指定格式的字符串
*/
public static String array2String(int[] arr) {
// 创建字符串缓冲区
StringBuilder sb = new StringBuilder("[");
// 遍历数组
for (int i = 0; i < arr.length; i++) {
// 通过索引, 获取指定索引位置的元素, 获取到每一个元素
int a = arr[i];
// 判断是否是最后一个元素
if (i == arr.length - 1) {
sb.append(a).append("]");
}else {
sb.append(a).append(", ");
}
}
return sb.toString();
}
五. 包装类
1. 回顾包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
2. 自动装箱和自动拆箱
- 自动装箱: 自动将基本数据类型, 转换成对应的包装类
- 自动拆箱: 自动将包装类, 转换成对应的基本数据类型
3. 将指定格式的字符串, 转换成基本数据类型
// "123"(String) ---> 123(int)
// "23.4"(String) ---> 23.4(duoble)
// "false" ---> false(boolean)
// 每一个包装类中都有一个(除了Character), parseXxx(String), Xxx是基本数据类型
// Integer : parseInt()
// Double : parseDouble()
// Boolean : parseboolean()
// ...
// Integer
String s1 = "123";
int i = Integer.parseInt(s1);
System.out.println(i);
// Double
String s2 = "23.4";
double d = Double.parseDouble(s2);
System.out.println(d);
// Boolean
String s3 = "false";
boolean b = Boolean.parseBoolean(s3);
System.out.println(b);
4. 扩展: 面试题
// 比较地址值
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6); // true
// 自动装箱, 底层会使用Integer.valueOf()
// Integer中valueOf()方法的源代码
public static Integer valueOf(int i) {
// low=-128, high=127
if (i >= IntegerCache.low && i <= IntegerCache.high) {
// cache: 数组中的元素是Integer类型, 内容从-128 ~ 127
return IntegerCache.cache[i + (-IntegerCache.low)]; // i + 128
}
return new Integer(i);
}