文章目录
一、Object类
1. toString
1.1 重写toString方法
我们希望直接打印出该对象的属性。以这种格式:类名{成员变量名=成员变量值, ...}
1.2 重写toString方法总结
上面的代码,可以用快捷键快速插入: Alt Insert
2. equals
equals
可以比较两个地址值是否相等
2.1 重写equals方法1
比较地址值和==
没有什么区别,所以我们应该重写equals
方法,让其可以比较值。
分析一波:
- 调用
equals
有一个隐含的多态,man1和man2实际属于object类 - 要知晓对象属性,要使用向下转型
- 再运行一次
2.2 重写equals方法2
如果obj不是Person类型呢?对,用instanceof
进行判断
2.3 重写equals方法3
有一些特殊的值,可以直接给出结果,提高程序效率。
null
直接返回false即可- 如果对象是本身 直接返回true
2.4 重写equals方法总结
上面的代码,可以用快捷键快速插入: Alt Insert
2.5 Objects
这个Objects是个什么鬼?我们用Ctrl
点进去看一下源码:
大致是说,这是一个关于Object类的一个静态工具集。我们再看向equals方法:
- 如果a的地址值直接等于b的地址值,短路返回true
- 如果a不等于
null
时,输出a.equals(b)的值
a.equals(b)有一个缺点。当a为null时,会产生空指针异常。Objects的equals可以防止空指针异常。
二、时间日期类
1. Date
表示特点的瞬间 ,精确到毫秒(ms, 1000ms = 1s)
- 毫秒值可以对日期时间进行直接计算
System.currentTimeMillis()
返回一个Long
类型数。这个数是从1970-01-01 00:00:00(英国格林威治 标准时间)
迄今所经过的毫秒数。(中国属于东八区,要加八小时)- 换算关系: 1day = 864E+5
2. Date的使用
构造方法(空参): 显示当前日期
构造方法(全参): 显示输入的毫秒值对应的时间(L类型)
转换为毫秒值:
3. DateFormat
DateFormat
是日期时间格式化的抽象类。功能是使Date和String
-
格式化: 使Date按特定的格式转化为String
-
解析: 按照指定的格式,把String转换为Date
3. SimpleDateFormat使用
构造方法: DateFormat是一个抽象类,它有一个直接子类SimpleDateFormat
格式: 比如==“yyyy年MM月DD日 HH小时mm分钟ss秒”==
3.1 格式化
- 创建对象
- 使用format()方法
3.2 解析
- 创建对象
- 使用parse()成员方法
4. Calendar
日历类是一个抽象类,它里面有一个很好用的静态方法getInstance()
,可以直接创建日历对象(返回一个Calendar对象),而不需要通过直接子类 。
4.1 Calendar创建
4.2 Calendar常用方法
4.2.1 get方法
获取指定字段的值,比如年份,月份
int field
: Calendar类对象,可以使用Calendar类静态成员变量获取(以下来自Calendar源码):
PS: 其实就是代号
注意: 这里面的月份是从0开始的
4.2.2 set方法
设置指定字段的值
set有一个重载形式: set(年, 月, 日)
4.2.3 add
给指定的字段,增加/减少指定的值
4.2.4 getTime
把日历对象,转换为日期对象
三、System类
System用以获取系统相关信息或进行系统级操作
System不能被实例化,同时拥有许多可以直接使用的静态方法
1. currentTimeMillis
常用该方法,记录程序运行时间。
- (对程序进行优化时,可以根据各部分的耗时和理想耗时的差距,确定优化方案)
- (可以进行时间复杂度对比)
2. arraycopy
四、StringBuilder
StringBuilder
又称为字符串缓存区
1. 为什么要使用StringBuilder
- 字符串底层是被
final
修饰的数组,所以它不可变
private final byte[] values;
- 进行字符串的相加,内存中就会产生多个字符串,占用空间多,效率低下
StringBuilder
字符串缓存区,可以提高字符串的操作效率。(可以理解为可变字符串)
- 底层也是数组,但是没有被
final
修饰
byte[] value = new byte[16]; // 初始容量是16
可以看到,StringBuilder
自始至终就一个数组(StringBuilder容器
),占用空间少,效率高(超过16会自动扩容)
2. 构造方法
3. append方法
追加方法,返回本身(所以直接调用就行,不用接收返回值)
append(Object vlue)
接收任意对象作参数:
返回值是本身的,可以使用链式编程:
刚才那些代码,可以写成这样
4. toString
StringBuilder
和Sting
可以相互转化
- 构造方法:
Sting
-->StringBuilder
- toString:
StringBuilder
-->Sting
五、包装类
还记得ArrayList只能接收引用数据类型时,我们是怎么传递基本数据类型的?答,使用对应的包装类
1. 什么是包装类
包装类: 基本数据类型虽然使用方便,但是并没有对应的方法来操作这些数据。于是,可以使用一个类,把基本数据的类型装起来,在类中定义一些方法,这个类就叫包装类 。
包装类在java.lang包下,不需要导包
基本类型(基本类型) | 包装类(引用类型) |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
floot | Floot |
double | Double |
char | Character |
boolean | Boolean |
2. 装箱与拆箱
装箱: 基本类型 --> 对应的包装类
拆箱: 包装类 --> 对应的基本类型
下面以Integer
和int
为例
2.1 装箱
装箱,可以采用构造方法或成员方法
- 构造方法:
注意: 第二个构造方法,传入的是诸如"100"之类的字符串。如果是"a",则会报错。 - 成员方法: 静态方法直接使用
划线,表示该方法已废弃
2.2 拆箱
拆箱,只有一个方法
3. 自动装箱与拆箱
JDK1.5之后,基本数据类型和包装类之间,可以互相自动地拆箱和装箱。
4. 基本类型和字符串相互转化
4.1 基本类型 --> 字符串
- 基本类型加上一个空字符串(工作中常用)
- 包装类的静态方法
toString
(不是Object类的,是重载后的) String
类的valueOf
静态方法
4.2 字符串 --> 基本类型
使用包装类型的静态方法,parseXXX()