java字符串反转及替换_Java基础day13笔记:String常见功能:获取和判断、转换、切割和替换、比较和去除空格|字符串练习...

2019/7/11 17:47    二刷留念

01-String(概述)

接下来说一下Java中API的部分,其实在讲多线程的时候已经涉及到了API的部分,比如说Thread类,比如说Runnable接口。

什么叫API呢?就是Java为我们对外提供的应用程序接口,就是暴露出来的部分,能让我们直接使用的部分,Java都帮我们定义好啦。

那么除了线程以外呢,我们还有一些在我们实际开发当中常用的对象。这些事物也被Java进行了封装,并定义成了对象。

比如,我们在开发中最常见的数据之一,字符串。

这种数据在我们实际生活中非常常见,所以就把它封装成了对象描述,并且定义了一些功能,以便于操作这些字符串。

很多种语言,都有对字符串的描述,以及功能的提供。

在Java中,描述字符串的是java.lang包中的一个类:String。

我们来看一下它的描述:

36a94ccdd414

首先,final代表它不能有子类,也就是说,它里面操作字符串的功能是不能够复写的,因为它连子类都不能有呢。

它有很多种构造方法:

36a94ccdd414

比如空参数构造方法。

36a94ccdd414

如上图,两条语句表达的是同一个意思,但是第二条显然比第一条简单多啦,所以第一种那种空参数的构造方法使用起来并不多。

先讲一下String s1="abc";这句代码:

36a94ccdd414

这不就矛盾啦吗?

字符串常量既然一旦初始化就不可以被改变,那为什么它的内容可以从“abc”变成“kk”,而且后面还能打印粗来呢?

其实,不是“abc”变了,而是s1变了,刚开始s1指向“abc”对象,后来又指向了“kk”对象,而“abc”没有改变喔。

注意这两种方式使用起来也是一样的:

36a94ccdd414

但是也有一些区别:

36a94ccdd414

首先,s1和s2肯定不相等的,两个人指向的并不是同一个对象。(即便两个对象内容都是“abc”,它们也是两个不同的对象)所以s1!=s2。

其次,equals比较的应该是内存地址值,而s1和s2不相等,在这里怎么变相等了呢?

因为String类复写了Object类的equals方法,复写完之后,它建立了自己独特的判断字符串是否相同的方法:

36a94ccdd414

那么,在这个例子中,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(常见功能-获取和判断)

在说本节内容之前,上节内容还有一些需要补充的:

36a94ccdd414

为什么鸭?

String s1="abc";之后,因为"abc"字符串已经在内存中存在了,在常量池中存在的数据,s3在进行初始化的时候,发现"abc"已经在内存中存在的时候,它就不会独立开辟空间了。因为再开辟空间的时候会发现,它会比较浪费空间。"abc"已经存在,而且它不能被改变,那为什么还要再开辟空间给它分配呢?所以就不需要开辟新的空间啦。所以为了节约内存,在字符串这个对象当中,只要字符串相同的话,它们使用的就是同一个字符串对象。

因此s1和s3指向同一个字符串对象。

String类适用于描述字符串事物。

那么它就提供了多个方法对字符串进行操作。

常见的操作有哪些?

说完字符串的特点,下面说字符串所涉及到的一些方法。

字符串的常见操作:

1,获取。

1.1 字符串中包含的字符数,也就是字符串的长度。

int length():获取长度。

36a94ccdd414

数组也有长度,但是它那个length是属性,没有括号。

字符串也有长度,但它是通过方法来完成的,带括号。

1.2 根据位置获取位置上某个字符。

char charAt(int index):

36a94ccdd414

1.3 根据字符获取该字符在字符串中的位置。

int indexOf(int ch):

36a94ccdd414

为什么ch不是char是int呢?因为它接收的是ASCII码。

它还有一个重载:

int indexOf(int ch,int fromIndex):从fromIndex指定的位置开始,获取ch在字符串中出现的位置。

36a94ccdd414

我们不光可以获取字符在字符串中的位置,还可以获取字符串在字符串中的位置。

int indexOf(String str)

int indexOf(String str,int fromIndex)

接下来做一个演示~

返回字符串长度:

36a94ccdd414

36a94ccdd414

主函数中调用一下:

36a94ccdd414

编译运行:

36a94ccdd414

根据索引获取字符和根据字符获取索引:

36a94ccdd414

运行结果:

36a94ccdd414

从指定位置开始搜索'a'第一出现的位置:

36a94ccdd414

运行结果:

36a94ccdd414

还有这种情况:

36a94ccdd414

当访问到字符串中不存在的角标时,会发生字符串角标越界异常StringIndexOutOfBoundsException:

36a94ccdd414

还有这种情况,寻找字符串中不存在的字符:

36a94ccdd414

会怎样呢?

我们会发现,没有角标会返回-1:

36a94ccdd414

它还有以下几个方法:

36a94ccdd414

反向索引。

我们来试一个:

36a94ccdd414

运行结果:

36a94ccdd414

注意喔,虽然反向索引是从右往左开始查找,但最后返回的角标值依然是从左往右数的角标值。

返回指定索引处字符的ASCII码:

36a94ccdd414

就不举例说明啦。

2,判断。

2.1 字符串中是否包含某一个子串。

boolean contains(str):

36a94ccdd414

这个CharSequence类型的参数是啥意思捏?

点进去看看:

36a94ccdd414

我们发现它的子类有String、StringBuffer等等。

特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在。所以indexOf(str),也可以用于对指定字符串的判断是否包含。

用法:if(str.indexOf("aa")!=-1)

而且该方法既可以判断,又可以获取出现的位置。

2.2 字符串中是否有内容。

boolean isEmpty():原理就是判断长度是否为0。

36a94ccdd414

注意“”和null是有区别的,“”是一个对象,null是指向空。

2.3 字符串是否是以指定内容开头。

boolean startsWith(str);

2.4 字符串是否是以指定内容结尾。

boolean endsWith(str);

下面演示一下~

36a94ccdd414

主函数中调用它:

36a94ccdd414

运行:

36a94ccdd414

2.5 判断字符串的内容是否相同。复写了Object类总的equals方法。

boolean equals(str);

2.6 判断内容是否相同,并忽略大小写。

boolean equalsIgnoreCase(String anotherString);

36a94ccdd414

03-String(常见功能-转换)

3,转换。

3.1 将字符数组转成字符串。

36a94ccdd414

构造函数:    String(char[])

String(char[],offset,count):将字符数组中的一部分转成字符串。

试一下~

将字符串数组整个转成字符串:

36a94ccdd414

主函数中调用:

36a94ccdd414

运行:

36a94ccdd414

将字符串数组的一部分转成字符串:

36a94ccdd414

运行:

36a94ccdd414

刚刚说的是用构造函数的方式来将字符数组转换成字符串,那么不用构造函数的方式,也可以呢~

静态方法:static String copyValueOf(char[]);

static String copyValueOf(char[] data,int offset,int count);

36a94ccdd414

static String valueOf(char[]);

3.2 将字符串转成字符数组。

char[] toCharArray();

36a94ccdd414

3.3 将字节数组转成字符串。

String(byte[])

String(byte[],offset,count)

3.4 将字符串转成字节数组。

byte[] getBytes();

36a94ccdd414

3.5 将基本数据类型转成字符串。

static String valueOf(int);

static String valueOf(double);

例:3+"";就相当于String.valueOf(3);只是后者比较专业,当然也稍微麻烦一些。

特殊:字符串和字节数组在转换过程中,是可以指定编码表的。

试一下~

36a94ccdd414

运行:

36a94ccdd414

04-String(常见功能-切割和替换)

4,替换

String replace(oldchar,newchar);

36a94ccdd414

试一下~

36a94ccdd414

因为字符串一旦被初始化就不会被改变,所以s.replace(...)返回来的是一个新字符串。所以s还是原来的字符串~

运行:

36a94ccdd414

将要替换的字符换成一个原来字符串中不存在的字符,比如说'q':

36a94ccdd414

如果要替换的字符不存在,返回的还是原串。

还有一个方法:

36a94ccdd414

话不多说,我们直接用例子来说明它的用法:

36a94ccdd414

运行:

36a94ccdd414

还有一个方法:

36a94ccdd414

我们只需要知道它可以按指定的规则对字符串进行替换,因为涉及到正则表达式,所以后面再说~

5,切割

String[] split(regex);

试一下~

36a94ccdd414

运行:

36a94ccdd414

6,子串。获取字符串中的一部分。

String substring(begin);  //从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。

String substring(begin,end);  //包含头,不包含尾。

我们直接通过例子来看看它的用法:

36a94ccdd414

运行:

36a94ccdd414

05-String(常见功能-比较和去除空格)

7,转换,去除空格,比较。

7.1 将字符串转成大写或者小写。

String toUpperCase();

String toLowerCase();

7.2 将字符串两端的多个空格去除。

String trim();

7.3 对两个字符串进行自然顺序的比较。

int compareTo(String);

话不多说,上例子:

36a94ccdd414

运行:

36a94ccdd414

去除两端空格在实际开发中非常常用。比如登录账号的时候,很容易在前后多打空格,这个时候如果报错不让登录,用户体验感就会很差,会造成自己账号被盗了的错觉(他们根本意识不到是自己多输了空格)。

继续试一试compareTo~

36a94ccdd414

运行:

36a94ccdd414

再将s1的内容换一下:

36a94ccdd414

再运行试试:

36a94ccdd414

我们来看一下这个方法,看看它输出的这个数字是什么意思~

36a94ccdd414

36a94ccdd414

06-String(字符串练习1)

36a94ccdd414

思路:

开始:

36a94ccdd414

结束:

36a94ccdd414

如果整个字符串全是空格,那么结束标志就是开始指针大于等于结尾指针。

代码:

36a94ccdd414

36a94ccdd414

主函数中调用:

36a94ccdd414

运行:

36a94ccdd414

07-String(字符串练习2)

36a94ccdd414

字符串反转函数:

36a94ccdd414

数组反转函数:

36a94ccdd414

数组位置交换函数:

36a94ccdd414

注意这样写代码才是靠谱哟,功能尽量细分,功能尽量独立出来,变成一个小的函数,可以被调用,后面修改起来也方便~

主函数中调用:

36a94ccdd414

运行:

36a94ccdd414

现在还有一个需求,只将原先字符串中的ab调换一下位置,其他的不动。

字符串反转函数:

36a94ccdd414

数组反转函数:

36a94ccdd414

主函数中调用:

36a94ccdd414

运行:

36a94ccdd414

但是在Java中,但凡是取从头到尾的部分,都是包含头不包含尾的。所以给这里减个1:

36a94ccdd414

所以我们如果还是想取ab c这一部分的话,调用的时候就应该写成reverseString(s,6,10);

而刚开始的整段字符串反转的函数也可以改成这样:

36a94ccdd414

08-String(字符串练习3)

36a94ccdd414

代码:

36a94ccdd414

主函数中调用:

36a94ccdd414

运行:

36a94ccdd414

这是第一种方式,我们换一种方式~更简单的那种~

·    indexOf方法还有一个重载,可以从指定位置开始查找~

36a94ccdd414

运行:

36a94ccdd414

那为什么不能调用split方法来解决呢?

它在一定情况下可以返回正确的值,但在如下情况下就会和正确值有出入(kk在字符串头部的时候):

36a94ccdd414

36a94ccdd414

所以split方法并不通用,不建议使用它来解决这种问题哦。

09-String(字符串练习4)

36a94ccdd414

思路:

按这样的思路在长的字符串中来找~

36a94ccdd414

36a94ccdd414

36a94ccdd414

36a94ccdd414

36a94ccdd414

36a94ccdd414

36a94ccdd414

因此,总结出规律:

36a94ccdd414

代码~(没太看懂,好复杂喔(;′⌒`))

36a94ccdd414

又看了一次,懂啦,(*^__^*) 嘻嘻,还做了小笔记~

主函数中调用:

36a94ccdd414

运行结果:

36a94ccdd414

36a94ccdd414

我们发现,目标段hello在这个过程中已经找到啦。

接下来只需添加小小一句代码就可以获取它~

36a94ccdd414

编译运行:

36a94ccdd414

但是还有一个小问题,在刚刚的代码中,我们默认形参中传过来的s2是较短的那个字符串,可是实际中就不一定是这样了呢。如果s2是较长的那个,那判断的过程就会变得很冗长,浪费了时间~

我们在前面加上这样几句,max用来存放较长的字符串,min用来存放较短字符串:

36a94ccdd414

验证一下:

36a94ccdd414

成功~

下面的代码也都修改一下:

36a94ccdd414

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值