接上篇的文章
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。
那我们就可以猜到一个大概的点,当原字符串与处理后的字符串一样的时候,底层代码是不会再创建新的对象位置存放,而是直接加一个链接给新的地址。可以起到优化存储空间。
将传入的参数拼接到调用方法的字符串后面。
代码演示:
直接源码里面的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:编码格式)
将字符串每带个字符进行分开,划分为数组的形式。(可以对其进行排序等 *** 作)
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);
}
}
下来,看一下源代码:
其实在这体验不出来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);
}
}
运行结果:
这个方法就是去掉字符串前后的所有空格
代码演示一下:
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类(从源码角度来看(上))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)