Object类
toString方法
直接使用
String toString() 返回该对象的字符串表示
示例:
public static void main(String[] args){
Person person = new Person("小美", 20);
String s = person.toString();
System.out.println(s);
}
运行后输出结果为包路径以及person对象的地址
删掉toString方法这行后输出不变
故直接打印对象的名字,就是调用对象的toString方法。
重写后使用
直接打印对象的地址值在大多数情况下并没有什么用处,所以我们需要重写toString方法。
比如:
public static void main(String[] args){
Person person = new Person("小美", 20);
String s = person.toString();
System.out.println(s);
}
@Override
public String toString(){
return 111;
}
这时候不管上面的对象里是什么内容
下面你写了return 111,它就会返回111
你写什么,它返回什么。
但这么写似乎也没什么意义,
我们用它是想按自己的格式来输出对象信息
所以我们会这样做:
public static void main(String[] args){
Person person = new Person("小美", 20);
String s = person.toString();
System.out.println(s);
}
public String toString(){
return "name:" + name + ",age:" + age;
}
这时打印出的结果就是:
name:小美,age:20
equals方法
指示其他某个对象是否与此对象“相等”。
方法详解
在源码中,该方法写成:
public boolean equals(Object obj){
return(this == obj);
}
注意它用 == 这一比较运算符
对于基本数据类型(直接用,比如int long……)
==比较的是值
对于引用数据类型(需要new出对象使用的)
==比较的是两个对象的地址值
直接使用
public static void main(String[] args){
Person person1 = new Person("小美", 20);
Person person2 = new Person("小红", 18);
boolean a = person1.equals(person2);
System.out.println(a);
}
显然二者地址不同,
输出结果为false
重写后使用
equals方法默认比较两个对象的地址值,一般情况下没有意义
所以我们需要重写该方法,使其能进行对象属性之间的比较。
那么问题又来了:
public boolean equals(Object obj){
return(this == obj);
}
该方法的传入参数为Object类
所以传入的对象也被转换为了Object
原理如下
Object obj = person2 = new Person("小红", 18);
经过这一转换
我们无法直接看到person2中的特有属性name和age
以上是多态的弊端
解决:我们使用向下转型来处理,把Object类型转换为Person。
重写代码示例
@Override
public boolean equals(Object obj){
//传入的参数如果是this本身,直接返回true
if(obj == this){
return true;
}
//如果传入的参数为null,直接返回false
if(obj == nall){
return false;
}
//向下转型
if(obj instanceof Person){
Person p = (Person)obj;
//比较两个对象的属性,一个是this(person1),另一个是p(obj -> person2)
boolean a = this.name.equals(p.name) && this.age == p.age;
return a;
}
//if条件不成立代表两个比较的对象不属于一个类,直接输出false
return false;
}
拓展
Objects类可防止空指针异常(解决null不能调用方法的问题)
时间日期类
Date类
java.util.Date:表示日期和时间的类
类 Date 表示特定的瞬间,精确到毫秒
public static void main(String[] args){
//获取时间原点(1970-01-01 00:00:00英国格林威治时间)到目前系统时间共经历了多少毫秒)
//中国属于东八区,需要加八个小时
long a = System.currentTimeMillis();
//一天 = 24 x 60 x 60 = 86400秒
}
构造方法与成员方法
空参数构造
获取当前系统日期和时间
Date date = new date();
带参构造
传递毫秒值,将其转换为Date日期
Date date = new date(long date);
getTime()方法
时间→毫秒
相当于System.currentTimeMillis()
Date date = new Date();
long time = date.getTime();
DateFormat类
日期/时间格式化子类的抽象类
作用:格式化(日期→文本),解析(文本→日期)
因为是抽象类,所以不能直接创建对象,需通过子类进行方法调用👇
SimpleDateFormat子类
构造方法
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造
String pattern:传递指定的模式(区分大小写)
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
写对应的模式,会把模式替换为对应的日期和时间
比如:
“yyyy-MM-dd HH:mm:ss”
成员方法
String format(Date date)
按照指定的模式,把Date日期,格式化为符合模式的字符串
Date parse(String source)
把符合模式的字符串,解析为Date日期
Calendar类
Calendar类是一个抽象类,里边提供了很多操作日历字符的方法(YEAR, MONTH, DAY_OF_MONTH, HOUR)
Calendar类无法直接创建对象使用,里边有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象,包含各种信息👇
Calendar c = Calendar.getInstance();
常用方法
参数说明
int field:日历类的字段,可以使用Calendar类的静态成员变量获取
变量名 | 意义 |
---|---|
YEAR | 年 |
MONTH | 月 |
DATE | 月中的某一天 |
DAY_OF_MONTH | 月中的某一天 |
HOUR | 时 |
MINUTE | 分 |
SECOND | 秒 |
以上变量修饰符均为public static final int
int value:给指定字段设置的值
int amount:增加/减少指定的值(增加:正数,减小:负数)
public int get(int field)方法
返回给定日历字段的值。
//使用getInstance方法获取Calendar对象
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
运行后year值为当前年份。
ps:西方月份为0-11
public void set(int field, int value)方法
将给定的日历字段设置为定值。
//使用getInstance方法获取Calendar对象
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2001)
将年份设置为2001年👆
也可以同时设置年月日👇
//使用getInstance方法获取Calendar对象
Calendar c = Calendar.getInstance();
c.set(2001,2,14);
public abstract void add(int field,int amount)方法
根据日历的规则,为给定的字段添加或减去指定的时间量。
public Date getTime()方法
返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
通俗来讲,就是获取当前时间。
System类
currentTimeMillis()方法
返回以毫秒为单位的当前时间,常用来测试程序的效率
arraycopy(Object src, int srcPos, Object dest, int destPose, int length)方法
将数组中的指定数据拷贝到另一个数组中
参数说明:
- src - 源数组
- srcPos - 源数组中的起始位置
- dest - 目标数组
- destPos - 目标数组中的起始位置
- length - 要复制的数组元素的数量
StringBuilder类
对于String类:
字符串是常量;它们在创建后不能改变
字符串的底层是一个被final修饰的数组,不能改变,是一个常量
源码:private final byte[] value;
进行字符串的相加,内存中就会有多个字符串,占用空间多,效率低下
对于StringBuilder类:
又被叫做字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)
其底层也是一个数组,但是没有被final修饰,可以改变长度。
源码:byte value = new byte[16];
StringBuilder在内存中始终是一个数组,占用空间少,效率高
如果超出了StringBuilder的容量,会自动扩容
构造方法
StringBuilder():构造一个不带任何字符的字符串生成器,其初始容量为16个字符。
StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容。
常用方法
append(…)方法
添加任意类型数据的字符串形式,并返回当前对象自身。
无需接收返回值,自动返回👇
StringBuilder a = new StringBuilder(str);
a.append(12);
a.append("aaa");
a.append("hello");
//链式编程:返回方法值是一个对象,可以继续调用方法
a.append("aaa").append(111).append(true);
toString()方法
将StringBuilder转化为String
StringBuilder a = new StringBuilder(str);
String b = a.toString();
Math类
话不多说,直接上代码👇
public static void main(String args[]){
/**
*Math.sqrt()//计算平方根
*Math.cbrt()//计算立方根
*Math.pow(a, b)//计算a的b次方
*Math.max( , );//计算最大值
*Math.min( , );//计算最小值
*/
System.out.println(Math.sqrt(16)); //4.0
System.out.println(Math.cbrt(8)); //2.0
System.out.println(Math.pow(3,2)); //9.0
System.out.println(Math.max(2.3,4.5));//4.5
System.out.println(Math.min(2.3,4.5));//2.3
/**
* abs求绝对值
*/
System.out.println(Math.abs(-10.4)); //10.4
System.out.println(Math.abs(10.1)); //10.1
/**
* ceil天花板的意思,就是返回大的值
*/
System.out.println(Math.ceil(-10.1)); //-10.0
System.out.println(Math.ceil(10.7)); //11.0
System.out.println(Math.ceil(-0.7)); //-0.0
System.out.println(Math.ceil(0.0)); //0.0
System.out.println(Math.ceil(-0.0)); //-0.0
System.out.println(Math.ceil(-1.7)); //-1.0
/**
* floor地板的意思,就是返回小的值
*/
System.out.println(Math.floor(-10.1)); //-11.0
System.out.println(Math.floor(10.7)); //10.0
System.out.println(Math.floor(-0.7)); //-1.0
System.out.println(Math.floor(0.0)); //0.0
System.out.println(Math.floor(-0.0)); //-0.0
/**
* random 取得一个大于或者等于0.0小于不等于1.0的随机数
*/
System.out.println(Math.random()); //小于1大于0的double类型的数
System.out.println(Math.random()*2);//大于0小于1的double类型的数
System.out.println(Math.random()*2+1);//大于1小于2的double类型的数
/**
* rint 四舍五入,返回double值
* 注意.5的时候会取偶数
*/
System.out.println(Math.rint(10.1)); //10.0
System.out.println(Math.rint(10.7)); //11.0
System.out.println(Math.rint(11.5)); //12.0
System.out.println(Math.rint(10.5)); //10.0
System.out.println(Math.rint(10.51)); //11.0
System.out.println(Math.rint(-10.5)); //-10.0
System.out.println(Math.rint(-11.5)); //-12.0
System.out.println(Math.rint(-10.51)); //-11.0
System.out.println(Math.rint(-10.6)); //-11.0
System.out.println(Math.rint(-10.2)); //-10.0
/**
* round 四舍五入,float时返回int值,double时返回long值
*/
System.out.println(Math.round(10.1)); //10
System.out.println(Math.round(10.7)); //11
System.out.println(Math.round(10.5)); //11
System.out.println(Math.round(10.51)); //11
System.out.println(Math.round(-10.5)); //-10
System.out.println(Math.round(-10.51)); //-11
System.out.println(Math.round(-10.6)); //-11
System.out.println(Math.round(-10.2)); //-10
}