一 Object类
在一个类没有继承其他类的情况下,则当前类默认继承Object类作为父类。在Object类中,有一个无参构造。此外,作为java工程师,必须知道Object类中的以下方法:
1.1 toString介绍
返回对象的字符串表示形式。类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”以及对象的哈希码的无符号十六进制表示形式组成。其底层实现如下:
``String.valueOf(x);
return (obj==null)? "null":obj.toString();
即通过三元表达式判断对象是否为null,若为null则返回一个空字符串,不为空则调用父类中的toString();换句话说,此方法返回一个等于值的字符串:
getClass().getName()+'@'+Integer.toHexString(hashCode())
1.2 重写toString():
@override
public String toString(){
return "name:"+name+",age:"+age; //重写的内容
}
toString方法中的目的就是给对象进行重写的,输出对象中所有成员属性值。在做测试时,可以直接重写此方法。
二 equals方法
2.1 equals方法判断字符串是否相等
char只能保存单个字符,String则可以保存字符串。String的底层是基于数组实现的。
判断两个字符串是否相等,返回值为布尔类型。
String str1 = "value1";
String str2 = "value2";
System.out.println(str1.equals(str2));
输出结果为false,表明str1和str2不相等。
然而,对于下面这种情况:
String str3 = null;
System.out.println(str3.equals(str2));
运行后会报错。如果使用null.equals(字符串),则会报空指针错误。字符串.equals(null)不报错。
2.2 equals判断两个自定义对象
对于两个自定义对象,需要重写equals才能判断两个值是否相等。
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.equals(s2));
此时返回false。在Object父类中,equals方法的实现是比较两个对象的内存地址是否相同,而不是两个对象的成员属性值是否相同。底层源码如下:
public boolean equals(Object obj){
return (this == obj);
}
那么,如何才能利用equals方法判断两个自定义对象是否相等呢?这就需要在子类中对equals方法进行重写。
2.3 重写equals方法
若要比较两个对象的值是否相同,必须在子类中对equals方法进行重写。以子类为Student为例,子类中有(int age)和(String name)属性。
@override
public boolean equals(Object obj){
if(this == obj) return true;
if(obj == null || this.getClass()!=obj.getClass()) return false;
Student s2 = (Student) obj; //强转类型
return this.age == s2.age && this.name.equals(s2.name);
}
重写后,比较的是两个类中的成员属性值,重新运行如下代码:
Student s1 = new Student("zhang",18);
Student s2 = new Student("zhang",18);
System.out.println(s1.equals(s2));
输出结果为true,因为此时比较的是构造函数内的两组形参是否一致。
三 instanceof
instanceof通过返回一个布尔值来指出,某个对象是否是某个类或者是该特定类的子类的一个实例。也就是说,instanceof用来判断一个对象是不是属于一个类。
public class Animal{
Animal cat = new cat();
if(cat instanceof Dog){
//false
sout("猫是狗类");
}else{
//true
sout("猫不是狗类");
}
}
public class Cat extends Animal{}
public class Dog extends Animal{}
这种方法的作用是判断能否强转。例如,欲将cat对象强转为Dog类,即执行如下代码:
Dog dog = (Dog) cat;
在编译时程序不报错,但运行时程序会报错。为了避免程序在运行时报错,增加debug的工作量,提前用instanceof判断能否具备强转资格,不具备则执行else语句。
四 String类
4.1 replace替换方法
replace方法将字符串中的指定内容换成新内容。例如:将字符串中的“1111”替换为“2222”:
String str = "my1111";
String newStr = str.replace("1111","2222");
此时,newStr的值为“my2222”。若有一字符串为“my1111and1111”,需要替换为“my2222and1111”,则使用replaceFirst方法,即:
String str = "my1111and1111";
String newStr = str.replaceFirst("1111","2222");
此时newStr的值为“my2222and1111”。同理,若替换全部,则使用replaceAll。
4.2 spilt分隔方法
通过制定符号将字符串分隔,最终返回数组类型,例:
String str = "北京|天津|上海|广州";
String[] arrays = str.split("\\|");
即可按照|进行分隔,结果为:
arrays[0] = "北京" arrays[1] = "天津" arrays[2] = "上海" arrays[3] = "广州"
注意:"\"为转译符,若不添加,则程序可能出错。
4.3 indexOf方法
indexOf方法用来判断字符串中是否存在指定的字符,若存在则返回开始的下标,不存在则返回-1,例:
String str = "aoligei";
System.out.println(str.indexOf("li")); //存在,返回2
System.out.println(str.indexOf("wang")); //不存在,返回-1
如果想要从某一处开始查找,只需知道起点的下标index,执行如下代码:
System.out.println(str.indexOf("li",index));
五 Math类
Math类没有提供公开访问的构造函数,因为在其源码中,无参构造函数是私有的。且提供的api方法都加上了static关键字,因此使用该方法,可写:类名称.方法名称,例:
Math.abs(数); // 返回绝对值
Math.ceil(double类型的数); // 向上取整
Math.floor(double类型的数); // 向下取整
Math.round(double类型的数); // 四舍五入
Math.max(sum1,sum2); // 返回大的数
Math.min(sum1,sum2); // 返回小的数
Math.pow(a,b); // 返回a的b次幂,double类型
Math.random(); // 返回一个随机数,范围是[0.0,1.0)
六 System类
受final修饰,是最终类,无法被继承。其方法均为final,无参构造方法是私有的,故没有提供公开访问的构造函数。主要api:
System.exit(0); // 正常停止jvm,下面的代码不继续运行。设定值零表示正常退出,非零表示异常退出
System.currentTimeMillis(); // 获取当前系统时间,1970年1月1日至当前时间,返回long类型,以毫秒为单位
例如,要判断for循环执行了多长时间:
long start = System.currentTimeMillis();
for(){}
long end = System.currentTimeMillis();
那么,for循环的执行时间就是end-start(单位:毫秒)。
七 Arrays类
Arrays是util包下的类,此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法。
int arrs = {94,88,25,36,4};
System.out.println(arrs); // 输出的是内存地址
String str = Arrays.toString(arrs); // 将数组转化成字符串
System.out.println(arrs); // 输出的是[94,88,25,36,4]
Arrays.sort(arrs); // 排序,底层封装好了快速排序,传递的数组是引用类型的
System.out.println(Arrays.toString(arrs)); // 输出的是[4,25,36,88,94]
那么Arrays类就相当于一个工具类。众所周知,java是一个面向对象的语言,如果工程师不满足jdk提供的工具类,也可自行构造和封装工具类,便于以后直接使用。在构造工具类时,要注意:
构造方法用private关键字修饰,即构造方法为私有类型,不提供公开访问的构造函数。
用public static关键字修饰工具类的方法,可直接通过类名.构造方法使用该工具。
八 基本数据类型对应的包装类
Java中的基本数据类型:四种整数型(byte,short,int,long),两种浮点型(float,double),一种字符型(char),布尔类型(boolean),对应包装类:
8.1 Integer
int属于基本数据类型,Integer包装了int类型。包装类就是对原始基本数据类型进行包装,基本方法是相同的,目的是便于与字符串类型之间相互转化。
Integer.MAX_VALUE; // int的最大值 2147483647
Integer.MIN_VALUE; // int的最小值 -2147483648
Integer的构造方法:
Integer a = new Integer(数); // 传递数值,已过时
Integer.valueOf(数); // 传递数值
Integer b = new Integer("数字"); // 传递数字型的字符串,强转成整数类型,已过时
Integer.valueOf("数字"); // 传递数字型的字符串,强转成整数类型
8.2 String类中的valueOf方法
将int类型转为字符串类型:
int a = 5;
String a1 = ""+a; // 第一种方式
String a2 = String.valueOf(a); // 第二种方式。valueOf方法重载,可将int,char,char[],long,float,double,boolean,Object类型转为字符串
使用String中的valueOf方法,可将多种类型直接转换成String类型。
8.3 int和String相互转换
将String类型转换成int类型,前提条件是String类型存放的字符串必须是数字。
String str = "12345";
Integer sum = Integer.valueOf(str); // 字符串转数字
int i = sum.intValue(); // 返回int类型
intValue不是静态方法,需要先new出对象,通过“对象实例.intValue”方法,sum是一个对象。还可使用parseInt方法:
String str = "12345";
int a = Integer.parseInt(str); // a = 12345
8.4 int和Integer的区别
int属于基本数据类型,Integer属于int的包装类,是一个类,需要new对象。
基本数据类型 存放在栈中,包装类 存放在堆中。
在输出包装类时,底层会调用toString方法。
Integer默认值为null,int默认值为0。
包装类通过引用传递,数据类通过值传递。
在实际开发中,往往使用包装类,很少使用基本数据类型。
8.5 java的装箱和拆箱
装箱:自动将基本数据类型转换为包装类型。
拆箱:自动将包装类型转换为基本数据类型。
Integer a = 100; // 装箱 基本数据类型->为包装类型
int b = a; // 拆箱 包装类型->为基本数据类型
装箱的底层是Integer.valueOf(int i),拆箱的底层是intValue()。
九 Date类
使用Date类时,应引入java.util.Date,注意不要引到别的包。
Date date = new Date();
System.out.println(date); // 输出一串描述时间的字符串
9.1 常用方法
Date date = new Date();
date.getTime(); // 返回的是从1970年1月1日零点 到 现在的毫秒数 时间戳
long time = 1000*60*60; //一小时
date.setTime(time); // 此时date表示的时间为初始时间+time,要考虑时差
9.2 SimpleDateFormat
SimpleDateFormat可以将Date对象转化为便于阅读的时分秒格式字符串,也可把字符串转化为对象。
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(); // 无参构造
String strDate = simpleDateFormat.format(date); // 22-09-11 下午3:50
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(yyyy年MM月dd日HH小时mm分ss秒); // 有参构造
String strDate = simpleDateFormat.format(date); // 2022年9月11日15小时50分31秒
SimpleDateFormat.format方法 将date日期转化为字符串。相反,若将字符串转化为date,则:
String strDate = "2022-09-11 15:50:31";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 格式一定要对上
Date date = simpleDateFormat.parse(strDate); // 字符串转换为date
十 Calendar类
抽象类,不能被new出来,可以去new它的子类。
Calendar c = Calendar.getInstance(); // 遵循多态机制
int year = c.get(Calendar.TEAR); // 获取年
int month = c.get(Calendar.MONTH) +1 ; // 获取月
int date = c.get(Calendar.DATE); // 获取日
Calendar常用api方法:
Calendar c = Calendar.getInstance(); // 遵循多态机制
c.add(Calendar.YEAR,2); // 加两年
c.add(Calendar.MONTH,-3); // 减三个月
c.add(Calendar.DATE,6); // 加六天
c.set(年,月,日); // 自己设置时间