JDK常用接口&String类

2025-05-21 15:06:53
admin

文章目录

一.Object类1.1什么是Object类1.2Object使用方法

二.JDK常用接口2.1接口的使用2.2JDK内置的常用接口

三.String类3.1JDK中String类的声明3.2创建字符串的四种方式3.3字面量3.4字符串比较相等3.5关于字符串的常量池3.6字符串的不可变性3.7字符和字符串的相互转换3.8字符串和字节的相互转换3.9字符串查找操作3.10字符串替换操作3.11字符串拆分操作3.12字符串截取操作3.13字符串的其他操作

一.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()) 写一个方法将字符串的首字母大写处理

Copyright © 2088 2015女排世界杯_法国世界杯夺冠 - pgcnz.com All Rights Reserved.
友情链接