2019/7/11 17:47 二刷留念
01-String(概述)
接下来说一下Java中API的部分,其实在讲多线程的时候已经涉及到了API的部分,比如说Thread类,比如说Runnable接口。
什么叫API呢?就是Java为我们对外提供的应用程序接口,就是暴露出来的部分,能让我们直接使用的部分,Java都帮我们定义好啦。
那么除了线程以外呢,我们还有一些在我们实际开发当中常用的对象。这些事物也被Java进行了封装,并定义成了对象。
比如,我们在开发中最常见的数据之一,字符串。
这种数据在我们实际生活中非常常见,所以就把它封装成了对象描述,并且定义了一些功能,以便于操作这些字符串。
很多种语言,都有对字符串的描述,以及功能的提供。
在Java中,描述字符串的是java.lang包中的一个类:String。
我们来看一下它的描述:
首先,final代表它不能有子类,也就是说,它里面操作字符串的功能是不能够复写的,因为它连子类都不能有呢。
它有很多种构造方法:
比如空参数构造方法。
如上图,两条语句表达的是同一个意思,但是第二条显然比第一条简单多啦,所以第一种那种空参数的构造方法使用起来并不多。
先讲一下String s1="abc";这句代码:
这不就矛盾啦吗?
字符串常量既然一旦初始化就不可以被改变,那为什么它的内容可以从“abc”变成“kk”,而且后面还能打印粗来呢?
其实,不是“abc”变了,而是s1变了,刚开始s1指向“abc”对象,后来又指向了“kk”对象,而“abc”没有改变喔。
注意这两种方式使用起来也是一样的:
但是也有一些区别:
首先,s1和s2肯定不相等的,两个人指向的并不是同一个对象。(即便两个对象内容都是“abc”,它们也是两个不同的对象)所以s1!=s2。
其次,equals比较的应该是内存地址值,而s1和s2不相等,在这里怎么变相等了呢?
因为String类复写了Object类的equals方法,复写完之后,它建立了自己独特的判断字符串是否相同的方法:
那么,在这个例子中,s1和s2有什么区别呢?(面试中经常问到)
s1在内存中有一个对象。
s2在内存中有两个对象。(new是一个?“abc”是一个?没太懂。)
了解内容:
字符串其实在内存中有个常量池,这个池子里面是个数组,用来存放a、b、c这样的字符。我们都知道,字符串由字符组成。
举个例子,我们在常量池中存入了a、b、c,组成了“abc”字符串,又存入了d、e、f,组成了“def”字符串,接下来我们需要一个“abf”字符串,这个时候,它会在常量池中找到a、b、f字符,又拼成一个新的字符串对象。
总结一下,字符串自身的特点:
1,它是一个对象。
2,它是一个常量,不能被改变。
3,s1="abc"在内存中有一个对象,s2=new String(“abc”);在内存中有两个对象。
4,字符串有自己独特的equals比较方式,用来判断内容是否相同。
02-String(常见功能-获取和判断)
在说本节内容之前,上节内容还有一些需要补充的:
为什么鸭?
String s1="abc";之后,因为"abc"字符串已经在内存中存在了,在常量池中存在的数据,s3在进行初始化的时候,发现"abc"已经在内存中存在的时候,它就不会独立开辟空间了。因为再开辟空间的时候会发现,它会比较浪费空间。"abc"已经存在,而且它不能被改变,那为什么还要再开辟空间给它分配呢?所以就不需要开辟新的空间啦。所以为了节约内存,在字符串这个对象当中,只要字符串相同的话,它们使用的就是同一个字符串对象。
因此s1和s3指向同一个字符串对象。
String类适用于描述字符串事物。
那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
说完字符串的特点,下面说字符串所涉及到的一些方法。
字符串的常见操作:
1,获取。
1.1 字符串中包含的字符数,也就是字符串的长度。
int length():获取长度。
数组也有长度,但是它那个length是属性,没有括号。
字符串也有长度,但它是通过方法来完成的,带括号。
1.2 根据位置获取位置上某个字符。
char charAt(int index):
1.3 根据字符获取该字符在字符串中的位置。
int indexOf(int ch):
为什么ch不是char是int呢?因为它接收的是ASCII码。
它还有一个重载:
int indexOf(int ch,int fromIndex):从fromIndex指定的位置开始,获取ch在字符串中出现的位置。
我们不光可以获取字符在字符串中的位置,还可以获取字符串在字符串中的位置。
int indexOf(String str)
int indexOf(String str,int fromIndex)
接下来做一个演示~
返回字符串长度:
主函数中调用一下:
编译运行:
根据索引获取字符和根据字符获取索引:
运行结果:
从指定位置开始搜索'a'第一出现的位置:
运行结果:
还有这种情况:
当访问到字符串中不存在的角标时,会发生字符串角标越界异常StringIndexOutOfBoundsException:
还有这种情况,寻找字符串中不存在的字符:
会怎样呢?
我们会发现,没有角标会返回-1:
它还有以下几个方法:
反向索引。
我们来试一个:
运行结果:
注意喔,虽然反向索引是从右往左开始查找,但最后返回的角标值依然是从左往右数的角标值。
返回指定索引处字符的ASCII码:
就不举例说明啦。
2,判断。
2.1 字符串中是否包含某一个子串。
boolean contains(str):
这个CharSequence类型的参数是啥意思捏?
点进去看看:
我们发现它的子类有String、StringBuffer等等。
特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在。所以indexOf(str),也可以用于对指定字符串的判断是否包含。
用法:if(str.indexOf("aa")!=-1)
而且该方法既可以判断,又可以获取出现的位置。
2.2 字符串中是否有内容。
boolean isEmpty():原理就是判断长度是否为0。
注意“”和null是有区别的,“”是一个对象,null是指向空。
2.3 字符串是否是以指定内容开头。
boolean startsWith(str);
2.4 字符串是否是以指定内容结尾。
boolean endsWith(str);
下面演示一下~
主函数中调用它:
运行:
2.5 判断字符串的内容是否相同。复写了Object类总的equals方法。
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase(String anotherString);
03-String(常见功能-转换)
3,转换。
3.1 将字符数组转成字符串。
构造函数: String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。
试一下~
将字符串数组整个转成字符串:
主函数中调用:
运行:
将字符串数组的一部分转成字符串:
运行:
刚刚说的是用构造函数的方式来将字符数组转换成字符串,那么不用构造函数的方式,也可以呢~
静态方法:static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset,int count);
static String valueOf(char[]);
3.2 将字符串转成字符数组。
char[] toCharArray();
3.3 将字节数组转成字符串。
String(byte[])
String(byte[],offset,count)
3.4 将字符串转成字节数组。
byte[] getBytes();
3.5 将基本数据类型转成字符串。
static String valueOf(int);
static String valueOf(double);
例:3+"";就相当于String.valueOf(3);只是后者比较专业,当然也稍微麻烦一些。
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
试一下~
运行:
04-String(常见功能-切割和替换)
4,替换
String replace(oldchar,newchar);
试一下~
因为字符串一旦被初始化就不会被改变,所以s.replace(...)返回来的是一个新字符串。所以s还是原来的字符串~
运行:
将要替换的字符换成一个原来字符串中不存在的字符,比如说'q':
如果要替换的字符不存在,返回的还是原串。
还有一个方法:
话不多说,我们直接用例子来说明它的用法:
运行:
还有一个方法:
我们只需要知道它可以按指定的规则对字符串进行替换,因为涉及到正则表达式,所以后面再说~
5,切割
String[] split(regex);
试一下~
运行:
6,子串。获取字符串中的一部分。
String substring(begin); //从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
String substring(begin,end); //包含头,不包含尾。
我们直接通过例子来看看它的用法:
运行:
05-String(常见功能-比较和去除空格)
7,转换,去除空格,比较。
7.1 将字符串转成大写或者小写。
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去除。
String trim();
7.3 对两个字符串进行自然顺序的比较。
int compareTo(String);
话不多说,上例子:
运行:
去除两端空格在实际开发中非常常用。比如登录账号的时候,很容易在前后多打空格,这个时候如果报错不让登录,用户体验感就会很差,会造成自己账号被盗了的错觉(他们根本意识不到是自己多输了空格)。
继续试一试compareTo~
运行:
再将s1的内容换一下:
再运行试试:
我们来看一下这个方法,看看它输出的这个数字是什么意思~
06-String(字符串练习1)
思路:
开始:
结束:
如果整个字符串全是空格,那么结束标志就是开始指针大于等于结尾指针。
代码:
主函数中调用:
运行:
07-String(字符串练习2)
字符串反转函数:
数组反转函数:
数组位置交换函数:
注意这样写代码才是靠谱哟,功能尽量细分,功能尽量独立出来,变成一个小的函数,可以被调用,后面修改起来也方便~
主函数中调用:
运行:
现在还有一个需求,只将原先字符串中的ab调换一下位置,其他的不动。
字符串反转函数:
数组反转函数:
主函数中调用:
运行:
但是在Java中,但凡是取从头到尾的部分,都是包含头不包含尾的。所以给这里减个1:
所以我们如果还是想取ab c这一部分的话,调用的时候就应该写成reverseString(s,6,10);
而刚开始的整段字符串反转的函数也可以改成这样:
08-String(字符串练习3)
代码:
主函数中调用:
运行:
这是第一种方式,我们换一种方式~更简单的那种~
· indexOf方法还有一个重载,可以从指定位置开始查找~
运行:
那为什么不能调用split方法来解决呢?
它在一定情况下可以返回正确的值,但在如下情况下就会和正确值有出入(kk在字符串头部的时候):
所以split方法并不通用,不建议使用它来解决这种问题哦。
09-String(字符串练习4)
思路:
按这样的思路在长的字符串中来找~
因此,总结出规律:
代码~(没太看懂,好复杂喔(;′⌒`) )
又看了一次,懂啦,(*^__^*) 嘻嘻,还做了小笔记~
主函数中调用:
运行结果:
我们发现,目标段hello在这个过程中已经找到啦。
接下来只需添加小小一句代码就可以获取它~
编译运行:
但是还有一个小问题,在刚刚的代码中,我们默认形参中传过来的s2是较短的那个字符串,可是实际中就不一定是这样了呢。如果s2是较长的那个,那判断的过程就会变得很冗长,浪费了时间~
我们在前面加上这样几句,max用来存放较长的字符串,min用来存放较短字符串:
验证一下:
成功~
下面的代码也都修改一下:
网友评论