JAVA常用类库
目录
Objects类
Objects类包含了一些实用的static程序方法,用于操作对象或是在操作前检查某些条件。这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围等等。
Objects类的所有方法都是静态的,也就是说可以直接通过类名调用,不需要实例化对象再调用。
下面对objects类的方法进行整理:
equals方法
作用:对传入的两个参数进行内容比较。
源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
详解:
注:这个方法做了不抛出空指针异常的处理,使得程序运行时较为安全,不会因为异常轻易崩溃。
方法传入两个参数a,b,
如果a,b是基本数据类型,那么这个方法就与“==”无异,直接判断值是否相等;如果相等,返回true,不等返回false,很基本的数值比较。
如果a,b是对象的引用,那么就是判断两个对象的地址是否相等,如果相等,根据逻辑运算的规则,直接跳过右边的运算返回true(对象连地址都相同了,那肯定是同一个对象啦,自己跟自己比没有意义啦);如果地址不同,那么进入右边的运算,判断 a 的引用的地址是否是null(空指针),如果是null,根据逻辑运算规则,直接跳过右边运算,返回false,如果 a 的地址不是null,那么调用a的equals()方法,判断a,b地址是否相等。 最后这一步看似重复比较了地址,但是做到了不抛出空指针异常。
deepEquals方法
作用:深度比较两个对象,如果参数是数组对象,则使用Arrays.deepEquals方法比较。当我们不清楚对象的具体类型时,便可以使用该方法来判断。
源码:
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
static boolean deepEquals0(Object e1, Object e2) {
assert e1 != null;
boolean eq;
if (e1 instanceof Object[] && e2 instanceof Object[])
eq = deepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 instanceof byte[] && e2 instanceof byte[])
eq = equals((byte[]) e1, (byte[]) e2);
else if (e1 instanceof short[] && e2 instanceof short[])
eq = equals((short[]) e1, (short[]) e2);
else if (e1 instanceof int[] && e2 instanceof int[])
eq = equals((int[]) e1, (int[]) e2);
else if (e1 instanceof long[] && e2 instanceof long[])
eq = equals((long[]) e1, (long[]) e2);
else if (e1 instanceof char[] && e2 instanceof char[])
eq = equals((char[]) e1, (char[]) e2);
else if (e1 instanceof float[] && e2 instanceof float[])
eq = equals((float[]) e1, (float[]) e2);
else if (e1 instanceof double[] && e2 instanceof double[])
eq = equals((double[]) e1, (double[]) e2);
else if (e1 instanceof boolean[] && e2 instanceof boolean[])
eq = equals((boolean[]) e1, (boolean[]) e2);
else
eq = e1.equals(e2);
return eq;
}
详解:
通过这两段简单的代码应该可以看出:
1、如果两个数组使用equals返回true,则使用deepEquals也返回true,也就是说在比较的两个数组均为一维数组的前提下,equals和deepEquals的比较结果没有差别;
2、如果要比较多维数组,则需要使用deepEquals方法;
toString方法
重载一:
public static String toString(Object o) {
return String.valueOf(o);
}
作用:返回对象的字符串表示形式,如果引用为null,则返回“null”,不会抛出异常。
重载二:
public static String toString(Object o, String nullDefault) {
return (o != null) ? o.toString() : nullDefault;
}
作用:如果第一个参数不是null,则返回在第一个参数上调用 toString 的结果,否则返回第二个参数。
compare方法
作用:判断两个任意类型的参数是否相同,相同则返回0。如果两个参数都是null
则返回0。
请注意,如果其中一个参数为null, NullPointerException
可能会也可能不会抛出null ,具体取决于排序策略(如果有), 由Comparator
选择具有null的值。
源码:
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
isNull方法
作用:判断对象是否为空,如果是则返回true
源码:
public static boolean isNull(Object obj) {
return obj == null;
}
nonNull方法
作用:判断对象是否不为空,如果是则返回true
源码:
public static boolean nonNull(Object obj) {
return obj != null;
}
hash方法
作用:生成哈希码,该方法的参数列表是可变参数
源码:
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
详解:
将所有的输入值都放到一个数组里,然后调用Arrays.hashCode(Object[])方法来实现哈希码的生成。
对于当一个对象包含多个成员、重写Object.hashCode时,hash方法非常有用。
例如,如果有三个字段,对象x
, y
,和z
,一个可以这样写:
@Override public int hashCode() { return Objects.hash(x, y, z); }
hashCode方法
作用:返回一个对象的哈希码值
源码:
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
Date类
Date
类表示特定的时刻,精度为毫秒
构造方法:
Date(){} 生成当前时间
Date(long date){} 生成当前时间减去 date(毫秒) 后的时间
getTime方法
public long getTime()
返回自1970年1月1日00:00:00 GMT至今的总毫秒数。
例
public class Demo1 {
public static void main(String[] args) {
Date date = new Date();
long time = date.getTime() - (24*60*60*1000);
Date date2 = new Date(time);
System.out.println(date.toString());
System.out.println(date2.toString());
}
}
输出:
Sun Feb 07 17:15:16 GMT+08:00 2021
Sat Feb 06 17:15:16 GMT+08:00 2021
DateFormat类
format方法
作用:将date对象格式化为日期时间字符串
public final String format(Date date)
接收一个date类型的对象参数,返回值是String类型
parse方法
作用:将时间字符串转为date对象
public Date parse(String source) throws ParseException
接收一个String类型字符串,返回一个Date类型的对象。
例子:
public class Demo1 {
public static void main(String[] args) throws ParseException {
/**
* y 年
* M 月
* d 日
* H 时
* m 分
* s 秒
*/
// 通过SimpleDateFormat类创建实例化对象,并在参数列表输入想要的格式
SimpleDateFormat f = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//format方法:将date对象转为自定义格式的时间字符串
String test = f.format(new Date());
System.out.println(test);
//parse方法:将与模板格式相同的字符串转为date对象
Date d =f.parse("2021年02月07日 17:43:00");
System.out.println(d.getTime());
}
}
Calendar类
创建日历对象:
日历类,它是一个抽象类,没有办法通过new关键字创建对象,但是可以使用它提供的getInstance()方法来创建实例化对象。
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
}
}
日历类将年月日等数据存储在一个字段数组中,我们如果想要获取年月日时分秒,就要通过调用get方法,并传入数组的下标(或是下标值对应的常量名),即可获取该下标对应的值。
常用方法:
get方法:获取日历中的信息
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);//get传入的参数是Calendar类中的常量,是字段数组的下标,代表年
System.out.println(year);
int day = c.get(Calendar.DAY_OF_YEAR);//传入的是获取今天是该年的第几天
System.out.println(day);
}
}
输出
2021
38
set方法:获取并修改数据
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR,2022);//set,将year修改为2020
int year = c.get(Calendar.YEAR);
System.out.println(year);
}
}
输出
2022
add方法:对数据进行+-操作
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR,1);//year+1,传入负数就是-1
System.out.println(c.get(Calendar.YEAR));
}
}
输出
2022
getTime方法:转为Date类型的对象
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date d = c.getTime();
System.out.println(d);
}
}
输出
Sun Feb 07 21:19:58 GMT+08:00 2021
getActualMaximum方法:获取某字段最大值
public class Demo1 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int maxmonth = c.getActualMaximum(Calendar.MONTH);//获取最多有几个月
int maxday = c.getActualMaximum(Calendar.DAY_OF_MONTH);//获取该月中最多有多少天
System.out.println(maxmonth);
System.out.println(maxday);
}
}
输出
11 //计算机中月份是0-11 11代表12月
28 2021年2月最多28天
总结
目前刚步入常用类库的学习,暂时整理这么多,以后会随着学习的不断深入,更新更多细节的知识点