JDK常用接口&String类

一.Object类

1.1什么是Object类

在java中万物之母Object类
全名称:包名.类名 java.lang.Object

1.2Object使用方法

1.Object类是java中所有类的默认父类,无需使用extends来定义。
class声明的类都有一个父类,Object类
因为Object类是所有类的父类,使用Object引用来接受所有的类型,参数最高统一化。
Object obj1 = new Person();
Object obj2 = new String();
Object obj3 = new Dog();
java中所有类型都可以发生向上转型变为Object类型
void fun(Object obj)
obj可以接受任意类型的对象
在这里插入图片描述

2.Object类中的所有方法子类全部都继承下来了
之所以System.out.println(任意引用类型)=>默认调用该类型的toString
因为Object类存在toString();
在这里插入图片描述
如果想输出当前类中的属性值,我们就“覆写”toString方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.java中引用数据类型之间的相等比较使用equals方法,不能使用==(比较的是地址)
在这里插入图片描述
Object类默认的equals方法
在这里插入图片描述
this就是指向stu2,obj指向stu3
在这里插入图片描述
此时要比较两个Student类的对象的属性值是否相等,就需要覆写equals方法
在这里插入图片描述
在这里插入图片描述
name属性是String类型,记住JDK的所有类型属性比较都使用equals方法(都覆写过了)
在这里插入图片描述
4.Object不仅是所有类的父类
JDK对Object类做了拓展。
Object类可以接受所有引用数据类型的对象(接口,数组,类)
因此在java中,若一个方法参数或者返回值是Object类型,说明该参数或者返回值可以是任意引用数据类型。
在这里插入图片描述
因为Object类是参数最高统一化,此时除了8大基本类型没法用Object类来接收以外,所有类型都能使用Object类来接收,包装类应运而生。

二.JDK常用接口

2.1接口的使用

接口优先原则,当一个场景即可以使用抽象类,也可以使用接口定义时,优先考虑使用接口(更灵活)

2.2JDK内置的常用接口

1.Java.lang.Comparable:表示当一个类实现了Comparable接口,表示该类具备了可比较的能力
由于Person这个类,是自定义类型,对于编译器来说不像整型这样大小关系一目了然,到底哪个Person对象大,哪个Person对象小,编译器无从得知了,要让Person这个类具备可比较的能力,也就是让JDK知道Person对象谁大谁小,就需要让Person类实现Comparable接口覆写抽象方法ComparableTo
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
int 有三个分支
a. >0 表示当前对象this > 传入对象o
b. =0 表示当前对象this = 传入对象o
c. <0 表示当前对象this < 传入对象o
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.JDK另一个比较重要的接口-克隆接口
java.lang.Cloneable
克隆:
原对象和新产生的对象确实是两个独立的对象,新产生的对象是原对象拷贝而来的,属性值和原对象完全一致。
要让一个类具备可以复制的能力,实现Cloneable接口,覆写克隆方法

类似Cloneable接口,把这种接口称之为标记接口,这个接口本身内部没有任何抽象方法,只有打上这个标记的子类才具备克隆的能力。
在这里插入图片描述
在这里插入图片描述
现实生过中的标记:猪场养猪,猪长大后可食用之前都会有检验人员检查一下猪的身体状态,若各项指标合格,在身上打上一个合格标记才能出厂。
JVM在运行的时候,会检查所有实现了Cloneable接口的子类,赋予其克隆的能力。clone方法时Object提供的方法。
在这里插入图片描述
在这里插入图片描述
调用克隆方法产生的对象,不会调用构造方法。
在这里插入图片描述

浅拷贝:最外层对象确实是由原对象产生的新对象,属性值与原对象保持一致,原对象与新对象的内容若包含其他类的引用,这些引用指向的对象是相同的,并没有产生新对象。
深拷贝:最外层对象确实是由原对象产生的新对象,属性值与原对象保持一致,原对象与新对象的内容若包含其他类的引用,这些引用指向的对象也是新对象。

三.String类

3.1JDK中String类的声明

在这里插入图片描述
为何String类被final修饰:
被final修饰的类无法被继承,String类不存在子类,这样的话就可以保证所有使用JDK的人,大家用的String类仅此一个,大家都相同。
继承和方法覆写能带来灵活性的同时,也会带来很多子类行为不一致导致的问题。
什么时候会用到final修饰类:你的这个类不希望有别的版本,到此为止。所有使用者用的这个类完全相同,没有别的实现。

3.2创建字符串的四种方式

方式一:直接赋值
String str = “hello world”;
方式二:通过构造方法产生对象
String str2 = new String(“hello world”);
方式三:通过字符数组产生对象
char[] data = new char[]{‘a’,‘b’,‘c’};
String str = new String(data);
方式四:通过String类的静态方法valueOf(任意数据类型)=>转为字符串
String str = String.valueOf(10);

在这里插入图片描述

3.3字面量

字面量:直接写出来的数值就称之为字面量
10-> int字面量
10.1->double字面量
true->boolean字面量
“abc”->String字面量->就是一个字符串的对象。

String引用数据类型。
String str = “hello world”;
“hello world” 叫做字符串的字面量,也是字符串的对象。
hello也是字符串的字面量,是一个新的字符串对象,str1实际上指向了新的字符串对象“hello”,“str”仍旧指向原字符串对象“hello world”
在这里插入图片描述

3.4字符串比较相等

所有字符串比较相等
所有引用数据类型在比较相等时,使用equals方法比较,JDK常用类,都已经覆写了equals方法,大家直接使用即可比如String,包装类。引用数据类型使用==比较的仍然是数值(地址是否相等)

并不是内容相等,只是说明str1和str2指向了相同的地址空间。
在这里插入图片描述
在这里插入图片描述
若使用==报错
在这里插入图片描述
要使用equals方法在这里插入图片描述
只要内容不同,就false
equals方法是区分大小写的比较
在这里插入图片描述
不区分大小写的比较在这里插入图片描述
牵扯到用户输入就一定要做判空处理
在这里插入图片描述
因为我们要比较的特定内容本身就是字符串的子面量,一定不是空对象,把要比较的内容放在equals方法的前面,就可以方便地处理空指针的问题。
在这里插入图片描述

3.5关于字符串的常量池

这三个引用指向了相同的内存
当使用直接赋值法产生字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象,加入字符串的常量池中。
当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内容在常量池中已经存在了,则此时不再新建字符串对象,而是复用已有对象。
在这里插入图片描述
这三个引用指向了三个不同的字符串对象
有new就有新空间,这三行代码产生了四个字符串对象,其中一个在常量池中,其余三个在堆中
在这里插入图片描述
手工入池方法:String类提供的intern方法:
调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中。
a.若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中的String对象
b.若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址;
在这里插入图片描述
str1返回了常量池中的hello
在这里插入图片描述
若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址
在这里插入图片描述

3.6字符串的不可变性

所谓的字符不变性指的是字符串内容不能变,而不是字符串引用不能变。
这里的不可变,指的"hello"“world”“helloworld”“!!!”"helloworld!!!"这些对象一旦声明后就无法修改其内容。
在这里插入图片描述
为何字符串的对象无法修改内容而其他类的对象能修改内容。
字符串其实就是一个字符数组->char[],字符串保存的值实际上在数组中保存。
String外部就无法访问这个Value数组,String并没有提供关于value属性的getter和setter,对于String类的外部而言,value数组完全使用,因此字符串对象的内容无法修改
在这里插入图片描述
如何修改字符串的内容
1.在运行时通过反射破坏value数组的封装。
2.更换使用StringBuilder或者StringBuffer类->已经不是一个类型了。
若需要频繁进行字符串的拼接,使用StringBuilder类的append方法
StringBuilder类可以修改对象的内容。在这里插入图片描述
StringBuffer和StringBuilder使用方法完全一样
StringBuffer:线程安全,性能较差。
关于StringBuilder类的具体使用:
StringBuilder类和String类是两个独立的类,StringBuilder就是为了解决字符串拼接问题产生的,因为String的对象无法修改内容,为了方便字符串的拼接操作,产生了StringBuilder类,StringBuilder类的对象是可以修改内容的。
StringBuilder->String调用toString方法
在这里插入图片描述
String->StringBuilder使用StringBuilder的构造方法或者使用append方法
在这里插入图片描述
在这里插入图片描述
因为StringBuilder类可以修改内容,因此具备一些String类不具备的修改内容的功能,除了拼接append方法外
a.字符串的翻转操作,sb提供的reverse();
在这里插入图片描述
b.删除指定范围的数据,sb提供的delete();在这里插入图片描述
c.插入操作
insert(int start,各种数据类型):从索引为start的位置插入一个新的数据在这里插入图片描述
经典面试题:请解释String,StringBuilder,StringBuffer的区别
1.String的对象无法修改,俩sb的对象内容可以修改。
2.StringBuffer是线程安全的操作,性能较差,StringBuilder是线程不安全,性能较高。

compareTo:比较两个字符串大小,也实现了Comparable接口,覆写compareTo方法。
字符串的compareTo方法按照字符串内部的每个数组进行ASCII的比较。
在这里插入图片描述
按照字典序排列字符串:就是按照字符串内部的字符的ASCII码大小排序
A就要出现在a之前:97-65 = 32

3.7字符和字符串的相互转换

字符串内部实际上就是用字符数组来存储的。
char->String通过字符串的构造方法
1.
在这里插入图片描述
2.将字符数组的部分内容转为字符串对象
offset表示字符数组开始的索引,count表示字符个数
在这里插入图片描述
String->char
1.取出字符串中指定索引的字符
public.char.charAT(int.index)
在这里插入图片描述
2.将字符串中的内容转为字符数组
pubilc.char[].toCharArray()
此时产生了一个新的字符数组,姜子夫串的内容复制过去。
String的对象不可变,内容改不了
在这里插入图片描述
如何判断一个字符串的对象是由纯数字组成的?
‘123’=>true(纯数字字符串)
‘123a’=>false(不是由纯数字组成的字符串)在这里插入图片描述
在这里插入图片描述

3.8字符串和字节的相互转换

将字符串保存到文件中或是通过网络传输都要用到字节数组。
String->byte[]
1.将字符串以字节数组的形式返回
public.byte[].getBytes()
按照当前默认的字符编码转为字节
在这里插入图片描述
2.按照指定的编码格式将字符串转为字节数组
在UTF-8编码下,一个汉字3个字节
在GBK编码下,一个汉字2个字节
在这里插入图片描述

byte[]->String
1.通过构造方法把字节数组变成字符串在这里插入图片描述
2.将部分字节数组的内容变为字符串

3.9字符串查找操作

1.str.contains判断str中是否包含子串"world"
2.str.startsWith判断str是否以指定的字符串开头
3.str.endsWith判断str是否以指定的字符串结尾
在这里插入图片描述

3.10字符串替换操作

1.replaceAll替换所有指定内容
2.replaceFirst替换首个内容
在这里插入图片描述

3.11字符串拆分操作

1.public.String[].split(String.regex)将字符串全部拆分
2.public.String[].split(String.regex,int.limit)将字符串全部拆分,该数组长度就是limit的极限
在这里插入图片描述
拆分IP地址:当按照指定的格式拆分字符串得到了一个空数组
a.你这个格式在字符串中不存在"_"
b.你这个格式是特殊字符,需要转义处理"//."
在这里插入图片描述
在这里插入图片描述

3.12字符串截取操作

1.public.String.subString(int.beginIndex)从指引截取到结尾
2.public.String.subString(int.beginIndex,int.endIndex)截取部分内容
在这里插入图片描述

3.13字符串的其他操作

public.String.trim()去掉字符串的左右空格,保留中间空格
public.String.toUpperCase字符串转大写
public.String.toLowerCase字符串转小写
public.int.Length()取得字符串长度
public.boolean.isEmpty()判断是否为空字符串,但不是null,而是长度为0
在这里插入图片描述
写一个方法判断传入的str为空(要么是null,要么长度为0)
if(str == null || str.isEmpty())
写一个方法将字符串的首字母大写处理在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值