• Java常用API之String


    一、String的定义及不可变性的理解

    String 是和字符串相关的类,这个类是一个final类,表示不可变的字符序列。

        public final class String
                implements java.io.Serializable, Comparable<java.lang.String>, CharSequence {
                 /** The value is used for character storage. */
                 private final char value[];
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    由String的定义可以看出String的值是不可以改变的,底层是一个定义为final的字符数组。下面来验证一下这个不可变性,拿一个普通类和String类进行对比。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8oyZuHz-1659924489628)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807154755996.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgFwMxOM-1659924489630)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807155531181.png)]

    由上图可知,s1属性值随着s2的改变而变成了18。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z2f1709-1659924489631)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807155944902.png)]

    由上面的图可以看到,s2的值变了,但是s1的值没有变。这就是字符串的不可变性。还有通过连接的方式证明字符串的不可变性。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96BNGQF4-1659924489632)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807160901934.png)]

    本来s1和s2指向同一个字符串对象,s1进行了连接操作,如果是一般的类,此时s2的值是会改变的,但是此时s2没有改变,说明字符串对象具有不可变性。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKVIp4fU-1659924489633)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/%E5%82%A8%E5%AD%98%E5%8E%9F%E7%90%86.png)]

    (ps:图画得比较丑,凑合着理解就好了)

    ​ 字符串在内存中的解析。

    而且字符串常量池是不会存储相同内容的字符串的。一般来说,对于引用数据类型**==**比较的是对象的内存地址,此时s1与s2是相等的,说明此时指向的都是同一个对象,所以字符串常量池是不会存储相同内容的字符串的。

    字符串相等

    二、字符串实例化方式及拼接方式

    1. 实例化方式:

    方式一:通过字面量的方式来定义

    String s = "hello";
    
    • 1

    方式二:通过new构造器的方式来定义

    String s = new String("hello");
    
    • 1
    1. 拼接方式:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivDjUkVU-1659924489635)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807172339666.png)]

    这是很常见的String面试题。上面的结论是:

    1. 常量与常量之间的拼接结果在常量池中,且常量池中不会存在相同内容的常量。
    2. 只要有一个是变量,那么结果就在堆中。
    3. 如果拼接的结果调用intern()方法,返回值在常量池中。

    三、String常用方法

    3.1获取字符串长度

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVKDgrpw-1659924489636)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807174740387.png)]

    3.2 获取指定索引的字符

    charAt()方法

    3.3判断是否为空

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3sjtUZfd-1659924489639)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807175807131.png)]

    3.4将字符串的字符全改为小写

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iGHF4sq-1659924489639)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807180118878.png)]

    值得注意的是,源码中的toLowerCase()方法是最后返回的是new的对象,而不是直接在原字符串中修改。

    return new String(result, 0, len + resultOffset);
    
    • 1

    可能会有面试题会问的:

     "HELLO".toLowerCase() == "hello";
    
    • 1

    这种情况结果是false,因为一个是字面量在常量池中,一个是new String()在堆里面。两个是不会相等的。

    3.5将字符串的字符全改为大写

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zV2PiYkv-1659924489640)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807181610241.png)]

    3.6返回字符串副本并去掉前导白和后空白

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuPcbbXa-1659924489641)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807182225499.png)]

    这个方法一般用于用户的输入,避免用户误操作使用的。比如用户在注册时候,按键盘不小心按到了空格键,由于是前导或者后省很难发现,直接将该值弄到数据库中,用户登陆时又会出错。给用户一种很差的体验,所以一般会使用此方法避免用户误操作。

    3.7比较字符串对象是否相等

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPkUZrsQ-1659924489642)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807183128724.png)]

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.8 忽略大小写判断两个字符串是否相等

    equalsIgnoreCase()方法

    3.9将指定的字符串连接到字符串的结尾

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwYKaLGB-1659924489643)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807213505820.png)]

    作用效果和连接符**+**等价。

    3.10比较两个字符串的大小

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FV4gXtjo-1659924489644)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807214006047.png)]

    3.11剪切字符串

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p84l5AjY-1659924489645)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807214736053.png)]

    这个需要知道的就是左闭右开,左边的索引是包含的,右边的索引是不能包含的。

    3.12判断是否以指定字符串开头

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bejXiTvM-1659924489645)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807215149119.png)]

    3.13 判断是否一指定的字符串结尾

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WgnjL6iO-1659924489646)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807215630082.png)]

    3.14返回指定字符串在字符串中第一次出现的索引

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faX0qHKi-1659924489646)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807220130297.png)]

    3.15返回指定字符串在字符串中最后一次出现的索引

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrMa7iNV-1659924489647)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807220358194.png)]

    3.16替换

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FShF63gX-1659924489648)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808080526226.png)]

    3.17匹配

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nS0wpHjp-1659924489648)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808081618778.png)]

    正则表达式需要知道每个代表什么意思,面试的时候别人问你答得出来就行了。不需要死记硬背把每一个正则都背下来,网上所有的正则表达式都有,直接copy就行了。

    3.18切片

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LuOUU6pT-1659924489649)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808082628322.png)]

    笔试中的一道题:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjhTRwqC-1659924489650)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808082909575.png)]

    四、类型转换

    4.1String与包装类和基本数据类型之间的转换

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zKlMiic-1659924489650)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808090317561.png)]

    通过调用包装类的parseXXX()方法将字符串转为基本数据类型。然后由于包装类跟基本数据类型之间有自动装箱和自动拆箱。所以也可以直接转换为包装类。

    基本数据类型或包装类型转字符串

    通过调用String类的valueOf()的方式将数变为字符串。

    有时候笔试题会比较刁钻,会拿一个float的数来问最后得到的字符串是咋样的:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5BH90XA-1659924489651)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808092538542.png)]

    4.2字符串与char[]数组的转换

    字符串转字符数组

    通过调用字符串的toCharArray()来讲字符串转换为字符数组。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yf2AlFGw-1659924489652)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808093131754.png)]

    通过使用new创建对象的方式来将字符型数组转为字符串类型。

    4.3字符串与byte[]字节数组之间的转换(常用于IO流,很重要!!!)

    一般来说,将字符串转为字节数组的过程称为编码,将字节数组转为字符串的过程称为解码。这个一般用于IO流,特别重要!!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzTYURyo-1659924489653)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808093952839.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcDjoo7V-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808094534570.png)]

    可以看到,使用不同的编码集会产生不同的结果。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4EbA7Rc-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808094933778.png)]

    从右下角可以看到我使用的字符集是utf-8,而编码使用的是GBK。所以导致了乱码的问题。(一般乱码大概率是因为字符集的问题)所以一般在写代码的过程中都会设定字符集,从前端到后端再到数据库都使用相同的字符集,甚至有的设置了默认字符集之后还会在代码中指定用哪种方式编码,哪种解码,降低bug风险。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9JQ4xjt-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808100411455.png)]

  • 相关阅读:
    Pygame中Sprite类的使用1
    2022杭电多校(四)
    工程与建设杂志工程与建设杂志社工程与建设编辑部2022年第3期目录
    设计模式-组合模式
    一个关于CSDN资源定价的问题。
    Unity引擎游戏优化插件MeshSimplify使用说明
    C++(List)
    强化您的应用安全,从app加固开始
    解决Tmux提示的size x*x from a smaller client窗口缩放问题
    【高阶产品策略】设计有效的AB测试
  • 原文地址:https://blog.csdn.net/weixin_42276849/article/details/126222263