目录
1. Object 类中的 equals() 方法和 toString() 方法
5.关于时间的 Date 类和 Calendar 类以及相关的文本格式化工具类
6. System 类中的 currentTimeMillis() 和 arraycopy() 方法
注:本文只涉及几个常用方法的学习,对于与之相关的类的详细介绍及成员方法的深入探究会在后面的学习中一一给出。
1. Object 类中的 equals() 方法和 toString() 方法
public boolean equals(Object obj);//指示其他某个对象是否与此对象“相等”
public String toString();//返回该对象的字符串表示
(1) equals() 方法
Object 类是所有类的基类,因此所有的类(包括数组)都会默认继承 Object 类。Object 类的 equals() 方法的实现如下:
//Object 类中 equals() 方法的实现
public boolean equals(Object obj) {
return (this == obj);
}
从上面的方法实现中我们可以看出,对于任意的 Object 类,此方法均通过 == 对两个对象进行比较。对于基本数据类型,比较的是值是否相等;但是对于引用数据类型,== 只能比较他们的引用地址是否相等。因此对于两个对象的属性值的相等关系的判断,就需要重写这个 equals() 方法。
此时我们还需要了解一点,对于字符串 String 类的比较,已经重写了 equals() 方法,方法实现如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
因此对于字符串的等值判断,我们只需直接调用 equals() 方法即可。
(2) toString() 方法
通常,toString() 会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
值得注意的是:对于控制台打印语句 System.out.println(Object o) 默认调用该方法把对象转换为字符串再打印。
而对于 Object 类中的 toString() 方法的实现如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
简单的理解就是:包与类名 + @ + 地址哈希码的16进制无符号整数的字符串形式。
所以,对于非字符串的引用数据类型总是会默认打印它以上格式的地址,此时就需要重写 toString() 方法。
(3)下面举一个关于这两个方法重写的例子
/**
* 定义一个小狗类
* 小狗属性只有名字
* 重写判断小狗是否相等的方法
* 重写小狗信息转化为字符串的方法
*/
public class Dog {
//属性
private String name;//小狗的名字
//默认构造
public Dog() {
}
//参数为小狗名字的构造方法
public Dog(String name) {
this.name = name;
}
//getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//equals()方法重写
@Override
public boolean equals(Object o) {
//若参数的引用地址与该对象相等,则说明是同一只狗
if (this == o) return true;
//若参数实际类型不是狗,则无法比较
if (!(o instanceof Dog)) {
System.out.println("该对象不是狗,无法比较!");
return false;
}
//将Object对象向下转型为狗
Dog dog = (Dog) o;
//判断狗的名字是否相等并返回判断结果
//此处调用了Objects类的equals()方法
return Objects.equals(this.name,dog.getName());
}
//toString方法重写
@Override
public String toString() {
//规定该方法返回的字符串的格式
return "小狗——" + name;
}
}
2. Objects 类的 equals() 方法
用来判断两个对象是否相等,相对于 Object 类的 equals() 方法,新加入了对空指针的判断,因此不会出现空指针异常的情况。因此对于对象相等的判断,大多数情况下建议使用 Objects 类的 equals() 方法。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
3.Scanner类关于从控制台输入部分
首先需要注意,Scanner在实例化的时候没有无参的构造方法,必须给定一个参数说明从哪里获取值,通常情况下我们从控制台输入内容,因此构造参数为System.in。
//读取方法:若想让读取的内容转变为其他数据类型,则需要在next后加相应类型;
//如nextInt()方法获取到的值为int类型,但前提是输入的是整数,否则会报错。
public String next();//只读取输入直到空格(读到空格之前),且输入完成光标放在当前行
public String nextLine();//读取包括单词之间的空格和除回车以外的所有符号(读到行尾),输入完成光标放在下一行
//判断方法
public boolean hasNext();//如果此扫描器的输入中有另一个标记,则返回 true
public boolean hasNextInt();//判断输入值是否可以使用nextInt()方法
//。。。下面的方法同上(short、long、byte、double、float...)
下面举一个简单的例子
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {//有内容输入就继续循环
if (scanner.hasNextInt()) {//判断是否是int
System.out.println("输入的是:" + scanner.nextInt());//打印输入内容
} else {
System.out.println("格式错误,不是int类型");
break;
}
}
}
结果为:
输入:23
输入的是:23
输入:rrr
格式错误,不是int类型
4.Random类(伪随机数类)的使用
Random 类同 Scanner类 一样,我们只介绍他关于 int 类型的方法,其他如double,float,boolean 使用方法一致。
但需要注意的是,对于每个类型产生随机数的方法的实现方式是不一样的。
public int nextInt();//返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的int值(正负均包含)
public int nextInt(int n);//返回一个在0(包括)和指定值(不包括)之间均匀分布的int的伪随机数
举一个简单的例子:在 3 到 102 之间取 5 个随机数生成数组
public static void main(String[] args) {
Random random = new Random();
int[] array = new int[5];
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(100)+3;
}
System.out.println(Arrays.toString(array));
}
运行第一次:[22, 29, 65, 55, 16]
运行第二次:[101, 29, 96, 29, 17]
5.关于时间的 Date 类和 Calendar 类以及相关的文本格式化工具类
(1)Date 类(日期类)的使用
① Date 类的使用场景:Date 类表示特定的瞬间,精确到毫秒(1s = 1000ms)。
② Date类的构造方法:
Date 类有两个常用的构造方法。其中一个是无参的构造方法,表示从系统中获取当前的日期和时间;另一个是带参数的构造方法,其中传入的 long 类型的参数为从时间原点(1970 年 1 月 1 日 00:00:00)开始经历的毫秒数,并把毫秒值转化为日期返回。
public static void main(String[] args) {
//无参构造方法
Date date1 = new Date();
System.out.println(date1);
//带参构造方法
Date date2 = new Date(15790966487872L);//传入参数为long类型
System.out.println(date2);
}
结果为:
Wed Jan 15 22:04:48 CST 2020
Sun May 25 03:34:47 CST 2470
③ Date类的成员方法:
public long getTime(Date date);//把日期转换为毫秒值
Date date1 = new Date();//当前日期
System.out.println(date1.getTime());//转换为毫秒值
结果为:1579097287230
(2)DateFormat 类与 SimpleDateFormat 类的使用
① DateFormat 类是关于时间日期格式化的抽象类,而 SimpleDateFormat 类是 DateFormat 类的子类。
② 使用场景:格式化(日期转化为文本)、解析(文本转化为日期,可能抛出异常)
③ 成员方法的使用
public String format(Date date);//将一个Date格式化为日期/时间字符串
public Date parse(String source);//从给定字符串的开始解析文本,以生成一个日期
对于表示年月日以及时间等的模式字符串,在 API 中做了详细的规定。
因此在规定一个日期转换的文本格式时,必须严格按照给定的标准进行定义。
public static void main(String[] args) {
//创建日期
Date date = new Date();
//规定文本格式
DateFormat dateFormat1 = new SimpleDateFormat();//无参构造使用默认格式
DateFormat dateFormat2 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");//定义文本格式
System.out.println("默认格式为:"+dateFormat1.format(date));
System.out.println("自定义格式为:"+dateFormat2.format(date));
}
结果为:
默认格式为:20-1-15 下午10:31
自定义格式为:2020年01月15日22时31分48秒
同样的,文本信息也可以解析为 Date 格式的时间,但是在文本格式不匹配时会抛出异常。
public static void main(String[] args) throws ParseException {//抛出异常
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");//定义文本格式
System.out.println(dateFormat.parse("2020年01月15日10时31分48秒"));
}
结果为:Wed Jan 15 10:31:48 CST 2020
(3)Calendar 类(日历类)的使用
① 关于 Calendar 类的介绍:
Calendar 类是一个抽象类,它为特定瞬间与一组日历字段(年月日)之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
Calendar 类中的很多方法替代了 Date 类中的已经过时的方法,使用起来更为方便。
② Calendar 类的实例化方法:
作为抽象类,Calendar 类不能直接实例化,但出于语言环境敏感的考虑,Calendar 类提供了一个静态的实例化方法供开发者使用。
//getInstance实例化对象
Calendar calendar = Calendar.getInstance();
③成员方法:
public abstract void add(int field, int amount);//根据日历的规则,为给定的日历字段添加或减去指定的时间量
public int get(int field);//返回给定日历字段的值
public void set(int field, int value);//将给定的日历字段设置为给定值
public void set(int year, int month, int date);//设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
public void setTime(Date date);//使用给定的 Date 设置此 Calendar 的时间
public Date getTime();//返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象
下面举例说明
public static void main(String[] args){//抛出异常
//getInstance实例化对象
Calendar calendar = Calendar.getInstance();
//把Date转换为Calendar
Date date = new Date(12435466564343L);
calendar.setTime(date);
//把Calendar转换为Date
Date date1 = calendar.getTime();
//获取Calendar的字段值
calendar.get(Calendar.YEAR);//获取年
calendar.get(Calendar.MONTH);//获取月
//设置日历字段值
calendar.set(Calendar.YEAR,2088);//设置年
//设置年月日
calendar.set(1998,11,9);//设置年月日
//添加或减少字段值
calendar.add(Calendar.YEAR,-3);//日历年份-3
}
需要注意的是:西方的月份是 0 - 11 ;周天为 1 ,以此类推,周六为 7 。因此在使用 Calendar 时要注意东西方习惯的统一。
6. System 类中的 currentTimeMillis() 和 arraycopy() 方法
public static long currentTimeMillis();//返回从时间原点到现在以毫秒为单位的时间差
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
//从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
① currentTimeMillis() 方法通常用来计算程序的运行速度,即在程序开始和结束分别获取它的毫秒值相减。
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();//开始时间
System.out.println("程序运行。。。");
//计算1到10000的和
int result = 0;
for(int i = 1;i<=10000;i++){
result += i;
}
System.out.println(result);
Long endTime = System.currentTimeMillis();//结束时间
System.out.println("程序运行了" + (endTime - startTime) + "毫秒");
}
程序运行。。。
50005000
程序运行了1毫秒
② arraycopy() 方法用来复制数组副本。把 src 数组的内容复制到 dest 数组中,src 数组中从 srcPos 开始长度为 length 的内容被复制到 dest 数组从 destPos 开始的位置上;也可以对同一数组进行操作,即 src 和 dest 为同一数组。
public static void main(String[] args) {
int[] array1 = {1,4,6,7,2,5,7,9};
int[] array2 = new int[10];
//把array1中从第一个元素开始长度为5的内容复制到array2中的从第三个第元素开始的位置
System.arraycopy(array1,0,array2,2,5);
//打印array2
System.out.println(Arrays.toString(array2));
}
结果为:[0, 0, 1, 4, 6, 7, 2, 0, 0, 0]
7. Math 数学工具类
Math() 工具类包含了许多的静态的数学公式(方法),用来解决基本的数学问题。
//数的运算
public static int abs(int a);// a 的绝对值
public static double cbrt(double a);// a 的立方根
public static double sqrt(double a);// a 的正平方根
public static double ceil(double a);//向正方向取整
static double rint(double a);//四舍五入
public static double exp(double a);// e 的 a 次幂
public static double pow(double a, double b);// a 的 b 次幂
public static double log(double a);//返回 a 的自然对数(底数是e)
public static double log10(double a);//返回 a 值的底数为 10 的对数
//随机数
public static double random();//返回带正号的随机数,该值大于等于 0.0 且小于 1.0
//数的比较
public static int max(int a, int b);// a,b 中较大的一个
public static int min(int a, int b);// a,b 中较小的一个
//三角函数
public static double cos(double a);//返回 a 的三角余弦
public static double sin(double a);//返回 a 的三角正弦
public static double tan(double a);//返回 a 的三角正切