Java当中的String类(从源码角度来看(下))

Java当中的String类(从源码角度来看(下)),第1张

接上篇的文章
Java当中的String类(从源码角度来看(上))

文章目录
  • String类中的转换方法
    • toLowerCase()和toUpperCase()方法
    • concat()拼接方法
    • split()分割方法
    • getBytes()方法
    • toCharArray()方法
    • valueOf()方法
  • String类中的替换功能
    • replace()方法
    • replaceAll()和replaceFirst()方法
  • String类当中去除字符串两边的空格
    • trim()方法

本篇文章接着上篇的接续分析到:

String类中的转换方法 toLowerCase()和toUpperCase()方法

toLowerCase()方法就是将字符串里面的所有字符全部转换为小写;
toUpperCase()方法就是将字符串里面的所有字符全部转换为大写。

public class Demo05 {
    public static void main(String[] args) {
        String st = "Xing_CHEN_yu_CHEN_xi";
        System.out.println("toLowerCase执行的结果:" + st.toLowerCase());
        //字符串里面的所有字母转换为小写
        System.out.println("toUpperCase执行的结果:" + st.toUpperCase());
        //将字符串里面的所有字母转换为大写
    }
}

执行结果:

接下来,小伙伴们可以猜猜下面的执行结果是什么:

public class Demo05 {
    public static void main(String[] args) {
        String st = "DEMO";
        String st1 = st.toUpperCase();
        System.out.println(st1);
        System.out.println(st == st1);
    }
}

true OR false?

哦? ,答案为true。
那我们就可以猜到一个大概的点,当原字符串与处理后的字符串一样的时候,底层代码是不会再创建新的对象位置存放,而是直接加一个链接给新的地址。可以起到优化存储空间。

concat()拼接方法

将传入的参数拼接到调用方法的字符串后面。
代码演示:

直接源码里面的str.getChars(buf,len)方法是添加后面的后继元素。

在这再强调一下,最底层的代码native方法表示的是本地的方法,使用的是C/C++语言来实现的。

split()分割方法

当一个很长的字符串,我们要将其分割开,就使用这个方法。
需要分割的字符串调用这个方法,然后在方法里面传入需要通过什么来分割的字符。

在这就不多了,一切都在代码里,先演示为敬:

这里的底层代码有些复杂,我就不做多的分析了。

用指定的符号分割字符串为数组。

这玩意其实是正则表达式,我下篇就说这个。

getBytes()方法

一种编码的方法,将字符串编码为数组的形式进行传播,我们都知道,在程序底层,是不可能将字符串以字符的形式进行保存传输,都是将它转换为数字进行传播的。

左移getBytes()方法就是将它转换为数字的形式转换过来。

代码演示一下:

public class Demo08 {
    public static void main(String[] args) {
        String st = "cabed";
        byte[] ch =  st.getBytes();      //编码
        System.out.println(Arrays.toString(ch));
        String string = new String(ch); //解码
        System.out.println(string);
    }
}

这个也可以给出指定的区间进行解码:

public class Demo08 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String st = "星辰";
        byte[] ch =  st.getBytes("GBK");      //编码
        System.out.println(Arrays.toString(ch));
        String  string = new String(ch,"GBK");  //解码
        System.out.println(string);
        String string1 = new String(ch,2,2,"GBK"); //解码
        System.out.println(string1); 
    }
}

api里面的显示:(bytess 编码的数组;offset:编码的格式开始;length:编码长度的格式;charsetName:编码格式)

toCharArray()方法

将字符串每带个字符进行分开,划分为数组的形式。(可以对其进行排序等 *** 作)

public class Demo08 {
    public static void main(String[] args) {
        String st = "cba";
        char[] ch =  st.toCharArray();
        System.out.println(Arrays.toString(ch));
        Arrays.sort(ch);        //转换为数组,就可以对它进行排序了
        System.out.println(Arrays.toString(ch));
        String st1 = new String(ch);  //将数组转又转换为字符串的形式
        System.out.println(st1);
    }
}

valueOf()方法

valueOf()方法就是将要转换的对象转换为字符串的形式;

valueOf能转换的对象都有:

valueOf就是能够将这些类都转换为String类的。

String类中的替换功能 replace()方法

String replace(char old,char new)
String replace(String old,String new)

代码演示一下:

public class Demo09 {
    public static void main(String[] args) {
        String string = "Xing_Chen_Yu_Chen_Xi";
        String st1 = string.replace('_', '-');
        //将所有的'_'的这个字符换位'-'这个字符
        System.out.println(st1);

        String st2 = string.replace("Chen", "晨");
        //将多有的指定的字符串转换为想要的字符串
        System.out.println(st2);
    }
}

下来,看一下源代码:

replaceAll()和replaceFirst()方法

其实在这体验不出来replace()和replaceAll()两个方法的区别,具体区分,主要体现在正则表达式那里,我将在下一篇博客当中说明正则表达式。

replaceFirst()也是替换的方法,这个只不过是指替换第一出线的,后面的都是不用替换的

下面先看看代码演示:

public class Demo09 {
    public static void main(String[] args) {
        String string = "Xing_Chen_Yu_Chen_Xi";
        System.out.println("原字符串:                       " + string);

        String st1 = string.replace("Chen", "晨");
        //将多有的指定的字符串转换为想要的字符串
        System.out.println("replace()方法修改后的字符串:     " + st1);

        String st2 = string.replaceAll("Chen", "晨");
        //将多有的指定的字符串转换为想要的字符串
        System.out.println("replaceAll()方法修改后的字符串:  " + st2);

        String st3 = string.replaceFirst("Chen", "晨");
        System.out.println("replaceFirst()方法修改后的字符串:" + st3);
    }
}

运行结果:

String类当中去除字符串两边的空格 trim()方法

这个方法就是去掉字符串前后的所有空格

代码演示一下:

public class Demo10 {
    public static void main(String[] args) {
        String string = "  Xing_Chen_Yu_Chen_Xi  ";
        String st = string.trim();
        System.out.println("trim()方法前的字符串长度" + string.length());
        System.out.println("trim()方法后的字符串长度" + st.length());
    }
}

执行结果:

因为我在字符串的前后都各输入有2个空格。所以前后都减去,就剩20个了。

下来,看一下这个方法的源码:

    public String trim() {
        int len = value.length;  //获得字符串的长度

        //创建一个变量,用于记录前面有几个空格,或者说有字符的字符串开始的位置
        int st = 0;              
        
        //结构字符串转换过来的数组
        char[] val = value;    /* avoid getfield opcode */

        //循环并记录字符串前面有几个空格,或者说记录要从数组当中第几个位置开始
        while ((st < len) && (val[st] <= ' ')) {
            st++;
        }
        
        //循环,通过len长度减,记录出将字符串后面的空格删除后,到那个位置结束
        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        
        //return输出新的字符串
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    }

本篇博客也就到此为止了,这个专题也就整理到此为止了,下篇介绍一下正则表达式

这也是我重读javase基础的一个系列,比起当时初学的时候,现在看问题多了个高度,理解什么也相对轻松一点全面一些。学习起来更加偏向阅读源码来看,所以多为大家分享看源码。
但毕竟学过时间也较长,有什么不对和漏缺的地方,希望大家指出。
欢迎大家在评论区讨论


上篇: ===》 Java当中的String类(从源码角度来看(上))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/877584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存