[Java基础]常用类
一.内部类
1.内部类的分类:共四种
i.成员内部类
ii.静态内部类
iii.局部内部类
iv.匿名内部类
2.内部类的使用及注意事项
1.成员内部类:与外部类的实例成员差不多,也是需要通过外部类的实例进行调用的,但唯一不一样的就是它是一个类,一般来说这种类多用来增强外部类的封装性,因为这种内部类可以被声明为private,而且它也算外部类的成员
因此可以调用外部类内的private成员,可以增加外部类封装的安全性及扩展性
2.静态内部类:就是成员内部类用static修饰符修饰,其与外部类内的静态成员是一样的,可以通过外部类的类名.静态内部类名的方式进行访问,基本可以看作一个和外部类同等级的类,但它的加载时间是在被访问的时候才会加载
3.对静态内部类和成员内部类的补充:成员内部类内不可定义静态的成员,但静态内部类内可以,成员内部类可以有构造块,但不能有静态构造快,而静态内部类则都可以有
4.局部内部类:是一个定义在外部类的方法成员内的类,作用域就在这个方法的内部,到了外部是无法访问这个类的,所以所有在这个类内被使用的外部成员都必须是被final修饰的
5.匿名内部类:一个没有类命的局部内部类,具体看接口篇
3.语法示例:
class Outside{ private String name; class Inside{ Inside(){} { } public void show() { name = "5"; } } static class StaticInside{ {} static String name; public static void show() { } } public void show(int a) { class FunctionClass{ public void show() { System.out.println(a); } } new FunctionClass().show(); } }
二.Object类
1.Object是所有类的超类,因此可以用来传参数,也可以用来当参数的返回值
2.内部的方法有:
i.toString()
ii.clone()
iii.equals()
iv.hashcode()
v.finalize()
3.一些内部方法的理解:
i.toString()返回值是该实例引用的地址
ii.clone()是用来克隆值,基础数据类型是直接克隆值,而对引用数据类型的克隆是开辟一个新的内存空间存放这个实例的数据,一般来讲克隆分为浅拷贝和深拷贝,Object类内对clone(0方法的定义是使用了native关键字调用了底层c++之类的函数对内存直接操作的,而且Object类内对这个方法的注释里建议了子类最好都对这个方法进行重写,至于为什么笔者猜测是应该减少浅拷贝带来的编程差异,因为要是想进行彻底的深度拷贝需要对这个类里所有的引用类型的成员都进行一遍拷贝,不然表面上两个实例是指向了两个不同的空间,但这个内存空间里别的引用类型变量指向的都是同一个实例(如果没有对clone()方法进行重写的话)
iii.equals() Object类对这个方法的定义就是比较两个操作数的地址,所以如果是需要比较引用数据的值的话都要对equals进行重写如String 类对equals的重写,首先是比地址,如果不同还会比较一下两个操作数的value
iv.hashcode() 这个方法的返回值是对这个实例的内存地址进行hash算法后的值,基本上就是内存地址的表现
v.finalize() 这个方法是用来进行资源释放的,但Java并不推荐使用,因为Java的内存管理者GC是可以自动管理内存的,可以帮助进行垃圾的回收,而如果某个类对这个方法进行了重写,jvm在对这个类进行垃圾回收的时候看到了对象有这个方法就会把这个对象放进FinalizeThread内进行处理,如果这个对象不对这个finalize()方法进行调用这个对象是不会进行内存清理的,在它调用了这个方法后FinalizeThread线程才会把它从ReferenceQueue队列中移除,这个时候jvm才会把它释放,但问题是如果这种对象一多,线程处理不过来,jvm又不管,很容易就造成内存溢出的问题,所以最好还是不用这个方法,直接让JVM来帮助我们进行内存管理
三.String,StringBuilder,StringBuffer
1.String
i.这是Java中一个十分特殊的引用类型,从java文件的编译到运行都离不开这个类型的数据,而且在多线程的应用和hashcode()等方面都有应用,所以出于安全性和实用性的目的,Java为此把这个类用final进行了修饰,一旦这个类型的变量被定义了就不能再被更改
ii.这个类型的常用方法:
获取:int length()返回值为该实例的字符串长度
char charAt()返回值为该参数下标内储存的char数据
int indexOf() 返回值为该参数第一次出现的位置参数可以是char 也可以是String,还可以是两个参数,第一个和前面一样,第二个为下标,返回值是第一个参数在第二个参数下标后第一次出现的下标位置
int lastIndexOf() 返回值为该参数最后一次出现的位置
判断:contains() 判断是否该字符串是否包含参数
isEmpty() 判断该字符串是否为空
startWith()//endWith() 判断是否以参数字符串开头或结尾
equalsIgnoreCase() 判断忽略字符串的大小写形式是否相等
转换:valueOf()
toCharArray()
替换:replayce() 将字符串里满足第一个参数的替换成第二个参数
切割:split() 将字符串根据参数分割成字符串数组
修剪:trim() 去除字符串前后的空格
子串:substring() 返回一个字符串数值是从第一个参数开始到最后或者第二个参数如果有的话
转换大小写:toUpperCase()
toLowerCase()
2.StringBuffer/StringBuilder //这两个是可变的String类型,也就是说使用里面的方法返回后就是对该实例进行改变,返回值也是该实例,而String操作完后都是返回一个新的String实例
i.StringBuffer出现的比较早,是一个线程安全的数据类型,但后来发现并没有多少对一个字符串堆使用多线程的情景,所以StringBuilder诞生了,它比StringBuffer更快,但线程不安全
ii.这两个数据类型只是线程安全问题和运行效率问题有差别,方法都是差不多的,所以只拿出一个来介绍,因为StringBuilder用到的情况更多,所以下方列举了StringBuilder的常用方法
iii.StringBuilder:
添加: append()
insert(index,数据)
删除:delete(start,end)
deleteCharAt(index)
获取:charAt(index)
indexOf(char)
修改:replace(start,end,String)
反转:reverse()
获取缓冲区数据:getChars(int srcBegin,int srcEnd,char[] ch,int chBegin)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署