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

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用来存放较短字符串:

        验证一下:

        成功~

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

    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容