美文网首页
Java基础day13笔记:String常见功能:获取和判断、转

Java基础day13笔记:String常见功能:获取和判断、转

作者: 楠楠喜欢泡枸杞 | 来源:发表于2018-12-20 21:22 被阅读0次

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

            验证一下:

            成功~

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

        

    相关文章

      网友评论

          本文标题:Java基础day13笔记:String常见功能:获取和判断、转

          本文链接:https://www.haomeiwen.com/subject/wnikkqtx.html