常用类常用类概述:内部类Object类包装类数学类时间类字符串StringBuilder和StringBufferDecimalFormat一、内部类 概念:在一个类内部再定义一个完整的类。 一般情况下类与类之间是相互独立的,内部类的意思就是打破这种独立思想,让一个类成为另一个类的内部信息,和成员变量、成员方法同等级别。内部类的好处: 把一个类写在外面和写在里面最终达到的结果都一样,那我们为什么还要使用内部类,岂不是多此一举吗?采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的结构更加合理!如果类很多且都暴露在外面,那么类与类之间的调用就会十分繁琐!内部类的分类:1。成员内部类(非静态内部类) 【参考代码】packageNeiBuLei;publicclassOuterClass{成员变量privateStringOuterName;成员方法publicvoiddisplay(){System。out。println(这是外部类方法!);System。out。println(OuterName);}内部类publicclassInnerClass{成员变量privateStringInnerNme;构造方法publicInnerClass(){InnerNmeInnerClass;}成员方法publicvoiddisplay(){System。out。println(这是内部类方法!);System。out。println(InnerNme);}}主方法publicstaticvoidmain(String〔〕args){OuterClassouterClassnewOuterClass();outerClass。display();这是外部类方法!null这个类是内部类,已经不是独立的类了,因此不能像外部类一样直接创建!InnerClassinnerClassnewInnerClass();行不通OuterClass。InnerClassinnerClassouterClass。newInnerClass();同成员方法变量只是加了个前缀innerClass。display();这是内部类方法!}} 输出结果: 这是外部类方法! null 这是内部类方法! InnerClass总结:成员内部类(非静态内部类)的使用就是将内部类作为外部类的的一个成员变量成员方法来使用,所以必须依赖于外部类的对象才能调用,用法和成员变量成员方法一致!2。局部内部类 局部内部类:基本的内部类还可以在一个方法体中定义。packageNeiBuLei;publicclassOuterClass{成员变量privateStringOuterName;成员方法publicvoiddisplay(){classInnerClass{publicvoidprint(){System。out。println(这是一个局部内部类方法!);}}InnerClassinnerClassnewInnerClass();innerClass。print();}主方法publicstaticvoidmain(String〔〕args){OuterClassouterClassnewOuterClass();outerClass。display();}}3。静态内部类 静态内部类的构造不需要依赖于外部类对象,类中的静态组件都不需要依赖于任何对象,可以直接通过类本身进行构造。packageNeiBuLei;publicclassOuterClass{成员变量privateStringOuterName;成员方法publicvoiddisplay(){System。out。println(这是外部类方法!);System。out。println(OuterName);}静态内部类publicstaticclassInnerClass{privateStringInnerName;publicInnerClass(){InnerNameInnerClass;}成员方法publicvoiddisplay(){System。out。println(这是静态内部类方法!);System。out。println(InnerName);}}主方法publicstaticvoidmain(String〔〕args){OuterClassouterClassnewOuterClass();outerClass。display();静态内部类的构造不依赖与外部类,可以直接通过类本身进行构造!InnerClassinnerClassnewInnerClass();innerClass。display();}} 输出结果: 这是外部类方法! null 这是静态内部类方法! InnerClass4。匿名内部类 匿名内部类:没有名字的内部类。 匿名内部类主要应用与接口的实现! 接口:packageNeiBuLei;publicinterfaceMyInterface{publicvoidtest();} 实现类:packageNeiBuLei;publicclassMyImplementimplementsMyInterface{Overridepublicvoidtest(){System。out。println(test);}} 匿名内部类的使用:packageNeiBuLei;publicclassTest{publicstaticvoidmain(String〔〕args){实现类MyInterfacemyInterfacenewMyImplement();myInterface。test();匿名内部类MyInterfacemyInterface1newMyInterface(){接口是不能new的,这里new的是接口的实现类(和实现类是一样的(同一个东西),没有实例而已)Overridepublicvoidtest(){System。out。println(test);}};myInterface。test();最终两种实现方式的结果都是一样的!}}匿名内部类的好处: 我们定义接口之后,它的实现类不需要去单独创建一个文件去写它的实现,我们可以把这个实现类的操作写到我们调用的地方就可以了!写起来更加简洁、方便。匿名内部类的缺点: 耦合度太高了!二、Object类 jdk中文在线文档:Java8中文版在线API中文手册码工具(matools。com) Object类常用方法:1。equals方法与equals的对比【面试题】jdk查看原码 是一个比较运算符:既可以判断基本类型,又可以判断引用类型:如果判断的是基本类型,判断的是值是否相等。:如果判断的是基本类型,判断的是值是否相等intx110;intx210;doublex310。0;System。out。println(x1x2);trueSystem。out。println(x1x3);true:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象packageEquals;publicclassTest01{publicstaticvoidmain(String〔〕args){:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象AanewA();Aba;Acb;System。out。println(ac);?trueSystem。out。println(bc);trueBobja;System。out。println(objc);true}}classB{}classAextendsB{} equals方法是Object类中的方法,只能判断引用类型。 idea查看Jdk原码:鼠标光标放在要查看的方法上,直接输入ctrlb 查看某个类所有方法:ctrlF12默认判断的是地址是否相等,子类(Object类是所有类的父类)往往重写该方法,用于判断内容是否相等。Object类equals()方法原码默认判断地址是否一样publicbooleanequals(Objectobj){return(thisobj);}子类往往重写该方法,用于判断内容是否相等String类中的equals()方法原码(重写了父类equals()方法)publicbooleanequals(ObjectanObject){if(thisanObject){如果是同一个对象(地址相同)returntrue;返回true}if(anObjectinstanceofString){判断类型StringanotherString(String)anObject;向下转型intnvalue。length;if(nanotherString。value。length){如果长度相同charv1〔〕value;charv2〔〕anotherString。value;inti0;while(n!0){比较每一个字符if(v1〔i〕!v2〔i〕)returnfalse;i;}returntrue;如果两个字符串每一个字符都相同,则返回true}}returnfalse;} 在看个例子 【小练习】 写出输出结果:packageEquals;publicclassEqualsTest01{publicstaticvoidmain(String〔〕args){Personp1newPerson();p1。nametom;Personp2newPerson();p2。nametom;System。out。println(p1p2);引用类型判断是否为同一个对象(地址)System。out。println(p1。name。equals(p2。name));p。name是String类型,重写了equals()方法判断内容是否一样System。out。println(p1。equals(p2));p1,p2属于Person类,该类并没有重写equals()方法(继承父类equals()方法,即判断地址)Strings1newString(abc);Strings2newString(abc);System。out。println(s1。equals(s2));System。out。println(s1s2);}}classPerson{publicStringname;} 输出结果: false true false true false2。hashCode方法 小结:(可以当作地址来看但它本质上不是地址)提高具有哈希结构的容器的效率两个引用,如果指向的是同一个对象,则哈希值肯定一样两个引用,如果指向的是不同对象,则哈希值是不一样的哈希值主要根据地址号来!不能将哈希值完全等价于地址在后面的集合中hashCode如果需要的话,也会重写packagehashCode;publicclassHashCode{publicstaticvoidmain(String〔〕args){AAaanewAA();AAaa2newAA();AAaa3aa;System。out。println(aa。hashCode()aa。hashCode());System。out。println(aa2。hashCode()aa2。hashCode());System。out。println(aa3。hashCode()aa3。hashCode());}}classAA{}aa。hashCode()460141958aa2。hashCode()1163157884aa3。hashCode()4601419583。toString方法 基本介绍: 默认返回:全类名哈希值的十六进制ObjecttoString()原码(1)getClass()。getName()类的全类名(包名类名)(2)Integer。toHexString(hashCode())将hashCode的值转成16进制字符串publicStringtoString(){returngetClass()。getName()Integer。toHexString(hashCode());} 子类往往重写toString方法,用于返回对象的属性信息(快捷键:altinsert),当然我们也可以自己定制。 当我们输出一个对象时,toString()方法会被默认调用 4。finzlize方法 finzlize方法:当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。当对象被回收时,系统自动调用该对象的finzlize方法。子类可以重写该方法,做一些释放资源的操作什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会时候垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finzlize方法。 垃圾回收机制的调用,是由系统来决定(即有自己的GC算法),也可以通过System。gc()主动触发垃圾回收机制。 注:在实际开发中,几乎不会用finzlize方法,更多的是为了应付面试三、包装类1。基本数据类型以及对应的包装类: byteByte shortShort intInteger longLong floatFloat doubleDouble charCharacter booleanBoolean 这些类都在java。lang包2。包装类的意义:让基本数据类型有面向对象的特征封装了字符串转化成基本数据类型的方法(重点)3。包装类常用方法:Integer。parseInt()Long。paseLong()Double。parseDouble() 【参考代码】publicclassTest{publicstaticvoidmain(String〔〕args){IntegerinewInteger(10);创建包装类对象Integerii10;自动打包System。out。println(i10);在使用上,int和Integer其实没有区别,可以互相使用System。out。println(ii10);intjii;自动解包System。out。println(j100);Stringa12;Stringb34;System。out。println(ab);1234转型:字符串转成int的唯一方案intcInteger。parseInt(a);intdInteger。parseInt(b);System。out。println(cd);46字符串转成double类型Stringe1。25;doublefDouble。parseDouble(e);System。out。println(f6);7。5转成long类型longlLong。parseLong(1234567);System。out。println(l);}}四、数学类 数学类的方法都是静态方法,可以直接引用Math。方法();常用数学类方法:abs():获取绝对值max():求最大值min():求最小值pow():求次幂round():四舍五入sqrt():求平方根五、时间类Java常用时间类:Date日期类Calendar日历类SimpleDateFormat格式化时间类Date和Calendar类在java。util包中SimpleDateFormat类在java。text包1。Date日期 【1】newDate()可以获取到系统时间 【2】getTime()能获取到时间的long形式,可以用来计算时间差 getTime()获取计算机底层存储的数字,返回一个数字用来表示时间,这个数字的类型long,单位为毫秒。 【参考代码】importjava。util。Date;publicclassTest{publicstaticvoidmain(String〔〕args){DatednewDate();System。out。println(d);系统时间get。。。()获取年月日。。。。。System。out。println(d。getYear()1900);从1900年开始算的System。out。println(d。getMonth()1);月份从0开始计算System。out。println(d。getDate());天数System。out。println(d。getHours());小时getTime()获取到时间的毫秒形式返回的是longSystem。out。println(d。getTime());}}2。Calendar日历 【1】get()获取到时间的某一部分 【2】set()设置时间计算时间:系统已经帮我们设置好了,不用担心二月有多少天等问题,计算时间十分方便 注:Calendar日历类是抽象类,因此不可以去new对象。虽然抽象类不能创建对象,但是jdk官方提供了一个实例对象的操作: CalendarrightNowCalendar。getInstance(); 我们通过这条代码就是直接造了一个Calender的对象 【参考代码】:get()获取到时间的某一部分:packagedate;importjava。util。Calendar;publicclassTestCalendar{publicstaticvoidmain(String〔〕args){CalendarcalCalendar。getInstance();System。out。println(cal);假设当天:2021810cal。set(Calendar。DATE,cal。get(Calendar。DATE)31);计算时间(这里用天数计算的)获取Calendar创建的对象里的所有内容System。out。println(cal。get(Calendar。YEAR));2021年System。out。println(cal。get(Calendar。MONTH)1);月份:从0开始的结果:为10月System。out。println(cal。get(Calendar。DATE));日System。out。println(cal。get(Calendar。HOUROFDAY));小时System。out。println(cal。get(Calendar。MINUTE));System。out。println(cal。get(Calendar。SECOND));}} 【参考代码】:set()设置时间计算时间: 注:cal。setTime(d);把Date转化成Calendarpackagedate;importjava。util。Calendar;importjava。util。Date;publicclassTestCalendar{publicstaticvoidmain(String〔〕args){DatednewDate();CalendarcalCalendar。getInstance();cal。setTime(d);把Date转化成CalendarSystem。out。println(cal);System。out。println(cal。get(Calendar。YEAR));年System。out。println(cal。get(Calendar。MONTH)1);月份:从0开始的System。out。println(cal。get(Calendar。DATE));日}}3。SimpleDateFormat格式化时间 Date,Calendar通过引用也可以进行时间的格式化,但比较繁琐,而SimpleDateFormat类是专门帮我们格式化时间的工具类,它在java。text包中。 【时间格式】:yyyyMMddHH:mm:ss SimpleDateFormat类有两大常用方法: 【1】format(Date): format(Date)帮我们把时间转成字符串,字符串的格式为SimpleDateFormat类定义对象时设置的时间格式 【参考代码】packageSimple;importjava。text。SimpleDateFormat;importjava。util。Date;importjava。util。logging。SimpleFormatter;publicclassTest{publicstaticvoidmain(String〔〕args){DatednewDate();System。out。println(d);ThuAug1208:40:08CST2021不美观设置格式化时间的模式,我们常用yyyyMMddHH:mm:ss这个模式SimpleDateFormatsdfnewSimpleDateFormat(yyyyMMddHH:mm:ss);时间格式Stringssdf。format(d);格式化时间System。out。println(s);2021081208:45:09}} 【2】parse(String): parse(String)帮我们把字符串转化成时间 【参考代码】packageSimple;importjava。text。ParseException;importjava。text。SimpleDateFormat;importjava。util。Date;importjava。util。Scanner;publicclassTest2{publicstaticvoidmain(String〔〕args)throwsParseException{ScannerscnewScanner(System。in);System。out。println(请输入一个时间(yyyyMMddHH:mm:ss):);Stringssc。nextLine();SimpleDateFormatsdfnewSimpleDateFormat(yyyyMMddHH:mm:ss);Datedsdf。parse(s);把字符串转成时间System。out。println(d);请输入一个时间(yyyyMMddHH:mm:ss):2021081212:25:21ThuAug1212:25:21CST2021}} 注:由于用户输入的字符串不一定是我们要求的格式,可能是任何东西,想把它们转成时间是不可能的,你不可能把一个人转成时间对吧,因此存在着很大的风险未处理(异常:java。text。ParseException),为此我们需要处理异常。4。计算时间差 计算思路:格式化时间先将字符串转化成long类型时间计算毫秒级别时间差,取绝对值毫秒级别时间差转成秒级别秒级别时间差转成分钟级别分钟级别时间差转化显示成xx小时xx分钟 【参考代码】packageSimple;importjava。text。ParseException;importjava。text。SimpleDateFormat;importjava。util。Date;publicclassTestDiff{publicstaticvoidmain(String〔〕args)throwsParseException{Strings12021081212:00:00;开始时间Strings22021081214:35:00;结束时间格式化时间SimpleDateFormatsdfnewSimpleDateFormat(YYYYMMddHH:mm:ss);将字符串转成时间形式Dated1sdf。parse(s1);Dated2sdf。parse(s2);计算时间差:先要获取时间毫秒形式(long类型)再做差longlong1d1。getTime();longlong2d2。getTime();longdiffTimeMath。abs(long1long2);秒级别时间差longdiffSecdiffTime1000;分级别时间差longdiffMindiffSec60;显示xx小时xx分钟longdisplayHoursdiffMin60;小时longdisplayMindiffMin60;分钟System。out。println(您学习的时长为:displayHours小时displayMin分钟);}}六、String类字符串类常用方法方法汇总: 修饰符和返回值的类型 方法名 解释 char charAt() 获取某个位置的字符 String concat() 字符串的拼接。一般字符串拼接直接相加就好了 boolean contains() 判断原字符串是否含有xxx字符串,常用于子串的判断 boolean endsWith() 判断原字符串是否以xxx字符串结尾 boolean startsWith() 判断原字符串是否以xxx字符串开头 boolean equals() 判断两边字符串内容是否相同;判断地址是否相同 boolean equalsIgnoreCase() 忽略大小写判断两边字符串的内容是否一样 int indexOf() 计算给出字符串第一个出现的位置 int LastindexOf() 计算给出字符串最后一个出现的位置 int length() 计算字符串的长度 String replace() 字符串内容的替换 String〔〕 split() 字符串切割,最终结果是一个字符串数组 String substring() 字符串截取,左闭右开:〔) String trim() 去掉字符串左右两边的空格,中间的不行 staticString valueOf() 官方:基本数据类型转为字符串操作;直接:变量注:字符串是一个不可变的类型(final类),几乎所有的字符串操作都会返回一个新字符串而不是在原有基础上进行修改。 【示例代码】publicclassTest{publicstaticvoidmain(String〔〕args){Strings我的名字叫李华;s。concat(hhh);在字符串s上拼接,拼接hhhSystem。out。println(s);我的名字叫李华字符串是不可变的数据类型几乎所有的字符串操作都会返回一个新字符串Strings1s。concat(hhh);在字符串s上拼接,拼接hhhSystem。out。println(s1);我的名字叫李华hhhStringstr1李华喜欢看罗老师的视频;str1。replace(李华,张三);System。out。println(str3);李华喜欢看罗老师的视频并没有替换字符串是不变的str1还是str1Stringstr2str1。replace(李华,张三);几乎所有的字符串操作都会返回一个新字符串新串要用新变量接System。out。println(str2);张三喜欢看罗老师的视频}}packageString;importjava。util。Scanner;publicclassTest{publicstaticvoidmain(String〔〕args){Strings我的名字叫李华;System。out。println(s。charAt(0));获取第0个位置的字符s。concat(hhh);System。out。println(s);我的名字叫李华字符串是不可变的数据类型几乎所有的字符串操作都会返回一个新字符串Strings1s。concat(hhh);在字符串s上拼接,拼接hhhSystem。out。println(s1);我的名字叫李华hhhSystem。out。println(s。contains(李华));trueSystem。out。println(s。contains(牛津));falseSystem。out。println(邀请李华来参加英语沙龙活动。endsWith(活动));true判断是否以xxx为结尾System。out。println(邀请李华来参加英语沙龙活动。startsWith(李华));false判断是否以xxx开头equals字符串内容是否相同接受邀请参加活动的李华到现场后要输入验证码StringyanZhengMaAAkm;ScannerscnewScanner(System。in);System。out。println(请输入验证码(yanZhengMa));StringuserInputsc。nextLine();if(yanZhengMa。equalsIgnoreCase(aakm)){忽略大小写判断两边的内容是否一样System。out。println(欢迎参加英语沙龙活动!);}else{System。out。println(您未受到邀请,请现场报名!);}Stringstr李华玩得很开心!;System。out。println(str。indexOf(开心));5计算给出字符串第一个出现的位置Stringstr2李华成绩很好;System。out。println(str2。length());6计算字符串的长度Stringstr3李华喜欢看罗老师的视频;str3。replace(李华,张三);System。out。println(str3);李华喜欢看罗老师的视频并没有替换字符串是不变的str3还是str3Stringstr4str3。replace(李华,张三);几乎所有的字符串操作都会返回一个新字符串新串要用新变量接System。out。println(str4);张三喜欢看罗老师的视频Stringstr5哈哈呵呵嘻嘻噢no;String〔〕ssstr5。split();切割System。out。println(ss〔0〕);哈哈System。out。println(ss〔1〕);哈哈System。out。println(ss〔2〕);嘻嘻System。out。println(ss〔3〕);噢noStringstr6今天天气不错;System。out。println(str6。substring(2,4));天气字符串截取〔)左闭右开,右边取不到Stringstr7哈哈;System。out。println(str7。trim());去掉左右两边的空格inti10;System。out。println(String。valueOf(i));基本数据类型转为字符串System。out。println(i);野路子}}七、StringBuilder和StringBufferString类的缺点: String是一个不可变的数据类型,每每拼接都会产生一个新的字符串,那么内存迟早会被这些拼接的字符串塞满。String类和StringBuilder和StringBuffer类的区别: StringBuilder和StringBuffer:可变的字符串,不产生新对象,比较省内存,当进行大量的字符串拼接时建议使用StringBuffer和StringBuilder,但它们两个一些方法的实现几乎跟String一样。StringBuffer和StringBuilder类: 【相似点】 两者用法一模一样,可以认为是一个类 【区别】StringBuffer线程安全,StringBuilder非线程安全。StringBuilder相比于StringBuffer有速度优势,多数情况下建议使用StringBuilder类,但当被要求线程安全时必须使用StringBuilder类 字符串拼接方法:append()方法 StringBuffer和StringBuilder转成String类:StringBuildersbnewStringBuilder(猫喜欢吃鱼);Stringssb。toString(); 【参考代码】packageString;publicclassTestStringBuilder{publicstaticvoidmain(String〔〕args){StringBuildersbnewStringBuilder();一个空的字符串StringBuildersb2newStringBuilder(猫喜欢吃鱼);System。out。println(sb2);猫喜欢吃鱼sb2。append(,狗也喜欢吃鱼);System。out。println(sb2);追加猫喜欢吃鱼,狗也喜欢吃鱼sb2。insert(1,哈哈哈);System。out。println(sb2);猫哈哈哈喜欢吃鱼,狗也喜欢吃鱼上述的操作huanc把StringBuilder转化成StringStringssb2。toString();System。out。println(s);猫哈哈哈喜欢吃鱼,狗也喜欢吃鱼上述操作都可以将StringBuilder换成StringBuffer,结果一样}}八、DecimalFormat DecimalFormat:对小数进行格式化,保留几位小数。与格式化时间联想记。。表示小数点0和表示数位,保留几位就几个0或者 【参考代码】importjava。text。DecimalFormat;importjava。util。Scanner;publicclassTest{publicstaticvoidmain(String〔〕args){doubled103。0;System。out。println(d);3。3333333333333335。表示小数点0和表示数字保留两位小数格式DecimalFormatdfnewDecimalFormat(。00);或者。Stringsdf。format(d);把d转成上面设置的格式System。out。println(s);3。33}}总结 转眼这个学期又快要结束了,在繁忙的课业之余,经过了好久好久,终于将学习的各个小知识点整合起来啦!希望对在前进道路上学习的你有些许帮助! 注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦!