本文介绍了Java中用来描述操作字符串的String类,和其一些常用的基本操作方法,字符串的创建输出,字符串对象的比较,字符串查找,字符串的转化,字符串的替换,字符串拆分,字符串截取,和大小写转换,去除左右空格,子字符串包含,学会使用这些方法,能更方便的使用操作字符串~
String类的学习
- 一.初识String类
- 1.什么是String类?
- 2.String类的常用基本操作方法
- ①.字符串的创建和输出
- ②.String对象的比较
- ③.字符串查找
- ④.字符串的转化
- ⑤.字符串的替换
- ⑥.字符串拆分
- ⑦.字符串截取
- ⑧.其他一些常用字符串方法(大小写转换,去除左右空字符,字符串匹配)
一.初识String类
前言:String也就是字符串的意思,所谓字符串就是0到多个字符构成的整体,而字符串在日常开发中应用场景很多,我们输入的一连串文字也可以看成是字符串, 而在Java库中提供了String类即字符串类供我们用其描述字符串…
1.什么是String类?
String类也就是字符串类 是Java库中提供的供程序员操作字符串的一个类,
而在C语言中也存在字符串,它可以用字符指针或者字符数组等进行指向或者存储字符串来对其进行操作
但是在C语言这类面向过程的语言当中,只是单一的存放字符串,故还有一些专门对字符串进行的相关操作(如:计算字符串长度, 字符串比较等)需要独立封装方法出来,
故在C语言提供了标准的函数库需要预编译指令#include<string.h>包含头文件后,可以调用其提供的对字符串进行操作的函数完成大部分字符串操作(如:strlen 计算字符串长度 strcmp比较两个字符串的大小等…)
但是,这种对数据和操作数据的方法分离开的方式并不符合面向对象的思想,而字符串又应用非常广泛,
在Java纯面向对象的语言中对字符串的使用也随处可见,故java中对字符串的存储和操作提供了String类…
String类即封装了字符串和对字符串的操作方法,并且有一些相应的权限限制,从使用角度来看,String类更契合字符串的特性,对字符串操作更方便也易于拓展…
2.String类的常用基本操作方法
String类内部设计很巧妙,而对于String类的学习,先用起来再分析其内部的构造对于初学者会事半功倍~
为了更容易理解String的方法
以下是博主用一些常用的字符串操作方法的代码和运行结果~
先用起来,再使用不同方法时 注意其每个方法的相同之处~
①.字符串的创建和输出
所谓创建和输出即是字符串对象的构造方法,和输出字符串的内容
以下是String的一些构造方法,了解常用的即可
String类的构造方法有很多,大多都是根据传过来的参数内容构建相应的字符串
还有一些传递的数组设置了范围(左闭右开区间),根据其范围内的数据进行构建字符串,
注意:还有一些参数是int[] byte[]类型时 构建的字符串内容是对应着int[] 每个元素的Ascll码字符
常用的构造方法:
String str="hello";// 直接赋值 字符串常量
String str1=new String("hello");//实例化对象 其传字符串传字符串常量
char[] ch={'h','e','l','l','o'};
String str2=new String(ch); // 实例化字符串对象 传字符数组引用
// 以上都会创建字符串对象 内容为 hello
字符串的输出:
输出字符串的内容直接使用内置的println输出方法即可~
public static void main(String[] args) {
String str="hello";// 直接赋值 字符串常量
String str1=new String("hello");//实例化对象 其传字符串传字符串常量
char[] ch={'h','e','l','l','o'};
String str2=new String(ch); // 实例化字符串对象 传字符数组引用
System.out.println(str);
System.out.println(str1);
System.out.println(str2);
}
在上篇博客中 能够知道,通过println输出对象内容实际上是重写了Object的toString方法,而输出字符串对象内容是否是字符串类里重写的toString 得到的字符串的内容呢?
不是,在String类里重写的toString方法,但是其内部实现并不是返回字符串内容的字符串形式,而是直接返回当前字符串对象引用
因为方法重载,println输出字符串对象会调用对应的println方法,根据相应的方法而输出字符串对象内的字符串内容,
而并不是String对象内重写的toString得到的字符串对象内容
具体输出内容是在println内部调用的方法中(暂不深究)
故输出字符串内容 直接使用println方法传递对象即可
②.String对象的比较
对于对象的比较分为 比较对象是否相等 和比较对象的大小
1.比较String对象是否相等
比较对象是否相等 可以使用== 和equals 方法以及equalsIgnoreCase 方法
public static void main(String[] args) { //比较两个字符串是否相等
String str1="hello";
String str2="hello";
System.out.println(str1==str2); //?
//str1 和 str2 指向的都是存放 同一个字符串对象地址 比较的是地址
String str3=new String("hello");
String str4=new String("hello");
// str3和str4 都是new了一个新的字符串对象 两个字符串对象地址不同!
System.out.println(str3==str4);//?
//比较两个字符串是否相等不能用==号其比较的是地址 得用内部的equals方法
System.out.println(str3.equals(str4)); //String 里的equals 实际上也是重写了 object的equals方法
System.out.println("HELLO".equalsIgnoreCase("hello"));// 忽略大小写比较是否相等
}
注意: == 比较的是对象的地址 (没有意义) , 至于为什么不同的两种写法会有不同的逻辑值 其涉及到后面的字符串常量池~
equals在字符串类里重写了Object的方法能够按照字符串内容比较两个字符串是否相等
equalsIgnoreCase方法是忽略一些情况进行比较即是忽略字符串大小写进行比较( Hello 和hello 比较会 看作相等)
比较字符串是否相等用==不会报错 但没有意义
比较字符串是否相等用equals方法 要忽略大小写比较则equalsIgnoreCase方法
2.比较字符串对象的大小
比较字符串对象的大小是按字符串每个字典序大小进行判断
public static void main(String[] args) {//比较两个字符串的大小
String str1="hello";
String str2="hellO";
//System.out.println(str1>str2); 不能用 > <
System.out.println(str1.compareTo(str2));
//实现了 comparable接口重写了compareTo方法 按字典序比较字符串对象内字符数组引用指向的字符数组内每个字符大小
// 从下标0开始的字符比较 当出现不同 str1 大于str2返回大于零的数 反之小于零的数 如果所有都相等则返回零
System.out.println(str1.compareToIgnoreCase(str2)); //两个字符串对象比较大小 忽视大小写 汉字对应的是其他Ascll码值
}
比较字符串大小不能用> < 比较 其只能作用于基本数据类型
compareTo方法比较字符串大小
字符串大小的比较需要调用compareTo方法,而此方法是String类实现了Comparable接口具备比较特性后重写的方法,方法体即是按照字符串字典序进行比较
当对应字符不相等时 c1比c2大 则字符串1比字符串2大 当字符相等长度不相等时,长度越长的字符串大 ,而完全相等则返回0(即两个字符串相等)
compareToIgnoreCase忽略大小写情况比较字符串大小
其作用是当两个字符串的每个字符 只是大小写不相等时, 会看成是同一个字符进行比较
字符串比较大小不能用> <
比较大小使用实现Comparable接口重写的compareTo方法
要忽略大小写情况比较 使用compareToIgnoreCase方法
③.字符串查找
字符串查找的一些方法在String类中经常被用到
比如:查找字符串中某个字符或者字符串所在的下标位置,查找指定字符在字符串中第一次出现或者最后一次出现的下标
↓
public static void main(String[] args) {//字符串内 寻找字符内 字符 字符串 的方法
String str1="hello";
System.out.println(str1.charAt(4)); //获取字符串里指向字符数组下标为4位置的字符
System.out.println(str1.indexOf('l')); //返回字符串内 第一个出现'l' 字符的下标位置不存在则返回-1
System.out.println(str1.indexOf('l',2)); //重载 从指定下标位置开始往后找第一个出现字符'l'的下标位置
System.out.println(str1.indexOf("llo"));//(找子字符串)从起始位置返开始回字符串中第一次出现字符串"llo"其第一个字符的下标位置
System.out.println(str1.indexOf("llo",3));//从3下标位置往后找子字符串 找不到返回-1
System.out.println(str1.lastIndexOf('l'));//从后往前找第一个出现'l'的下标位置
System.out.println(str1.lastIndexOf('l',2));//从2下标位置开始往前找
System.out.println(str1.lastIndexOf("llo"));//从后往前找子字符串 注意字符串顺序不会颠倒 hello 从后找llo 字母顺序还是从左往右返回的也是字符串首字符地址
System.out.println(str1.lastIndexOf("llo",2));//从指定下标从后往前找
}
④.字符串的转化
String类中提供了将其他数据类型的数据转换为String类型的数据,也提供了将String转换为数组等方法
其他数据类型转换为String类型
public static void main(String[] args) { //将 其他类型转换为字符串
String str ;
str=String.valueOf(123); // String字符串内有valueOf静态方法 直接用类名调用 将所有基本数据类型数据(short byte除外) 转换为字符串
System.out.println(str);
str=String.valueOf(3.14);
System.out.println(str);
char [] arr={'h','e','l','l','o'};
str=String.valueOf(arr); //等价于 实例化一个字符串对象将字符数组调用其构造方法 只能用于字符数组 整形数组不行
System.out.println(str);
str=String.copyValueOf(arr); //和上面等价 实现的都是 拷贝一份字符数组 实例化一个字符串对象 将其内部字符数组引用变量指向拷贝的字符数组
System.out.println(str);
str=String.valueOf(arr,2,3);//支持重载 从指定下标位置往后拷贝 3个字符 作为新数组给新字符串
System.out.println(str);
str=String.valueOf(new Note()); // 传递 对象地址 实际会调用对象内的toString方法得到对象内容的字符串形式返回用于printf
System.out.println(str);
}
注意:
1.字符串转化的方法String.valueOf是静态方法不需要示例对象,但是转换后会创建String对象
2. 除了short byte以外的基本数据类型数据 都可以通过String.valueOf方法转换为对应的字符串
3. String.valueOf可以传字符数组引用 根据其字符数组内容创建字符串但不能是整形数组
4.转化为字符串的数据是自定义类的实例,则会将其内容转化为字符串形式即会调用其toString方法,而如果没有重写则会调用Object类的toString方法
…
===============================================================
String类型的一些特殊转换
toCharArray方法 将当前字符串 转换为字符数组形式返回
String.format将数据格式化转换为字符串返回(类似于C语言的格式化输出)
public static void main(String[] args) { // 转换字符串方法
String str="hello";
char []arr=str.toCharArray(); // 将字符串 转换为一个字符数组 返回 即将字符串内的字符数组拷贝一份字符数组返回其地址
System.out.println(arr);
String str1=new String(arr); //将数组转换为字符串 即创建一个字符串对象 调用其构造方法传数组引用 此字符串内的数组是拷贝的新的
String str2=String.format("%d-%3d-%.2f",2023,2,7.666); //格式化转换为字符串按照数据的类型 按相对应的格式输出字符串 将其转换为字符串
System.out.println(str2);
}
注意:
toCharArray方法是成员方法,根据当前字符串对象的字符串内容转换为对应的字符数组(会拷贝新数组返回)
println输出方法 如果传参是字符数组则可以直接输出字符数组的所有字符(是整形等则会输出其全路径)
格式化转换语句是在""内的 对应的%d 是整形格式化 %3d则是宽度为3 不足左边补空格 %f是浮点型格式化 %.2f是四舍五入保留两位小数(对应的格式化和C语言类似).
对应的转换的基本类型数据在后面 逗号隔开, 每个格式化类型需要对应基本数据类型格式(不能%d 转换浮点型数据)
⑤.字符串的替换
即将字符串内的指定字符或字符串内容替换为其他字符或者字符串
public static void main(String[] args) {// 替换字符串里的内容的方法 字符或者字符串 注意:字符串都是不可变的 实际上是产生新的一份字符串
String str="aaaaaa";
str=str.replace('a','6'); //将字符串内的所有a字符替换为6字符 可以作用于字符或者字符串
System.out.println(str);
str="ababc";
str=str.replace("ab","666");//将字符串内 所有子字符串"aa"替换为 "666"
//CharSequence 是一个String实现的一个接口 这里就可以用向上转型接受
System.out.println(str);
//下面两个只能作用于字符串
str=str.replaceAll("666","c");//和上面等价 就是将第一个参数全部替换为第二个参数
System.out.println(str);
str=str.replaceFirst("c","6"); //遇到的第一个字符串"a"替换为字符串"6"
System.out.println(str);
}
注意:
replace方法可以传递字符参数,将字符串内所有出现此字符的替换为指定字符,
也可以传字符串参数,即字符串内从左向右顺序出现的子字符串等于字符串参数的内容替换为指定字符串
而replaceAll和replaceFirst方法只能传递字符串参数
replaceAll即将字符串内所有子字符串为字符串参数的替换为指定字符串(等价于replace替换字符串)
replaceFirst是从左往右顺序将第一次出现的等于字符串参数的子字符串替换为指定字符串
⑥.字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串
字符串拆分是很常用的操作,重点掌握
public static void main(String[] args) { //字符串拆分 方法
String str="good good study";
String[] strings=str.split(" ");//将字符串 以" "分成多组 会创建一个字符串数组 存放 返回字符串数组地址
System.out.println(Arrays.toString(strings));
String[] str1=str.split(" ",2); // 重载 将字符串最多分成2组字符串 多余不再分 返回字符串地址
for (int i = 0; i < str1.length; i++) { // for循环遍历字符串数组
System.out.println(str1[i]);
}
String str2="192.168.1.0";
String [] strings1=str2.split("\\."); // 两个\ 代表一个\转义再. //. 表示转义一个.字符
// "丨" "*" "+" "." "\" 表示这些字符都需要转义在前面加上"\\" 如:"\\|"表示"|" 而表示\字符需要 "\\\\"表示"\"
for (int i = 0; i < strings1.length; i++) {
System.out.println(strings1[i]);
}
String str3="192\\168\\1\\0"; // 一个\会为转义字符 后面跟数字会转义成八进制字符 故表示\字符使其不为转义 要\\表示一个\
String[] strings2=str3.split("\\\\"); // 表示字符串中的\字符 进行拆分 需要\\\\
for (int i = 0; i < strings2.length; i++) {
System.out.println(strings2[i]);
}
String str4="192;168.1'0";
String[]strings3=str4.split("'|;|\\."); // 将";和.和' 用| 连接 表示要拿这三个字符串作为分隔 "
for (int i = 0; i < strings3.length; i++) {
System.out.println(strings3[i]);
}
}
注意:
split 方法 接受的参数是字符串类型 即根据接受的字符串在原字符串对象里按接受的分隔字符串进行拆分,拆分的内容不会出现进行分隔的字符串
拆分后返回的是一个String类型数组对象,因为拆分为了多个字符串对象
split 两个参数时, 第二个为整数 即表示最多拆分的组数, 从左往右开始拆分 当超过最大组数 后面即便有分隔字符串也不会拆分
拆分时要注意转义字符\ 当字符串里想要表示一个\字符时 需要两个\ 否则\111即会将111看成八进制数转换为十进制数对应的Ascll码字符
当分隔字符为丨 * + . \ 这五个特殊字符作为字符串时 需要在前面加上\将其转义为作为分隔的字符串 如 \\丨 表示一个|
而在拆分时要以\字符作为拆分传递的字符串参数应为\\\\ 表示字符串中的一个\字符串作为分隔符
丨 字符作为特殊字符 在作为分隔字符串时可以用| 后面再加字符串内容即丨两边的字符串都可以作为分隔的字符串对字符串对象进行分隔 如-丨, 拆分时会按- 或,对字符串对象进行拆分
⑦.字符串截取
从一个完整的字符串之中截取出部分内容为新的字符串
public static void main(String[] args) { //字符串 截取 方法
String str1="0123456789";
String str2=str1.substring(3);// 从字符串下标为3位置开始截取 截取出3位置和其后的字符
System.out.println(str2);
String str3=str1.substring(4,7); //截取出 下标 [4,7)范围内的字符串
System.out.println(str3);
String str4=(String) str1.subSequence(0,7);// 也可以拆分 会返回charSequence接口类型 得向下转型
System.out.println(str4);
}
注意:
subString一个整形参数时即从当前整形开始截取到字符串末尾
subString两个整形参数时是左闭右开区间 如: 3 5 截取的是下标3和下标4两个字符组成的字符串
subSequence方法和subString方法一样 但是只能设定两个参数截取区间,其返回的是charSequence接口类型,需要再向下转型
charSequence是String实现的一个接口,其内部具有一些抽象方法和默认方法~
⑧.其他一些常用字符串方法(大小写转换,去除左右空字符,字符串匹配)
字符串大小写的转换,子字符串的包含,字符串去除左右空格方法示例~
字符串还有很多方法,需要了解看文档去使用,
字符串 中大小写字符串的转换
public static void main(String[] args) { //字符串大小写转换
String str1="ABCD";
String str2="abcd";
System.out.println(str1.toLowerCase()); //将字符串内大写字符都变成小写
System.out.println(str2.toUpperCase()); //将字符串内小写字符都变成大写
System.out.println(str1); //变化实际上返回的是一个新字符串里面存放了变化后的字符串
System.out.println(str1.toUpperCase()==str1); // str1本身是大写 再转换为大写 没有发生改变
System.out.println(str1.toLowerCase()==str1);// str1是大写转换为小写 创建了新对象
// 如果当前字符串全是小写或者大写不需要变化情况下 则没有对字符串进行修改会返回当前字符串地址 (效率)
}
注意:
转换后是创建新的字符串对象, 但在进行转换前会会先进行检查当当字符串内容转换前和转换后没有变化即全是大写再转换大写时,会直接返回当前字符串对象,不做后续任何转换 (减少不必要的操作)
大写转小写:toLowerCase 小写转大写 :toUpperCase 只涉及到对字母的转换 ,当不需要转换时,会返回原对象
==============================================================
trim去除字符串左右两边空格
public static void main(String[] args) { //去掉 字符串左右两边空白 方法
String str1=" hello world ";
String str2=str1.trim(); // 将左右两边的空白字符(空格 换行 回车产生的字符)全部删掉
System.out.println(str2);
String str3=str1.replace(" ",""); //而使用替换操作 将空格字符串替换为空字符串会将空格全部替换
System.out.println(str3);
}
注意: trim方法 是将字符串对象左右两边产生的空白字符串全部清除,字符间的仍会存在
==============================================================
contains方法 判断某个字符串是否为主字符串的子串
public static void main(String[] args) { //是否是子字符串
String str="abcde";
System.out.println(str.contains("ab")); //查询一个字符串是否是另一个字符串的子字符串 实际底层用的 是indexOf方法
System.out.println(str.indexOf("bc"));// 第一次出现bc的首字符下标, 即也可以判断字符串内是否存在此字符串
}
contains实际上底层调用的是indexOf方法 即只要在主字符串内找到第一次出现的要查找的字符即 存在包含关系 属于方法复用~
此方法也是串中提到的字符串匹配问题~
,即判断一个字符串是否为另一个字符串的子字符串,其判断方法String已经写好,但有很多关于这方面的算法:BF暴力匹配算法 BM算法
KMP算法等 , 学编程 不仅要会利用内置的库方法 也要学习他人优秀的算法锻炼思维~
本文介绍了Java中对字符串进行描述操作的String类,
以及其常用的一些基本操作方法,其所有共同点是对字符串的内容进行修改是会创建新字符串对象,对新字符串对象进行修改后返回新字符串对象,
学会使用这些方法,对字符串的使用能更上一层
在下一篇会介绍String不可变性,字符串常量池和StringBuilder和StringBuffer