javaString类超详解-1
https://developer.aliyun.com/article/1515778
4、获取字符串信息
对于一个字符串对象,我们要获取其信息的最直接方法就是打印方法:
System.out.println (str); // str为字符串对象或者一个字符串常量
通过打印函数可以很直观的看到字符串里面的内容,但是如果想要获取某一个下标的字符串,或者是其他的一些信息,该怎么处理呢?下面介绍几种字符串相关的操作(所有的字符串的出现都以str表示):
①获取字符串长度
str.length();
用 str.length()的方法获取并返回一个int类型的数据以表示字符串的长度,案例如下:
public class Main { public static void main(String[] args) { String str = "hello world!"; int lenOfStr = str.length(); System.out.println("the length of str is "+ lenOfStr); } }
运行结果如下:
其长度就是字符串中的单个字符的个数。
②字符串子串查找
java的String类提供了两种查找子字符串的方法:
str.indexOf(substr) ;
str.lastIndexOf(substr);
其中substr为str的子字符串,通过 str . 的形式来访问,例如:
⑴对于indexOf:
public class Main { public static void main(String[] args) { String str = "hello world"; int pos1 = str.indexOf("wo"); System.out.println("the value of pos1 is " + pos1); int pos2 = str.indexOf("llo"); System.out.println("the value of pos2 is " + pos2); int pos3 = str.indexOf("java"); System.out.println("the value of pos3 is " + pos3); } }
其结果如下:
indexOf()方法返回找到的子字符串的首字符的下标。如果没有找的自返回: -1
⑵对于lastIndexOf:
与indexOf不同的是,lastIndexOf是从字符串的最后面(下标为str.length() -1 )开始查找,而indexOf是从字符串最前面( 下标为 0 )开始查找 。
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; int pos1 = str.lastIndexOf("hello"); System.out.println("the value of pos1 is " + pos1); int pos2 = str.lastIndexOf("or"); System.out.println("the value of pos2 is " + pos2); int pos3 = str.lastIndexOf("python"); System.out.println("the value of pos3 is " + pos3); } }
其结果如下:
如果没有找到,则返回: -1
那如果indexOf或者lastIndexOf里面传入空的字符串呢?
不妨看看以下代码案例:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; System.out.println("the length of str is " + str.length()); int pos1 = str.indexOf(""); System.out.println("the value of pos1 is " + pos1); int pos2 = str.lastIndexOf(""); System.out.println("the value of pos1 is " + pos2); } }
运行结果如下:
先计算出字符串str的长度,为24,然后对str对象使用indexOf查找,并传入空字符串,返回值用pos1接收,并输出其值。接着对str对象使用lastIndexOf查找,并传入空字符串,用pos2接收返回值,然后输出其值。
可以发现pos1的值为0,pos2的值刚好为字符串的长度。
至于为什么,这里给出原码请读者自行探究:
③获取指定下标的字符
使用 charAt(int pos);方法可以获取字符串指定下标的字符(返回值为char类型的字符)
其语法格式如下:
charAt( int pos); // pos 为传入下标值;
案例如下:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; int pos = 1; char retPos1 = str.charAt(pos); System.out.println("the value of retPos1 is " + retPos1); } }
运行结果为:
如果将其中的 1 改为 小于 0 或者是大于 str.length() -1 的值就会抛出:
StringIndexOutOfBoundsException异常
(除了字符串的查找操作,String类还提供了其他许多操作的字符串的方法)
5、字符串操作方法
①获取子字符串
查找子字符串的下标的方法我们已经介绍过,那么如何获取并返回接收某一个指定下标的字符串呢?
可以使用如下方法:
str.substring ( int beginIndex); // beginIndex为开始截取的位置
我们还是以"hello world! hello java!"这个字符串为例,案例如下:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; int pos = 13; String subStr = str.substring(pos); System.out.println("the value of subStr is " + subStr); } }
pos = 13;刚好对应str中的第二个hello 的h的下标。
运行结果如下:
substring 是一个重载的方法,他有第二个参数,以表示要截取的终点:
substring ( int start , int end );
还是以"hello world! hello java!"这个字符串为例,如下:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; int start = 6; int end = 11; String subStr = str.substring(start,end); System.out.println("the value of subStr is " + subStr); } }
运行结果如图:
可以看到substring(int start , int end)这个重载的方法是左闭右开的,也就是他的截取范围为: [ start , end )
如果截取的传入数值start和end超过了字符串的表示范围,同样会发生:
StringIndexOutOfBoundsException异常
②去除空格
使用trim()方法返回一个去除前部空格和尾部空格的字符串的副本:
定义如下:
str. trim();
str为任意字符串对象。案例如下:
还是以"hello world! hello java!"为例,但是我们在其前面和尾部加上许多空格,然后对其使用trim方法并用tem引用接收,打印tem的值,案例如下:
public class Main { public static void main(String[] args) { String str = " hello world! hello java! "; String tem = str.trim(); System.out.println(tem); } }
其结果如下:
③字符串的替代
和python相似,java也有replace方法来替换掉字符串中的子字符串,其语法如下:
str.replace( char oldChar, char newChar);
同时还有replaceAll和replaceFirst方法
⑴ replace方法
其中oldChar为你想要替换的字符,newChar是用于替换oldChar的字符。
(注意:这里的字符是区分大小写的)
对于String类的replace方法,同样发生了重载,其重载方法如下:
str.replace( String oldString , String newString);
其中oldString 为你想要替换的字符串,newString是用于替换oldString 的字符串。
代码案例如下:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; String tem1 = str.replace('h','H'); String tem2 = str.replace("hello","HELLO"); System.out.println(tem1); System.out.println(tem2); } }
运行结果如下:
⑵replaceAll
String replaceAll ( String regex, String replacement );
对于replaceAll 如果传入的参数和replace是一样的话,则两者在功能上无区别。但是replaceAll的参数是regex,即基于正则表达式的替换,例如:
str.replaceAll( "\\d" , "*" );
把一个字符串str所有的数字字符都换成星号;
⑶replaceFirst
如果参数同replace一样的话,那么其功能也与replace相同,同时replaceFirst也是基于正则表达式的替换,只不过replaceFirst只替换第一次出现的目标值。
④字符串数值转化
一个字符串如何转化为其他类型的数据呢?使用.valueOF( )方法,可以看到
更详细的资料如下:
其语法如下:
String str = String.valueOf ( int num等等数据 );
代码案例如下:
class Dog { public String name; public int age; public Dog(int age,String name){ this.age = age; this.name = name; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Main { public static void main(String[] args) { int nums = 123; String numsStr = String.valueOf(nums); System.out.println(numsStr); float fla = 3.14f; String floatStr = String.valueOf(fla); System.out.println(floatStr); double dou = 3.122; String douStr = String.valueOf(dou); System.out.println(douStr); boolean boo = false; String booStr = String.valueOf(boo); System.out.println(booStr); char ch = 'c'; String chStr = String.valueOf(ch); System.out.println(chStr); char[] charArray = {'a','b','c'}; String charArrayStr = String.valueOf(charArray); System.out.println(charArrayStr); char[] charArray2 = {'j','a','v','a'}; String charArray2Str = String.valueOf(charArray2,1,3); System.out.println(charArray2Str); Dog dog = new Dog(5,"旺旺"); String objStr = String.valueOf(dog); System.out.println(objStr); } }
其结果为:
其中方法:valueOf( char[ ] arr , int offset , int count );意为,截取从下标offset开始,往后的count个字符的片段,然后转化成字符串,如上面的例子,java:
valueOf( 'j','a','v','a' , 1 , 3 );
打印其返回值的结果为 : "ava";
方法 :valueOf( Object obj ); Object类为所有类的父类,可以参考我的一篇文章
这个地方传入其他类的对象的实例发生向上转型。
由于一个类它具有很多不同的参数类型,例如int,double,String,等等,所以不能单纯的直接使用valueOf方法,首先还需要在传入的这个类中重写toString()方法:
⑤字符串子串拆分
在python中存在着一种特殊的拆分字符串的方法为split,在使用的时候尤其方便。在Java中同样提供了类似的方法:split()方法,如下
代码案例如下:
import java.util.Arrays; public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; String[] strArrays = str.split(" "); for (int i = 0; i < strArrays.length; i++) { System.out.println(strArrays[i]); } } }
运行结果如图:
该方法将字符串以给定的字符串为分割标志,对原字符串进行分割,然后返回一个字符串的子串数组,里面存放的是被分割的字符串的子串。
其后面还有一个可选参数 limit,它的作用是限制子串的最大数量,例如在上面的代码中,添加limit的参数,将其赋值为 limit = 2 ,打印其结果为:
如果为 3 ,打印其结果为:
⑥字符串大小写转换
使用语法:
str.toUpperCase();
str.toLowerCase();
toUpperCase可以将小写的字母转化为大写,已经是大写字母或者是非字母字符的则原封不动。
toLowerCase可以将大写的字母转化为小写,已经是小写字母或者是非字母字符的则原封不动。
⑦判断字符串的开始与结尾
str.startWith( String prefix ); // prefix 为前缀字符串
str.endWith ( String suffix ); // suffix为后缀字符串
这两个方法用来判断字符串是否以 字符串prefix为str的前缀 。或者字符串 suffix是否为str的后缀。它们的返回值都为boolean类型,需要使用boolean类型的变量接收。
代码案例:
public class Main { public static void main(String[] args) { String str = "hello world! hello java!"; boolean prefixStr1 = str.startsWith("hello"); boolean prefixStr2 = str.startsWith("java"); boolean suffixStr1 = str.endsWith("!"); boolean suffixStr2 = str.endsWith("java"); System.out.println("hello 是否为 str的前缀" + prefixStr1); System.out.println("java 是否为 str的前缀"+ prefixStr2); System.out.println("! 是否为 str的后缀" + suffixStr1); System.out.println("java 是否为str的后缀" + suffixStr2); } }
结果如下:
⑧字符串比较
compareTo()以字典顺序比较两个字符串,该比较方法是基于字符串中各个编码的unicode的值的。其比较规则和c语言的memcpy类似,从下标为0的字符开始逐个比较,如果比较的字符相同则比较下一个字符,如果一直比较到尾字符都是相等的,那么两个字符串进行compareTo方法比较的返回值就为0,否则期间如果str 的字符的Unicode编码值大于 其比较的字符串,则返回 1 ,小于则返回 -1 。
public class Main { public static void main(String[] args) { String str = "123"; String strCompare1 = "123"; String strCompare2 = "124"; String strCompare3 = "111"; System.out.println("str\"123 \" 和 字符串\"123\"比较 " + str.compareTo(strCompare1)); System.out.println("str\"123 \" 和 字符串\"124\"比较 " + str.compareTo(strCompare2)); System.out.println("str\"123 \" 和 字符串\"111\"比较 " + str.compareTo(strCompare3)); } }
6、留给读者自行研究的题目
为了更好的掌握这些知识,建议去做一下这些LeetCode和牛客网上的题目,代码永远都不能只是停留在理论上,实践,亲自去敲,去使用这些方法才是最有学习效率的方法。
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
https://leetcode.cn/problems/first-unique-character-in-a-string/
字符串最后一个单词的长度_牛客题霸_牛客网
【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力
https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da
125. 验证回文串 - 力扣(LeetCode)