05.【Java】字符串(String与StringBuffer)
一、String类
1、字符串的特点
字符串是常量,创建后不会被修改
字符串可以显示任意文字的信息
在Java中,单引号扩起来的叫做字符,双引号扩起来的叫做字符串
2、声明字符串
字符串是常量,他可以显示任何形式的文字信息,字符串在创建之后就不能修改,在Java单引号中的内容表示字符,双引号中的内容则表示字符串。
“我是字符串”,“12345678”,“世界真美好 我想出去走走”
- 需要用java.lang.String这个类来创建可以保存字符串的变量。所以字符串变量是一个对象。
声明一个字符串变量a与声明两个字符串变量的方法
String a;
String a,b;
⚠️注意:在不给字符串变量赋值的情况下,其默认值为null,如果此时调用String的方法,则会发生空指针异常。
3、创建字符串
(1)引用字符串常量
直接使用赋值运算符将常量赋值给String类型变量
String a = "You are beautiful!";
String b = "You are so cute!",c = "You are clever!";
String str1,str2;
str1 = "We are students";
str2 = "We are students";
⚠️注意:当两个字符串对象引用想用的常量,就会具有相同的实体,在内存中的地址就是一致的。
(2)利用构造方法实例化
利用new关键字创建String对象:
String a = new String("You are beautiful!");
String b = new String(a);
(3)利用字符数组实例化
定义一个字符(char)数组,使用该字符数组创建一个字符串:
char[] charArray = {"t","i","m","e"};
String a = new String(charArray);
(4)提取字符串数组中的一部分创建字符串对象
定义一个字符数组,提取字符数组中的元素创建一个字符串:
char[] charArray = {"t","i","m","e","-","d","a","y"};
String a = new String(charArray,0,4); //从数组索引为0的位置开始提取4个字符,创建一个新的字符串
实例1:为字符串赋值
创建CreateString类,声明多个字符串变量,用不用的复制方法给这些字符串变量赋值并输出。
//import java.util.String;
public class CreateString {public static void main(String[] args) {// TODO Auto-generated method stub/*声明String类型,需要通java.util.String进行*/// 通过引用字符串常量创建字符串String a,b;a = "锄禾日当午";b = "汗滴禾下土";// 利用构造方法实例化String str1 = new String("谁知盘中餐");//利用字符数组实例化char charArray [] = {'粒','粒','皆','辛','苦'};String arrstr1 = new String(charArray);//提取字符数组中的一部分创建字符串对象String arrstr2 = new String(charArray,3,2);System.out.println("a ="+a);System.out.println("b ="+b);System.out.println("str1 ="+str1);System.out.println("arrstr1 ="+arrstr1);System.out.println("arrstr2 ="+arrstr2); }
}
Console:
a =锄禾日当午
b =汗滴禾下土
str1 =谁知盘中餐
arrstr1 =粒粒皆辛苦
arrstr2 =辛苦
二、字符串的属性和方法
对已经声明的字符串,可以对其进行相应的操作。包括进行字符串的连接、获取字符串的索引位置、截取部分字符、字符串比较、大小写转换、去除空白等操作。
1、字符串的常用方法
(1)获取字符串长度
str.length()
方法是返回字符串中字符的数量。并且返回的结果是包括字符串中空格长度的结果。
str.length();
例如,定义一个字符串num。使用length()
方法获取其长度:
String num = "12345 67890";
int size = num.length();
11
⚠️注意:数组length属性和和字符串的length()
方法虽然都是获取长度的,但是一个有括号一个没有括号,在编程当中,有括号调用的被称为方法,无括号被引用的是属性。
(2)字符串连接
连接字符串是比较简单的一种操作字符串的方法。连接字符串时,既可以实现多个字符串的串联,也可以实现字符串和其他数据类型的变量或者常量的连接。
1)串联符号实现字符串串连
Java中相连的字符串不可以直接分成两行:
System.out.println("I likeJava");
如果字符串很长需要换行编辑,我们可以用“+”号将两行字符串连接起来,在加号处换行就不会有问题了。
System.out.println("I like"+"Java");
2)concat()方法实现字符串串联
我们除了可以使用符号“+”对字符串串联,我们还可以使用String自带的concat()
方法来实现将新字符串串联到原字符串结尾的功能。
a.concat(str);
- a:原字符串;
- str:需要连接的新字符串
由于字符串是常量,是不能修改的,所以在连接两个字符串之后,原先的字符串不会发生变化,而是在内存中生成一个新的字符串。下图就是字符串修改后内存的变化情况:
实例2:自我介绍
创建StringConcatenation类,使用”+“和”+=“将多个字符串连接成一个字符串,将自我介绍的内容链接成一句话。
public class StringConcatenation {public static void main(String[] args) {// TODO Auto-generated method stubString a = "我会Python编程语言";String b = "我会Java编程语言";String c = a+","+b;String d = "下面是我会的编程语言:";d += c;System.out.println("a = "+a);System.out.println("b = "+b);System.out.println("c = "+c);System.out.println("d = "+d);// String自带的concat方法可以实现字符串的串联System.out.println(d.concat(c));}}
Console:
a = 我会Python编程语言
b = 我会Java编程语言
c = 我会Python编程语言,我会Java编程语言
d = 下面是我会的编程语言:我会Python编程语言,我会Java编程语言
下面是我会的编程语言:我会Python编程语言,我会Java编程语言我会Python编程语言,我会Java编程语言
3)字符串与其他数据类型连接
字符串可以与其他数据类型进行连接,如果将其他数据类型与字符串连接,其他数据类型会被直接转换成字符串,然后实现字符串的串联。
实例3:将字符串与数组连接
创建Link类,在主方法中创建数值型变量,输出把字符串与整型、浮点型变量相连的结果。
public class Link {public static void main(String[] args) {// TODO Auto-generated method stubint booktime = 4;float practice = 2.5f;System.out.println("Everyday,I coat " + booktime +" hours read and "+(practice+booktime)+" hour practice java.");}}
Console:
Everyday,I coat 4 hours read and 6.5 hour practice java.
上述例子,实现的是字符串与整型变量和浮点型变量的连接过程与结果。因为booktime和practice都不是字符串,索引在连接时会使程序自发调用同 toString()方法,将其他数据类型转换成字符串,再进行连接。
⚠️注意:在没有括号的情况下,运算符“+”会自动将非字符串类型的变量或者常量转换成字符串,所有在字符串连接中间进行其他数值运算,需要注意运算符的优先级。例如:
System.out.println("Everyday,I coat " + booktime +" hours read and "+practice+booktime+" hour practice java.");}
Everyday,I coat 4 hours read and 2.54 hour practice java.
因为没有圆括号,就没有办法优先执行practice+booktime
而是直接将practice转换成字符串与前面的字符串串联,再将booktime也转换成字符串与前面串联好的字符串进一步串联。因此在进行字符串与其他数据类型的连接时,需要注意运算的优先级,以免在不报错的情况下出现意料之外的结果。
(3)获取指定位置的字符
cahrAt(index)
方法用来获取指定作引的字符:
str.cahrAt(index);
- str:任意字符串对象
- index:char值的索引
实例4:找出字符串中索引位置是4的字符
创建ChatAtTest类,找出古诗中前两句索引位置为4的字符。
public class ChatAtTest {public static void main(String[] args) {// TODO Auto-generated method stubString str1 = "床前明月光,疑是地上霜";char chr1 = str1.charAt(4);System.out.print(chr1); }}
Console:
光
(4)获取字符串索引位置
indexOf
方法返回的是搜索的字符或者字符串在字符串中首次出现的位置索引值,如果没有检索要指定的字符或者字符串,就会返回-1。
str.indexOf(substr);
- str:任意字符串
- substr:指定要查找的字符或者字符串。
String str = "We are students!";
int size - str.indexOf("e");
Console:
1
Java中,String对象是用数组表示的,字符串的下标是0~length()-1。字符“e”所在的位置如图所示:
在日常的开发中,经常会遇到判断一个字符串是否包含某个字符或者字符串的情况,这时候就可以用到indexOf
方法。
实例5:判断字符串中是否有中文逗号
创建StringIndexOf类,判断字符串"明月几时有,把酒问青天"中是否存在中文逗号。
public class StringIndexOf {public static void main(String[] args) {// TODO Auto-generated method stub//indexOf返回的是搜索的字符或者字符串在字符串中首次出现的索引位置,如果没有检索到要查找的字符或字符串,则返回-1//格式:str.indexOf(substr);String str1 = "明月几时有,把酒问青天";int charIndex = str1.indexOf(",");if (charIndex != -1) {System.out.println("此字符串中存在中文逗号,他的索引是:"+charIndex);}else {System.out.println("此字符串中不存在中文逗号");} }
}
Console:
此字符串中存在中文逗号,他的索引是:5
(5)判断字符串首尾内容
stratsWith()
和 endsWith()
是判断字符串首尾是否以指定字符开始或结束的方法。这两个方法的返回值都是boolean类型。
stratsWith(prefix)方法
判断字符串收否以指定前缀开始:
str.stratsWith(prefix);
endsWith(subfix)方法
判断字符串收否以指定后缀结束:
str.endsWith(subfix);
- str:任意字符串
- prefix:指定的前缀字符/字符串
- subfix:指定的后缀字符/字符串
实例6:统计某一品牌电器种类总数
创建StringStartsWith类,类中有一个记录各种品牌家用电器的数组,遍历此数组,统计海尔品牌的家用电器一共有多少种。
public class StringStartsWith {public static void main(String[] args) {// TODO Auto-generated method stub//startsWith()方法和endsWith()分贝是用于判断字符串首位内容的方法。//格式如下:str.startWith(prefix);str.endtWith(subfix);//统计某一品牌电器的种类数量String appliances[] = {"美的电磁炉","海尔冰箱","格力空调","西门子洗衣机","小米手机","海尔点热水器","海信电视","格力手机"};int sum = 0;for (int i = 0;i<appliances.length;i++) {String name = appliances[i];if (name.startsWith("海尔")) {sum++; }}System.out.println("海尔品牌电器一共有:"+sum+"种!");}}
Console:
海尔品牌电器一共有:2种!
实例7:查找限号车牌
创建 StringEndsWith类,将一组车牌号存在一个数组中,当查找数组中尾号为“4”的车牌号并输出。
import java.util.Arrays;public class StringEndsWith {public static void main(String[] args) {// TODO Auto-generated method stubString licensePlates[] = {"XX56841","XX48969","XX04103","XX69310","XX97211","XX53184","XX30014","XX79842" };String number[] = {"4","1"};System.out.println("今日限号"+Arrays.toString(number)+",限制出行的车牌号有:");for (int i = 0 ; i < licensePlates.length;i++) {for (String j:number) {if (licensePlates[i].endsWith(j)) {System.out.println(licensePlates[i]+" ");} }} }
}
Console:
今日限号[4, 1],限制出行的车牌号有:
XX56841
XX97211
XX53184
XX30014
(6)获取字符数组
toCharArray()
方法可以将字符串转换成一个字符数组:
str.toCharArray();
实例8:提取字符串中的每一个字符
创建StringtoArray类,将一个字符串转换成字符数组,并按照数组中元素的索引输出数组中的每个元素。
public class StringtoArray {public static void main(String[] args) {// TODO Auto-generated method stub//将一个字符串转为一个字符数组方法如下:str.toCharArray();String str1 = "这是一个字符串";char ch1 [] = str1.toCharArray();for (int i=0 ;i < ch1.length; i++) {System.out.println("字符数组第"+i+"个元素为:"+ch1[i]);}}}
Console:
字符数组第2个元素为:一
字符数组第3个元素为:个
字符数组第4个元素为:字
字符数组第5个元素为:符
字符数组第6个元素为:串
(7)判断字符串是否存在
contains(string)
方法可以判断字符串中是否包含指定的内容:
str.contains(string);
- str:任意字符串
- String:指定字符
实例9:在菜谱中查找某一道菜
创建StringContains类,首先把菜谱中的菜品赋值给一个字符串,菜品与菜品之间用“,”隔开,然后用contains()
方法来查看菜谱中是否有顾客想点的菜品。
import java.util.Scanner;
public class StringContains {public static void main(String[] args) {// TODO Auto-generated method stub//判断字符串是否存在方法:str.contains(string;String str1 = "今天的菜谱是:蒸羔羊,蒸熊掌,蒸鹿尾,烧花鹅,烧雏鸡,烧仔鸭"+"卤煮咸鸭,酱鸡,凉拌黄瓜,腊肉,松花小肚";System.out.println(str1);int sum = 0;System.out.println("请点菜:");
Loop: for(int i = 0;i <10;i++) {Scanner sc = new Scanner(System.in); //sc.close()未关闭,但是应该在哪里关闭呢?String OrderFood_i = sc.nextLine();if (str1.contains(OrderFood_i)) {System.out.println("第"+(i+1)+"道菜点菜成功,菜名是:"+OrderFood_i);sum +=1;}else {System.out.println("第"+(i+1)+"道菜点菜不成功,菜单中无此菜品!");}if(sum == 5) {System.out.println("点菜结束,您已成功点了"+sum+"道菜");break Loop;}//sc.close(); //位置有问题,执行报错,但是不关闭会警告}}
}
Console:
今天的菜谱是:蒸羔羊,蒸熊掌,蒸鹿尾,烧花鹅,烧雏鸡,烧仔鸭卤煮咸鸭,酱鸡,凉拌黄瓜,腊肉,松花小肚
请点菜:
烧鸡
第1道菜点菜不成功,菜单中无此菜品!
蒸羔羊
第2道菜点菜成功,菜名是:蒸羔羊
蒸熊掌
第3道菜点菜成功,菜名是:蒸熊掌
松花小肚
第4道菜点菜成功,菜名是:松花小肚
腊肉
第5道菜点菜成功,菜名是:腊肉
烧雏鸡
第6道菜点菜成功,菜名是:烧雏鸡
点菜结束,您已成功点了5道菜
2、字符串的操作
(1)截取字符串
substring()
方法返回的是一个新字符串,它是原字符串的一个字符或者字符串片段,该片段是从原字符串指定的beginIndex字符开始,到endIndex字符结束:
str.substring(beginIndex,endIndex);
- str:原字符串
- beginIndex:需要截取的字符串的开始字符的索引值
- endIndex:需要截取的字符串的结束字符的索引值
实例10:截取身份证号中的生日日期
创建IDCard类,用字符串记录一个身份证号,截取并输出身份证号中的出生年月。
public class IDCard {public static void main(String[] args) {// TODO Auto-generated method stub//字符串操作:截取字符串//str.substring(beginIndex);str.substring(beginIndex,endIndex);String idNum = "609881199301224646";String year = idNum.substring(6,10);String month = idNum.substring(10,12);String day = idNum.substring(12,14);char chr1 = idNum.charAt(14);if (chr1 % 2 == 0) {String sex = "女生";System.out.print("出生年与是:"+year+"年"+month+"月"+day+"日的"+sex);}else {String sex = "男生";System.out.print("出生年与是:"+year+"年"+month+"月"+day+"日的"+sex);}}
}
Console:
出生年与是:1993年01月22日的女生
(2)字符串转换
replace()
方法可以实现将指定字符序列替换成新的字符序列,返回值是替换完毕之后的字符串结果:
str.replace(oldstr,newstr);
- str:原字符串
- oldstr:需要被替换的字符串
- newstr:用来替换的字符串
⚠️注意:replace()
方法返回的是一个新的字符串。如果原字符串str中没有找到需要被替换的字符oldstr,将会返回原字符串。
实例11:替换字符串中的错别字
创建StringReplace类,将字符串"登陆功能介绍:请用户输入用户名和密码之后,单击登陆按钮即可完成登陆操作";中“登陆”的替换成“登录”。
public class StringReplace {public static void main(String[] args) {// TODO Auto-generated method stub//替换字符串中的错别字String str1 = "登陆功能介绍:请用户输入用户名和密码之后,单击登陆按钮即可完成登陆操作";String restr = str1.replace("陆", "录");System.out.println("【更改前】"+str1);System.out.println("【更改后】"+restr);}}
Console:
【更改前】登陆功能介绍:请用户输入用户名和密码之后,单击登陆按钮即可完成登陆操作
【更改后】登录功能介绍:请用户输入用户名和密码之后,单击登录按钮即可完成登录操作
⚠️注意:
- 如果需要被替换的字符串在原字符串str中多次出现,
replace()
方法将会把所有的oldstr都替换成newstr:
String str = "We are Students!";
String str2 = str.replace("e","-")
Console:
W- ar- Stud-nts!
- oldstr的大小写需要与原str保持一致,否则不能成功替换,比如:
String str = "We will win!";
String str2 = str.replace("w","-");
Console:
We -ill -in!
(3)字符串分割
split()
方法可以根据给定的分隔符对字符串进行拆分,支持正则表达式,最后返回的是一个字符串数组:
ste.split(regex);
- str:原字符串
- regex:指定的分隔符
实例12:将菜谱中的菜品放在一个数组中
创建StringSplit类,首先将菜谱中的菜品复制给一个字符串,菜品与菜品之间用“,”隔开,然后用“,”将菜谱分割成若干个菜品,并把分割出来的菜品保存在一个字符串类型的数组中,最后输出数组中的菜品:
public class StringSplit {public static void main(String[] args) {// TODO Auto-generated method stub//字符串分割String str1 = "今天的菜谱是:蒸糕羊,蒸熊掌,蒸鹿尾,烧花鹅,烧雏鸡,烧仔鸭"+"卤煮咸鸭,酱鸡,凉拌黄瓜,腊肉,松花小肚";String denal [] = str1.split(",");for(int i = 0;i<denal.length;i++) {System.out.println("索引"+(i+1)+"的菜品是:"+denal[i]);}}}
Console:
索引1的菜品是:今天的菜谱是:蒸糕羊
索引2的菜品是:蒸熊掌
索引3的菜品是:蒸鹿尾
索引4的菜品是:烧花鹅
索引5的菜品是:烧雏鸡
索引6的菜品是:烧仔鸭卤煮咸鸭,酱鸡
索引7的菜品是:凉拌黄瓜
索引8的菜品是:腊肉
索引9的菜品是:松花小肚
(4)小写转换
toLowerCase()
方法实现将字符串所有字符转换为小写,如果没有需要转换的字符,则返回原字符串,否则将返回一个新的字符串,并将原字符串中每个应该进行小写转换的字符都转换成等价的小写字符,新生成的字符串和原字符串长度一致:
str.toLowerCase();
(5)大写转换
toupperCase()
方法实现将字符串所有字符转换为大写,如果没有需要转换的字符,则返回原字符串,否则将返回一个新的字符串,并将原字符串中每个应该进行大写转换的字符都转换成等价的大写字符,新生成的字符串和原字符串长度一致:
str.toupperCase();
实例13:输出字符串的大小写格式
创建StringTransform类,将字符串"abc DEF"
分别用全大写和全小写两种格式输出。
public class StringTransform {public static void main(String[] args) {// TODO Auto-generated method stub//大小写转换str.toLowerCase();str.toUpperCase();String str1 = "abc DEF";System.out.println(str1.toUpperCase());System.out.println(str1.toLowerCase());}}
Console:
ABC DEF
abc def
(6)去除空白内容
trim()
方法返回的是将原字符串首尾处空白删除后的字符串,生成的是一个新的字符串:
str.trim();
实例14:去掉字符串两边的空白内容
创建StringTrim类,使用trim()
方法去掉字符串首尾处的空白内容。
public class StringTrim {public static void main(String[] args) {// TODO Auto-generated method stub//去掉空白str.trim();String str1 = " abc ";String shortStr = str1.trim();System.out.println(shortStr);}}
Console:
abc
(7)比较字符串是否相等
equals()
方法是比较两个字符串内容是否相等的方法,当且仅当进行比较的字符串不为null时,并且与被比较的字符串的内容相同时,结果才为true:
str1.equals(str2);
str1:原字符串
Str2:用来与原字符串进行比较的字符串
实例15:比较字符串的内容是否相同
创建StringEquals类,创建四个不同的字符串对象,分别用“==”和equals()
方法来查看这些字符串的比较结果。
public class StringEquals {public static void main(String[] args) {// TODO Auto-generated method stubString str1 = "hello";String str2 = new String("hello");String str3 = new String("你好");String str4 = str2;System.out.println("hello==new String(\"hello\")的结果是:"+(str1==str2));System.out.println("hello==new String(\"你好\")的结果是:"+(str1==str3));System.out.println("hello==new String(\"hello\")的结果是:"+(str1==str4));System.out.println("new String(\"hello\")==new String(\"你好\")的结果是:"+(str2==str3));System.out.println("str2 ==str4(str4=str2)的结果是:"+(str2==str4));System.out.println("new String(\"你好\")==new String(\"hello\")的结果是:"+(str3==str4));System.out.println("hello==new String(\"hello\")的结果是:"+(str1.equals(str2)));System.out.println("hello==new String(\"你好\")的结果是:"+(str1.equals(str3)));System.out.println("hello==new String(\"hello\")的结果是:"+(str1.equals(str4)));System.out.println("new String(\"hello\")==new String(\"你好\")的结果是:"+(str2.equals(str3)));System.out.println("str2 ==str4(str4=str2)的结果是:"+(str2.equals(str4)));System.out.println("new String(\"你好\")==new String(\"hello\")的结果是:"+(str3.equals(str4))); }}
Console:
hello==new String("hello")的结果是:false
hello==new String("你好")的结果是:false
hello==new String("hello")的结果是:false
new String("hello")==new String("你好")的结果是:false
str2 ==str4(str4=str2)的结果是:true
new String("你好")==new String("hello")的结果是:false
hello==new String("hello")的结果是:true
hello==new String("你好")的结果是:false
hello==new String("hello")的结果是:true
new String("hello")==new String("你好")的结果是:false
str2 ==str4(str4=str2)的结果是:true
new String("你好")==new String("hello")的结果是:false
四、可变字符串
StringBuffer类是线程安全的可变字符序列,一个类似于String类的字符串缓冲区,两者本质上是一样的,但是StringBuffer类的执行效率要比String类快很多。String类创建的字符串是不可修改的对象,但是StringBuffer类创建的字符串是可以被修改的,并且实体容量会随着存放的字符串长度的增加自动增加。
1、创建StringBuffer类对象
创建可变的字符串对象必须要使用关键字new,不能像String对象那样直接引用字符串常量。
StringBuffer sbf=new StringBuffer(); //创建一个可变字符串对象,无初始值
StringBuffer sbf=new StringBuffer("abc"); //创建的可变字符串初始值为“abc”
StringBuffer sbf=new StringBuffer(32); //创建的可变字符串容量为32
2、StringBuffer类的特有的方法
(1)字符串的拼接
append()
方法可以将参数转换成字符串,然后追加到原字符串序列中:
sbf.append(obj);
- sbf:原可变字符串对象
- obj:任意数据类型对象,例如String、int、double、Boolean等,都将被转换成字符串后拼接在sbf后。
实例16:为字符串追加不同类型的文字内容
创建StringBufferAppend类,在类中创建一个S让他日能给Buffer对象,使用append()
方法分别来追加字符常量、其他StringBuffer对象和整型变量,输出最后拼接的结果。
public class StringBufferAppend {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer sbf1 = new StringBuffer("门前大桥下游过一群鸭,");sbf1.append("快来快来数一数!");StringBuffer sbf2 = new StringBuffer("2467");sbf1.append(sbf2);int x =8 ;sbf1.append(x);System.out.println(sbf1);}}
Console:
门前大桥下游过一群鸭,快来快来数一数!24678
(2)将给定索引处的字符串修改为其他指定内容
setCharAt()
是将给定索引处的字符修改成ch:
sbf.setCharAt(index,ch);
- sbf:原可变字符串对象
- index:被替换字符的索引
- ch:用来替换的字符。
实例17:替换手机号中间的四位为“XXXX”
创建StringBufferSetChartAt类,创建一个StringBuffer对象记录一个手机号,将索引3~6的字符修改成“X“。
public class StringBufferSetChartAt {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer phoneNumb = new StringBuffer("13161676665");for(int i =3;i<=6;i++) {phoneNumb.setCharAt(i,'X'); //要用单引号引用ch}System.out.println(phoneNumb);}}
Console:
131XXXX6665
(3)将给定的str插入到指定的索引位置
insert()
方法是将字符串str插入到指定索引offset位置上:
sbf.insert(offset,str);
- sbf:原可变字符串对象
- offset:插入位置的索引值
- str:插入的字符串对象
实例18:模拟VIP插队排号
创建StringBufferInsert类,在类中创建StringBuffer对象,在索引为12的位置插入字符串"01号VIP客户请到窗口受理,"。
public class StringBufferInsert {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer sbf1 = new StringBuffer();sbf1.append("057客户请到窗口受理,");sbf1.append("058客户请到窗口受理,");sbf1.append("059客户请到窗口受理");System.out.println("字符串原值:"+sbf1);sbf1.insert(12, "01号VIP客户请到窗口受理,");System.out.println("插入VIP后:"+sbf1);}}
Console:
字符串原值:057客户请到窗口受理,058客户请到窗口受理,059客户请到窗口受理
插入VIP后:057客户请到窗口受理,01号VIP客户请到窗口受理,058客户请到窗口受理,059客户请到窗口受理
(4)移除指定索引的字符串
delate()
方法可以移除字符串中的指定索引位置的字符,该字符串是指移除从索引start位置开始到索引end-1为止的字符串,如果end-1超出最大索引范围,则一直到原字符串的结束字符为止。如果start与end相同吗,则不发生任何修改:
sbf.delate(start,end);
- sbf:原可变字符串对象
- start:需要移除字符片段开头字符在原字符串中的索引位置
- end:需要移除字符片段结束字符在原字符串中的索引位置+1
实例19:删除错误内容
创建StringBufferDelate类,使用StringBuffer的delate()方法将错误内容删掉。
public class StringBufferDelate {public static void main(String[] args) {// TODO Auto-generated method stubString sbf1 = "01号VIP客户请到窗口受理";StringBuffer sbf2 = new StringBuffer(sbf1);System.out.println("原值为:"+sbf1);sbf2.delete(3,6); //删除索引3-5(前包含后不包含)的元素,一共删掉三个元素System.out.println("删除后:"+sbf2);}}
Console:
原值为:01号VIP客户请到窗口受理
删除后:01号客户请到窗口受理
3、StringBuffer类和String相同的方法
(1)获取字符串序列长度
sbf.length();
(2)获取指定索引位置的值
sbf.cahrAt(index);
(3)获取指定值的索引位置
sbf.indexOf(substr);
(4)字符串截取
sbf.substring(startIndex,endIndex);
(5)字符串替换
sbf.replace(oldstr,newstr);
实例20:StringBuffer类中与String类相同方法的使用
创建StringBufferTest类,调用StringBuffer类中类型String类的方法。
public class StringBufferTest {public static void main(String[] args) {// TODO Auto-generated method stubStringBuffer sbf1 = new StringBuffer("ABCDEFGHIJK");System.out.println("原值为:"+sbf1);int len = sbf1.length();char chr = sbf1.charAt(3);int idx = sbf1.indexOf("E");String substr = sbf1.substring(3,6);StringBuffer temp = sbf1.replace(5, 7, "mmd");System.out.println("len:"+len);System.out.println("chr:"+chr);System.out.println("idx:"+idx);System.out.println("substr:"+substr);System.out.println("temp:"+temp);}}
Console:
原值为:ABCDEFGHIJK
len:11
chr:D
idx:4
substr:DEF
temp:ABCDEmmdHIJK
五、总结
- 字符串是常量,String类声明的变量是String对象。字符串是真正的常量,而String对象只是一个保存字符串内容的变量,字符串变量有类对象所有的共有的特点。
- String只能赋值一次,每次内容发生改变都会生成一个新的对象,都会在内存生成一个新对象,而每一次产生新对象都会对系统性能产生影响,降低Java虚拟机的工作效率。
- StringBuffer类创建的字符串对象每次操作是针对原对象本身,不会生成新的对象,对象随着自身变化,内存空间会自动扩充,做大量的修改操作时,不会因为生成大量新的匿名对象而影响系统性能。
- 字符串的重要知识点:
05.【Java】字符串(String与StringBuffer)相关推荐
- Java中String、StringBuffer、StringBuilder的区别
Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- Java 集合 --- String, StringBuilder, StringBuffer
Java 集合 --- String, StringBuilder, StringBuffer String String的声明方式 String的不可变性 对比两个String StringBuil ...
- Java中String,StringBuffer都是final类
Java中String和StringBuffer同时final类,它们的区别在哪里 ? final 表示这个类不能再被继承.String不可变是说String中用一个final 的char数组priv ...
- java中拼接和 的区别_浅析Java中String与StringBuffer拼接的区别
学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: S ...
- java可变字符串替换字符,我们如何替换Java中String和StringBuffer的特定部分?
java.lang包的String类表示一组字符.Java程序中的所有字符串文字(例如" abc")都实现为此类的实例. 例public class StringExample { ...
- Java 之String、StringBuffer 和 StringBuilder 三者区别介绍
String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...
- JAVA中String与StringBuffer的区别
String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...
- Java之String、StringBuffer、StringBulider辨识
1.总引: 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类. 和 String 类不同的是,StringBuffer 和 StringBuilder ...
- java基础----String、StringBuffer、StringBuilder
1.String package com.henu;public class Demo05 {public static void main(String[] args) {/** 字符串是常量:它们 ...
最新文章
- ASP.NET把DataTable转成XML文件的函数
- Java文件路径(getResource)
- Latex的subcaption横向插入两张子图的的用法
- Pentium 4处理器架构/微架构/流水线 (9) - NetBurst执行核详解 - 执行单元与发射口
- [Melodymood][流行经典]Take Me to your heart 《吻别》英文版
- Struts1.2+Spring2.5+Hibernate3.2框架搭建(十三)
- SQL Server 2005 允许远程连接解配置
- 多线程之线程可见性synchronized
- 安装loadrunner,缺少VC2005_sp1_with_atl的错
- iphone 6s 越狱
- Word2016怎么制作目录
- Helio P10 (MT6755)
- PHP-深入理解Opcode
- Soul(灵魂)匹配脚本、autojs、按键精灵~
- try-resources
- centos7.6安装Funwave-TVD 3.3全过程
- 2017年第3届上海国际零售业设计与设备展会刊(参展商名录)
- 尚硅谷笔记——React组件的三大属性props、state、ref
- Quartz自动任务
- IT公益风潮已来,中国信息技术公益联盟成立