引言
字符串就是一连串的字符序列,Java提供了String、StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象。
- String类是不可变类的;
- StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append、insert、reverse、setCharAt、setLength等方法可以改变这个字符串对象的字符序列;一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString方法将其转换为一个String对象,使其不可变;
- JDK1.5又新增了一个StringBuilder类,它也代表了字符串对象,StringBuffer和StringBuilder基本相同,构造器和方法也一样,不同点是:StringBuffer是线程安全的,StringBuilder是线程不安全的,但是性能更高;所以通常情况下,创建一个内容可变的字符串,应优先选择StringBuilder类;
下面分别介绍一下这三种字符串类的一些常用方法(StringBuffer和StringBuilder方法基本相同,一起介绍了)
String类
这里还是简单说一下为什么String类不能修改吧;
简单来说,因为String类的使用频率太大了,为了进一步提高效率,String类所声明的字符串都会保存到常量池中,这样用哪个字符串直接取出来就可以了;
其实就记住不管怎样String类字符串就存放在常量池中;
举个例子:
String s1 = new String("Hello"); String s2 = "World" + s1;
能看出来创建了几个对象吗?
答案是三个;一个Hello,一个World,一个HelloWorld;先是Hello存放到了常量池中,然后World又进去,最后它俩组合形成新的字符串HelloWorld又放了进去;
如果理解不了,那么就记住一点:String类字符串一旦创建不可变。
String类构造方法
String s = "abc";
String s = new String("abc");
String s = new String(byte数组);
String s = new String(byte数组, 起始下标, 长度);
String s = new String(char数组);
String s = new String(char数组, 起始下标, 长度);
记住这几种就可以了;
String常用方法:
简单介绍的方法
length
作用:返回字符串长度
比较简单,就不详细介绍了,出现频率非常高
注意:数组里面的length是属性,这里的length()是方法;
isEmpty
作用:判断字符串是否为空字符串;
空字符串返回true,否则返回false
注意:判断的是空字符串""(即length()为0),而不是null,如果是null会造成空指针异常;
详细介绍的方法
contians
作用:判断前面的字符串是否包含后面的字符串
格式:public boolean contains(CharSequence s)
参数 :s - 搜索的顺序 (CharSequence是一个接口,String类已实现,所以可以传入一个字符串)
结果 :如果此字符串包含 s , 则为 true,否则为 false
例如:
System.out.println("HelloWorld".contains("World")); // 输出true System.out.println("HelloWorld".contains("Java")); // 输出false
endsWith
作用:判断当前字符串是否以某个字符串结尾
格式:public boolean endsWith(String suffix)
参数:suffix - 后缀
结果:如果当前字符串以suffix结尾,为true,否则为false
例如:
System.out.println("Java.txt".endsWith("Java")); // 输出false System.out.println("Java.txt".endsWith(".txt")); // 输出true
startsWith
作用:判断当前字符串是否以某个字符串开始
格式:public boolean startsWith(String suffix)
参数:suffix - 前缀
结果:如果当前字符串以suffix开始,为true,否则为false
例如:
System.out.println("Java.txt".startsWith("Java")); // 输出true System.out.println("Java.txt".startsWith(".txt")); // 输出false
equalsIgnoreCase
作用:判断两个字符串是否相等,判断时忽略大小写
格式:public boolean equalsIgnoreCase(String anotherString)
参数:anotherString - String
结果:如果两个字符串忽略大小写的情况下相等,返回true,否则为false
例如:
System.out.println("ABc".equalsIgnoreCase("abC")); // true System.out.println("aABc".equalsIgnoreCase("abC")); // false
其实这个功能很常见,就比如我们输入验证码时有些情况就自动忽略了你输入字母的大小写;
getBytes
作用:将字符串对象转换为字节数组(字符对应的Ascii码数组)
格式:public byte[] getBytes(String charsetName)
参数:charsetName - String
结果:返回一个byte[]数组,对应每个字符的Ascii码
例如:
byte[] b = "abcde".getBytes(); for (var i : b) System.out.print(i + " "); // 输出:97 98 99 100 101
indexOf
作用:返回某个字符串在当前字符串中第一次出现处的下标
格式:public int indexOf(String str)
参数:str - 要搜索的子字符串
结果:返回指定子字符串的首次出现的索引,如果没有这种情况返回 -1
例如:
System.out.println("HelloWorld".indexOf("llo")); // 输出:2 System.out.println("HelloWorld".indexOf("ol")); // 输出:-1
lastIndexOf
作用:返回某个字符串在当前字符串中最后一次出现处的下标
格式:public int lastIndexOf(String str)
参数:str - 要搜索的子字符串
结果:返回指定子字符串的最后一次出现的索引,如果没有这种情况返回 -1
例如:
System.out.println("HelloWorld".lastIndexOf("l")); // 输出:8 System.out.println("HelloWorld".lastIndexOf("ol")); // 输出:-1
replace
作用:将某字符串与目标序列匹配的字符串替换为指定的字符串,替换从字符串开始到结束
格式:public String replace(CharSequence target, CharSequence replacement)
参数:target - 要替换子串 replacement -指定的子符串
结果:生成的替换后的字符串
例如:
String s = "Hello World World".replace("World", "Java"); System.out.println(s); // 输出:Hello Java Java
split
作用:将字符串拆分
格式:public String[] split(String regex)
参数:regex - 分隔正则表达式 (同样可以通过字符串进行拆分,这里先用字符串作为案例)
结果:拆分后字符串存入的数组
例如:
String[] s = "year:2021-month:09-day:15-time:23:30".split("-"); // 以字符串"-"进行拆分; for (var i : s) System.out.println(i); /* 输出: year:2021 month:09 day:15 time:23:30 */
substring(一个参数)
作用:返回一个字符串,该字符串是此字符串的子串; 子字符串以指定索引beginIndex的字符开始,并扩展到此字符串的末尾;
格式:public String substring(int beginIndex)
参数:beginIndex - 包含起始索引
结果:截取后的子字符串
例如:
String s = "Today is a good day!"; System.out.println(s.substring(9)); // 输出:a good day!
substring(两个参数)
作用:返回一个字符串,该字符串是此字符串的子串;子串从指定的beginIndex开始,并扩展到索引号为endIndex - 1的字符 ;
格式:public String substring(int beginIndex, int endIndex)
参数:beginIndex - 开始索引(包括) endIndex - 结束索引(不包括) // 左闭右开
结果:截取后的子字符串
例如:
String s = "Today is a good day!"; System.out.println(s.substring(9, 15)); // 输出:a good
toCharArray
作用:将字符串转化为一个字符串数组
格式:public char[] toCharArray()
参数:无参数
结果:返回对应字符串的数组
例如:
char[] s = "Today is a good day!".toCharArray(); for (var i : s) System.out.print(i + " "); // 输出:T o d a y i s a g o o d d a y !
toLowerCase
作用:将此String所有字符转换为小写,使用默认语言环境的规则
格式:public String toLowerCase()
参数:无参数
结果:返回转为小写的字符串
例如:
System.out.println("HELLOWORLD".toLowerCase()); // 输出:helloworld
toUpperCase
作用:将此String所有字符转换为大写,使用默认语言环境的规则
格式:public String toUpperCase()
参数:无参数
结果:返回转为大写的字符串
例如:
System.out.println("helloworld".toUpperCase()); // 输出:HELLOWORLD
trim
作用:去除字符串前后空格
格式:public String trim()
参数:无
结果:返回去除空格后的字符串
例如:
System.out.println(" hello world ".trim()); // 输出:hello world
有时候你要使用搜索引擎搜索时,如果前面多打了几个空格,并不影响结果;或者有的账号登录会忽略开始和结束的空格,都会用到这个方法;
valueOf
作用:将任何非字符串转化为字符串
格式:public static String valueOf(一些变量)
参数:参数可以是int,double等基本数据类型,也可以是Object等引用数据类型
结果:返回转化后的字符串
例如:
System.out.println(String.valueOf(1234)); // 1234 System.out.println(String.valueOf(3.14159)); // 3.14159 System.out.println(String.valueOf(true)); // true char[] s = new char[] {'a', 'b', 'c'}; System.out.println(String.valueOf(s)); // abc System.out.println(String.valueOf(new Object())); // java.lang.Object@776ec8df
这里需要说一下,valueOf使用是非常广泛的;我们可以看到最后一个案例,输出一个对象:new Object(),
结果是它的地址以及位置信息等,是不是和 toString() 方法特别像?其实当传入vauleOf一个对象时,vauleOf对应的源码里就调用了toString()方法,所以才会输出一样的结果;所以说,如果我们重写了toString方法,就会调用我们重写的toString,输出对应信息;
还有,当我们用 System.out.println()
输出的时候,如果传入的是对象,系统会默认调用toString,这是什么原因?调用println源码可以发现,每一个重载版本的println都会调用valueOf
,所以如果println传入一个对象的话,就会调用valueOf方法,因为valueOf方法中有toString方法,所以就默认调用了toString方法,将对象转化为字符串输出;
刚才说了一点:每一个重载版本的println都会调用valueOf
,当然也包括了基本数据类型,就以boolean例,看看它的源码;
可以看到boolean的println会调用 valueOf 的,其实其他基本数据类型也差不多,传入println后都会调用 valueOf ,所以可以得出结论:println输出的总是一个字符串;
StringBuffer/StringBuilder常用方法
一些总结:
- StringBuffer/StringBuilder可以看做可变长度字符串。
- StringBuffer/StringBuilder初始化容量16.
- StringBuffer是线程安全的。StringBuilder是非线程安全的。
- 频繁进行字符串拼接不建议使用“+”,对运行效率有影响;
下面就以StringBuffer为例,StringBuilder也是一样;
StringBuffer类构造方法
- StringBuffer()
- StringBuffer(int capacity指定初始化容量)
- StringBuffer(CharSequence seq)
- StringBuffer(String str)
StringBuffer常用方法:
append
作用:将传入的数据追加在字符串后面
格式:public StringBuffer append(可以是int,char,String等)
参数:int,char,String等
结果:组合后形成的新的字符串
capacity
作用:返回当前容量
格式:public int capacity()
参数:无
结果:当前字符串的容量(和长度length()不同)
delete
作用:删除字符串从 start 起始索引到 end-1 终止索引间的字符串;
格式:public StringBuffer delete(int start,int end)
参数:start - 开始索引 end - 结束索引(左闭右开)
结果:删除后的字符串
insert
作用:在字符串序列中插入对应数据
格式:public StringBuffer insert(一些参数)
参数:一般第一个参数是插入位置int ,第二个是插入内容:可以是char[],String,还有基本数据类型等;
结果:插入后的字符串
replace
作用:替换指定位置的指定字符串
格式:public StringBuffer replace(int start, int end,String str)
参数:start - 开始索引 end - 结束索引 (左闭右开)str - 将替换的字符串。
结果:替换后的新的字符串
总结
这里只是简单介绍了一下String类 、StringBuffer类和StringBuilder类,对它们的常用方法也是有了一个简单的介绍,但是这也是很少的一部分,只是混个眼熟;所以实际开发过程中要会用JDK API帮助文档,因为Java所有的方法和类你不可能全部都记住或者见过,所以一定要会用工具;
对于一些方法很简单,可能会觉得没有必要,但是既然有这个方法,那么肯定是有存在意义的;在实际开发中,这些方法不仅能提高你代码的可读性,还会减少你的代码量,所以都要有了解;
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!