Java常用类
局部内部类不能添加任何修饰符。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final(jdk1.8之后默认为final)
静态内部类
在静态内部类当中,不能访问非静态变量。
匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或者实现一个接口
优点:减少代码量
缺点:可读性较差
Object类
又叫超类、基类,所有类的直接或间接父类,位于继承树的最顶端
任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类
Object类中所定义的方法,是所有对象都具备的方法
Object类型可以存储任何对象
-
作为参数,可以接受任何对象
-
作为返回值,可返回任何对象
getclass():
返回引用中存储的实际对象类型。
通常用于判断两个引用中 实际的存储对象类型是否一致。
hashCode():
返回该对象的哈希码值。
哈希值根据的地址或者字符串或者数字使用hash算法计算出来的int类型的数值。
一般情况下相同对象返回相同哈希码。
toString():
返回该对象的字符串表示。
可以根据程序需求覆盖该方法。
equals():
默认为比较两个对象地址是否相同。
equals()的重写覆盖:
具体视频演示:12.14 equals方法_哔哩哔哩_bilibili
clone():
作用:克隆类。
克隆类要实现Cloneable接口,但他是一个标记接口,接口中没有任何抽象方法;
首先借助于Object.clone()方法,进行重写,但是需要提高他的访问权限(必须,protected-->public);
返回结果是克隆后的一个新的对象。
public class CloneDemo1 {
public static void main(String[] args) throws CloneNotSupportedException {
Test2 test2 = new Test2("小明",18);
Test2 test1 = (Test2) test2.clone();
System.out.println(test2==test1);
System.out.println(test1.equals(test2));
}
}
class Test2 implements Cloneable{
String name;
int age;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Test2(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Test2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test2 test2 = (Test2) o;
if (age != test2.age) return false;
return name != null ? name.equals(test2.name) : test2.name == null;
}
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
深度克隆
public class CloneDeepDemo1 {
public static void main(String[] args) throws CloneNotSupportedException {
CarDeep cd1 = new CarDeep(11,new EngineDeep(221,"vv8"),new TireDeep(331,"路虎"));
CarDeep cd2 = (CarDeep) cd1.clone();
System.out.println(cd1);
System.out.println(cd2);
//测试
cd1.engine.ename = "cc8";
System.out.println(cd1.engine.ename+"----"+cd2.engine.ename);
cd1.tire.ename = "奔驰";
System.out.println(cd1.tire.ename+"---"+cd2.tire.ename);
}
}
class CarDeep implements Cloneable{
public int cid;
public EngineDeep engine;
public TireDeep tire;
public CarDeep(int cid, EngineDeep engine, TireDeep tire) {
this.cid = cid;
this.engine = engine;
this.tire = tire;
}
public Object clone() throws CloneNotSupportedException {
//深度克隆关键代码
CarDeep cd = (CarDeep) super.clone();
cd.engine = (EngineDeep) this.engine.clone();
cd.tire = (TireDeep) this.tire.clone();
return cd;
}
public String toString() {
return "CarDeep{" +
"cid=" + cid +
", engine=" + engine +
", tire=" + tire +
'}';
}
}
class EngineDeep implements Cloneable{
public int eid;
public String ename;
public EngineDeep(int eid, String ename) {
this.eid = eid;
this.ename = ename;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class TireDeep implements Cloneable{
public int tid;
public String ename;
public TireDeep(int tid, String ename) {
this.tid = tid;
this.ename = ename;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
包装类
包装类默认为null。
装箱
将基本类型转换成引用类型(栈--->堆)
拆箱
将引用类型转换成基本类型(堆--->栈)
Integer缓冲区:在integer自动装箱时,若数据超过127时,则会在堆里开辟新的地址(new integer(i))
String类:
常用方法:
-
lengh():返回字符串长度;
-
charAt(int index):根据下标获取字符;
-
contains(String str):判断是否包含某个字符串。
-
toCharArray():将字符串转换成数组
-
indexOf(String str):查找str首次出现的下标。存在,则返回该下标;不存在,则返回-1。
-
lastIndexOf(String str):查找字符串在当前字符串中最后一次出现的下标索引。
-
trim():去掉字符串前后的空格。
-
toUpperCase():将小写转为大写。
-
toLowerCase():将大写转为小写。
-
endWith(String str):判断字符串是否以str结尾。
-
startWith(String str):判断字符串是否以str开头。
-
replace(char oldchar,char newchar):将旧字符串替换成新字符串。
-
split(String str):根据str做拆分。
注意:
String str="a" +1+2;//输出a+1+2
String str='a'+1+2;//输出4
String str=1+2+"a";//输出3+a
StringBuffer和StringBuilder的使用
StringBuffer:运行效率慢,线程安全
StringBuilder:运行效率快,线程不安全
BigDecimal类:
一般使用代码进行加减乘除时,精度并不高,如:
public class Test{
public static void main(String[] args){
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);
}
}
//输出结果为0.999999998;
//由于double在存储数据之时,会丢失精度,比如:在存储1.0时,将会存储0.9999998。
所以在进行精确计算值之时,需要用到BigDecimal类
在进行除法时,需要注意:
如果除不尽,则进行四舍五入:
BigDecimal big = new BigDecimal("20").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP));
Date类(以被Calender取代,但还是在一些老的项目中使用):
public class DateDemo1 {
public static void main(String[] args) {
//创建Date对象
Date date = new Date();
//今天
System.out.println(date.toString());//输出Mon Aug 08 16:14:34 CST 2022
System.out.println(date.toLocaleString());//输出2022-8-8 16:14:34
System.out.println(date.getTime());//输出1659946474740,这是1970-1-1到今天的毫秒数
//昨天
Date date1 = new Date(date.getTime() - (60 * 60 * 24 * 1000));//创建前一天时间
System.out.println(date1.toLocaleString());//输出2022-8-7 16:16:55
//方法after before
boolean after = date1.after(date);//false,昨天没有在今天之后
boolean before = date1.before(date);//true,昨天在今天之后
System.out.println(after);
System.out.println(before);
//比较compareTO()
int i = date1.compareTo(date);//输出-1,昨天与今天相比,返回-1,否则为1,与自己相比则返回0
System.out.println(i);
//比较是否相等equals()
boolean equals = date1.equals(date);//不相等为false,相等为true
System.out.println(equals);
}
}
Calendar类:
public class DateDemo2 {
public static void main(String[] args) {
//1.创建Calendar对象
Calendar instance = Calendar.getInstance();
System.out.println(instance.getTime().toLocaleString());//输出2022-8-8 16:48:32
System.out.println(instance.getTimeInMillis());//输出1659948512609
//2.过去时间信息
//获取年
int year = instance.get(Calendar.YEAR);
//获取月
int month = instance.get(Calendar.MONTH);
//获取日
int day = instance.get(Calendar.DAY_OF_MONTH);
//获取小时
int hour = instance.get(Calendar.HOUR_OF_DAY);//Hour为12小时,HOUR_OF_DAY为24小时
//获取分钟
int minute = instance.get(Calendar.MINUTE);
//获取秒
int second = instance.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+":"+minute+":"+second);//输出2022年8月8日16:58:37
//修改时间
Calendar instance1 = instance.getInstance();
instance1.set(Calendar.DAY_OF_MONTH,5);
System.out.println(instance1.getTime().toLocaleString());//输出2022-8-5 17:01:20,更改了日
//add()方法修改时间
instance1.add(Calendar.HOUR,-1);//正数位加,负数为减
System.out.println(instance1.getTime().toLocaleString());//输出为2022-8-5 16:06:48
//getActualMaximum()和getActualMinimum()获取月份最大值和最小值
int max = instance1.getActualMaximum(Calendar.DAY_OF_MONTH);
int min = instance1.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max);//输出31
System.out.println(min);//输出1
}
}
SimpleDateFormat类
代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo1 {
public static void main(String[] args) throws Exception{
//使用simpleDateFormat创建格式
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//创建Date对象
Date date = new Date();
//格式化date(把日期转换成字符串)
String format = simpleDateFormat.format(date);
System.out.println(format);//输出2022年08月09日
//解析(把字符串转换成日期)
Date parse = simpleDateFormat.parse("1999年11月07日");
System.out.println(parse);//输出Sun Nov 07 00:00:00 CST 1999
}
}
System类:
代码如下:
public class SystemDemo1 {
public static void main(String[] args) {
//arraycopy()有5个参数,依次为:
//1.src:源数组
//2.srcPos:从哪个位置开始复制
//3.dest:目标数组
//4.destPos:目标数组的位置
//5.length:复制的长度
int[] array1 = {10,30,60,40,2,6,81};
int[] array2 = new int[7];
System.arraycopy(array1,0,array2,0,array1.length);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");//输出10 30 60 40 2 6 81
}
System.out.println();//换行
//currentTimeMillis()
long start = System.currentTimeMillis();
for (int i = -99999999; i < 999999999; i++) {
for (int j = -99999999; j < 999999999 ; j++) {
int result = i+j;
}
}
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start));
//System.gc()
System.out.println("略");
//exit()
System.exit(0);//结束程序
System.out.println("已完成");//这句话不会输出
}
}
局部内部类不能添加任何修饰符。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final(jdk1.8之后默认为final)
静态内部类
在静态内部类当中,不能访问非静态变量。
匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或者实现一个接口
优点:减少代码量
缺点:可读性较差
Object类
又叫超类、基类,所有类的直接或间接父类,位于继承树的最顶端
任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类
Object类中所定义的方法,是所有对象都具备的方法
Object类型可以存储任何对象
-
作为参数,可以接受任何对象
-
作为返回值,可返回任何对象
getclass():
返回引用中存储的实际对象类型。
通常用于判断两个引用中 实际的存储对象类型是否一致。
hashCode():
返回该对象的哈希码值。
哈希值根据的地址或者字符串或者数字使用hash算法计算出来的int类型的数值。
一般情况下相同对象返回相同哈希码。
toString():
返回该对象的字符串表示。
可以根据程序需求覆盖该方法。
equals():
默认为比较两个对象地址是否相同。
clone():
克隆类。
克隆类要实现Cloneable接口,但他是一个标记接口,接口中没有任何抽象方法;
首先借助于Object.clone()方法,进行重写,但是需要提高他的访问权限(必须,protected-->public);
返回结果是克隆后的一个新的对象。
public class CloneDemo1 {
public static void main(String[] args) throws CloneNotSupportedException {
Test2 test2 = new Test2("小明",18);
Test2 test1 = (Test2) test2.clone();
System.out.println(test2==test1);
System.out.println(test1.equals(test2));
}
}
class Test2 implements Cloneable{
String name;
int age;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Test2(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Test2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test2 test2 = (Test2) o;
if (age != test2.age) return false;
return name != null ? name.equals(test2.name) : test2.name == null;
}
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
public class CloneDeepDemo1 {
public static void main(String[] args) throws CloneNotSupportedException {
CarDeep cd1 = new CarDeep(11,new EngineDeep(221,"vv8"),new TireDeep(331,"路虎"));
CarDeep cd2 = (CarDeep) cd1.clone();
System.out.println(cd1);
System.out.println(cd2);
//测试
cd1.engine.ename = "cc8";
System.out.println(cd1.engine.ename+"----"+cd2.engine.ename);
cd1.tire.ename = "奔驰";
System.out.println(cd1.tire.ename+"---"+cd2.tire.ename);
}
}
class CarDeep implements Cloneable{
public int cid;
public EngineDeep engine;
public TireDeep tire;
public CarDeep(int cid, EngineDeep engine, TireDeep tire) {
this.cid = cid;
this.engine = engine;
this.tire = tire;
}
public Object clone() throws CloneNotSupportedException {
//深度克隆关键代码
CarDeep cd = (CarDeep) super.clone();
cd.engine = (EngineDeep) this.engine.clone();
cd.tire = (TireDeep) this.tire.clone();
return cd;
}
public String toString() {
return "CarDeep{" +
"cid=" + cid +
", engine=" + engine +
", tire=" + tire +
'}';
}
}
class EngineDeep implements Cloneable{
public int eid;
public String ename;
public EngineDeep(int eid, String ename) {
this.eid = eid;
this.ename = ename;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class TireDeep implements Cloneable{
public int tid;
public String ename;
public TireDeep(int tid, String ename) {
this.tid = tid;
this.ename = ename;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
包装类
包装类默认为null。
装箱
将基本类型转换成引用类型(栈--->堆)
拆箱
将引用类型转换成基本类型(堆--->栈)
Integer缓冲区:在integer自动装箱时,若数据超过127时,则会在堆里开辟新的地址(new integer(i))
String类:
常用方法:
-
lengh():返回字符串长度;
-
charAt(int index):根据下标获取字符;
-
contains(String str):判断是否包含某个字符串。
-
toCharArray():将字符串转换成数组
-
indexOf(String str):查找str首次出现的下标。存在,则返回该下标;不存在,则返回-1。
-
lastIndexOf(String str):查找字符串在当前字符串中最后一次出现的下标索引。
-
trim():去掉字符串前后的空格。
-
toUpperCase():将小写转为大写。
-
toLowerCase():将大写转为小写。
-
endWith(String str):判断字符串是否以str结尾。
-
startWith(String str):判断字符串是否以str开头。
-
replace(char oldchar,char newchar):将旧字符串替换成新字符串。
-
split(String str):根据str做拆分。
StringBuffer和StringBuilder的使用
StringBuffer:运行效率慢,线程安全
StringBuilder:运行效率快,线程不安全
BigDecimal类:
一般使用代码进行加减乘除时,精度并不高,如:
public class Test{
public static void main(String[] args){
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);
}
}
//输出结果为0.999999998;
//由于double在存储数据之时,会丢失精度,比如:在存储1.0时,将会存储0.9999998。
所以在进行精确计算值之时,需要用到BigDecimal类
在进行除法时,需要注意:
如果除不尽,则进行四舍五入:
BigDecimal big = new BigDecimal("20").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP));
Date类(以被Calender取代,但还是在一些老的项目中使用):
public class DateDemo1 {
public static void main(String[] args) {
//创建Date对象
Date date = new Date();
//今天
System.out.println(date.toString());//输出Mon Aug 08 16:14:34 CST 2022
System.out.println(date.toLocaleString());//输出2022-8-8 16:14:34
System.out.println(date.getTime());//输出1659946474740,这是1970-1-1到今天的毫秒数
//昨天
Date date1 = new Date(date.getTime() - (60 * 60 * 24 * 1000));//创建前一天时间
System.out.println(date1.toLocaleString());//输出2022-8-7 16:16:55
//方法after before
boolean after = date1.after(date);//false,昨天没有在今天之后
boolean before = date1.before(date);//true,昨天在今天之后
System.out.println(after);
System.out.println(before);
//比较compareTO()
int i = date1.compareTo(date);//输出-1,昨天与今天相比,返回-1,否则为1,与自己相比则返回0
System.out.println(i);
//比较是否相等equals()
boolean equals = date1.equals(date);//不相等为false,相等为true
System.out.println(equals);
}
}
Calendar类:
public class DateDemo2 {
public static void main(String[] args) {
//1.创建Calendar对象
Calendar instance = Calendar.getInstance();
System.out.println(instance.getTime().toLocaleString());//输出2022-8-8 16:48:32
System.out.println(instance.getTimeInMillis());//输出1659948512609
//2.过去时间信息
//获取年
int year = instance.get(Calendar.YEAR);
//获取月
int month = instance.get(Calendar.MONTH);
//获取日
int day = instance.get(Calendar.DAY_OF_MONTH);
//获取小时
int hour = instance.get(Calendar.HOUR_OF_DAY);//Hour为12小时,HOUR_OF_DAY为24小时
//获取分钟
int minute = instance.get(Calendar.MINUTE);
//获取秒
int second = instance.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+":"+minute+":"+second);//输出2022年8月8日16:58:37
//修改时间
Calendar instance1 = instance.getInstance();
instance1.set(Calendar.DAY_OF_MONTH,5);
System.out.println(instance1.getTime().toLocaleString());//输出2022-8-5 17:01:20,更改了日
//add()方法修改时间
instance1.add(Calendar.HOUR,-1);//正数位加,负数为减
System.out.println(instance1.getTime().toLocaleString());//输出为2022-8-5 16:06:48
//getActualMaximum()和getActualMinimum()获取月份最大值和最小值
int max = instance1.getActualMaximum(Calendar.DAY_OF_MONTH);
int min = instance1.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max);//输出31
System.out.println(min);//输出1
}
}
SimpleDateFormat类
代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo1 {
public static void main(String[] args) throws Exception{
//使用simpleDateFormat创建格式
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//创建Date对象
Date date = new Date();
//格式化date(把日期转换成字符串)
String format = simpleDateFormat.format(date);
System.out.println(format);//输出2022年08月09日
//解析(把字符串转换成日期)
Date parse = simpleDateFormat.parse("1999年11月07日");
System.out.println(parse);//输出Sun Nov 07 00:00:00 CST 1999
}
}
System类:
代码如下:
public class SystemDemo1 {
public static void main(String[] args) {
//arraycopy()有5个参数,依次为:
//1.src:源数组
//2.srcPos:从哪个位置开始复制
//3.dest:目标数组
//4.destPos:目标数组的位置
//5.length:复制的长度
int[] array1 = {10,30,60,40,2,6,81};
int[] array2 = new int[7];
System.arraycopy(array1,0,array2,0,array1.length);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");//输出10 30 60 40 2 6 81
}
System.out.println();//换行
//currentTimeMillis()
long start = System.currentTimeMillis();
for (int i = -99999999; i < 999999999; i++) {
for (int j = -99999999; j < 999999999 ; j++) {
int result = i+j;
}
}
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start));
//System.gc()
System.out.println("略");
//exit()
System.exit(0);//结束程序
System.out.println("已完成");//这句话不会输出
}
}
注意:
String str="a" +1+2;//输出a+1+2
String str='a'+1+2;//输出4
String str=1+2+"a";//输出3+a
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~