目录
第五章字符串
5.1声明字符串
在 Java 基本数据类型一节中,我们已经知道 Java 中的数据类型:一个是基本数据类型,另一个是引用数据类型。字符串(String)便属于引用数据类型。字符串在 Java 程序中无处不在,其实我们在第一个 Java 程序中就已经使用过了字符串。
5.1.2创建字符串用
字符串变量赋值并输出
package f;
public class a {
public static void main(String[] args) {
String a="时间就是金钱,我的朋友。";//直接引用字符串常量
System.out.println("a="+a);//输出a的值
String b=new String("我爱清汤小肥羊");//利用构造方法实例化
String c=new String(b);//使用已用字符串变量实例化
System.out.println("b="+b);//输出b的值
System.out.println("c="+c);//输出c的值
char[] charArray= {'t','i','m','e'};//遍历数组
String d=new String(charArray);//利用字符串组实例化
System.out.println("d="+d);//输出d的值
char[] charArray2= {'时','间','就','是','金','钱'};//遍历数组
String e=new String(charArray2,4,2);//提取字符串数组部分内容
System.out.println("e="+e);//输出e的值
}
}
5.2 连接字符串
package f; public class b { public static void main(String[] args) { String a="abc";//创建字符串 String b="123";//创建字符串 String c=a+b+"!";//创建字符串 String d="拼接字符串";//创建字符串 d+=c;//给d的赋值 System.out.println("a="+a);//输出语句 System.out.println("b="+b);//输出语句 System.out.println("c="+c);//输出语句 System.out.println("d="+d);//输出语句 } }
5.2.2 连接其他数据类型
package f;
public class c {
public static void main(String[] args) {
int booktime=4;//定义int型booktime为4
float practice=2.5f;//定义float型practice为2.5f
System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");//输出语句
}
}
5.3 提取字符串信息
package f;
public class d {
public static void main(String[] args) {
String str="床前明月光,疑是地上霜";//创建字符串
char chr=str.charAt(4);//将字符串str中索引位置为4的字符赋值给chr
System.out.println("字符串中索引位置为4的字符是:"+chr);//输出语句chr
}
}
5.3.3 获取子字符串索引位置
package f;
public class e {
public static void main(String[] args) {
String str="12345abcde";//创建字符串
int charIndex=str.indexOf("abc");//获取字符串str中"abc"首次出现的索引,赋给charIndex
if (charIndex !=-1) {//判断index的值不等于-1
System.out.println("str中存在abc字符串");//输出语句
}
else {
System.out.println("str中没有abc字符串");//输出语句
}
}
}
查找字符串
package f;
public class f6 {
public static void main(String[] args) {
String str="We are the world";//创建字符串
int firstIndex=str.indexOf("r");//获取字符串中"r"第一次出现的位置
int secondIndex=str.indexOf("r",firstIndex+1);//从第一次出现的索引位置之后开始查找
int thirdIndex=str.indexOf("r",secondIndex+1);//从第二次出现的索引位置之后开始查找
System.out.println("r第一次出现的索引位置是:"+firstIndex);//输出语句
System.out.println("r第二次出现的索引位置是:"+secondIndex);//输出语句
System.out.println("r第三次出现的索引位置是:"+thirdIndex);//输出语句
}
}
查找字符串go最后出现的位置
package f;
public class h {
public static void main(String[] args) {
String str="Let it go!Let it go!";//创建字符串
int gIndex=str.lastIndexOf("g");//返回"g"最后一次出现的位置
int goIndex=str.lastIndexOf("go");//返回"go"最后一次出现的位置
int oIndex=str.lastIndexOf("o");//返回"o"最后一次出现的位置
System.out.println("字符串\"Let it go!Let it go!\"中:\n");//输出语句
System.out.println("\"g\"最后一次出现的位置是:"+gIndex);//输出语句
System.out.println("\"o\"最后一次出现的位置是:"+oIndex);//输出语句
System.out.println("\"go\"最后一次出现的位置是:"+goIndex);//输出语句
}
}
查找字符串a出现的位置
package f;
public class f {
public static void main(String[] args) {
String str="01a3a56a89";//创建字符串
int lastIndex=str.lastIndexOf("a");//获取字母a最后一次出现的索引位置
int fiveBeforeIndex=str.lastIndexOf("a",5);//满足条件的结果集中,返回最大的数字
int threeBeforeIndex=str.lastIndexOf("a",3);//满足条件的结果集中,返回最大的数字
System.out.println("字符串\"01a3a56a89\"中:\n");//输出语句
System.out.println("字母\"a\"最后一次出现的位置是:"+lastIndex);//输出语句
System.out.println("从索引位置5开始往回搜索,字母\"a\"最后一次出现的位置:"+fiveBeforeIndex);//输出语句
System.out.println("从索引位置3开始往回搜索,字母\"a\"最后一次出现的位置:"+threeBeforeIndex);//输出语句
}
}
package f;
public class i {
public static void main(String[] args) {
String myDream1="我有一个梦想,幽谷上升,高山下降;";//创建字符串
String myDream2="坎坷曲折之路成坦途,圣光披露,满照人间。";//创建字符串
System.out.println(myDream1+myDream2+"\n\t\t-马丁.路德金《我有一个梦想》\n");//输出语句
boolean firstBool=myDream1.startsWith("我有一个梦想");//判断是否是前缀
boolean secondBool=myDream2.startsWith("我有一个梦想");//判断是否是前缀
if(firstBool) {
System.out.println("前半句是以\"我有一个梦想\"开始的。");//输出语句
}else if(secondBool) {
System.out.println("后半句是以\"我有一个梦想\"开始的。");//输出语句
}else {
System.out.println("没有以\"我有一个梦想\"开始的。");//输出语句
}
}
}
查询五言绝句第二行是否以”举“开头
package f;
public class f10 {
public static void main(String[] args) {
String str="床前明月光,疑是地上霜。\n举头望明月,低头思故乡。";//创建字符串
System.out.println("《静夜思》\n"+str+"\n");//输出古诗
int enterIndex=str.indexOf("\n");//返回换行符所在的位置
boolean flag=str.startsWith("举",enterIndex+1);//换行符在字符串中只占一个字符所有加1
if(flag) {
System.out.println("第二行是以\"举\"开始的");//如果为真输出此举
}else {
System.out.println("第二行是以\""+str.charAt(enterIndex+1)+"\"开始的");//反之输出此句
}
}
}
字符串是否以句号结尾
package f;
public class f11 {
public static void main(String[] args) {
String str1="你说完了吗";//创建字符串
String str2="我说完了。";//创建字符串
boolean flag1=str1.endsWith("。");//判断str1是否以“。”结尾
boolean flag2=str2.endsWith("。");//判断str2是否以“。”结尾
System.out.println("字符串str1是以句号结尾吗?"+flag1);//输出语句
System.out.println("字符串str2是以句号结尾吗?"+flag2);//输出语句
}
}
字符串转换成字符数组
package f;
public class f12 {
public static void main(String[] args) {
String str="这是一个字符串";//创建字符数组
char[] ch=str.toCharArray();//将字符串转换成字符数组
for(int i=0;i<ch.length;i++) {//遍历字符数组
System.out.println("数组第"+i+"个元素为:"+ch[i]);//输出语句
}
}
}
5.3.6 判断子字符串是否存在
获取字符串内容
package f;
public class f13 {
public static void main(String[] args) {
String str="今天的菜单:蒸羊羔,蒸熊掌,蒸鹿尾。烧花鸭,烧雏鸡,烧子鹅,卤煮咸鸭,酱鸡,腊肉,松花小肚。";//创建字符串
System.out.println(str);//输出字符串
boolean requesr1=str.contains("腊肉");//判断是否有“腊肉”的字样
System.out.println("今天有腊肉吗?"+requesr1);//输出语句
boolean request2=str.contains("汉堡");//判断是否有汉堡的字样
System.out.println("今天有汉堡吗?"+request2);//输出语句
}
}
5.4字符串的操作
5.4.1 截取字符串
package f;
public class f14 {
public static void main(String[] args) {
String str="为革命保护视力,眼保健操开始";//创建字符串
String substr= str.substring(8);//从第8位开始截取字符串
System.out.println("字符串str的后半句是:"+substr);//输出语句
}
}
截取指定的字符串
package f;
public class f15 {
public static void main(String[] args) {
String str="闭门造车,出门合辙";//创建字符串
String substr=str.substring(0,4);//输出0到4之间的数
System.out.println("字符串str的前半句是:"+substr);//输出语句
}
}
5.4.2字符串替换
package f;
public class f16 {
public static void main(String[] args) {
String str="明月几时有,把酒问青天";//创建字符串
String restr=str.replace("月","日");//将str中的月换成日
System.out.println("字符串str替换之后的效果:"+restr);//输出语句
}
}
将数字替换成”?“
package f;
public class f17 {
public static void main(String[] args) {
String str="0123456789abc\\d";//创建字符串,前十位数字
String restr=str.replace("\\d","?");//把符号\\d替换成"?"
String restrAll=str.replaceAll("\\d", "?");//使用replaceAll()将符号\\d替换成"?"
System.out.println("字符串str:"+str);//输出语句
System.out.println("使用replace()替换的结果:"+restr);//输出语句
System.out.println("使用replaceAll()替换的结果:"+restrAll);//输出语句
}
}
使用replaceFirst的使用方法
package f;
public class f18 {
public static void main(String[] args) {
String str="8I want to marry you,so I need you!";//创建字符串
String noNumber=str.replaceFirst("\\d","");//将开头的数字替换成两个双引号
String youToHer=noNumber.replaceFirst("you","her");//将第一次出现的“you”替换成“her”
System.out.println("替换之后的结果是:"+youToHer);//输出语句
}
}
5.4.3字符串分割
package f;
public class f19 {
public static void main(String[] args) {
String str="从前有座山,山里有座庙,庙里有个小松鼠";//创建字符串
String[] strArray=str.split(",");//用字符串按照","进行分割
for(int i=0;i<strArray.length;i++) {//使用for循环,循环所有数字
System.out.println("数组第"+i+"索引的元素是:"+strArray[i]);//输出语句
}
}
}
根据多个字符分割字符串
package f;
public class f20 {
public static void main(String[] args) {
String str="a1a2,c,d e f|gh";//创建字符串
String[] a1=str.split(",");//使用","分割
String[] a2=str.split(" ");//使用空格分割
String[] a3=str.split("\\|");//使用"|"分割
String[] a4=str.split(" \\d");//使用表达式分割
String[] a5=str.split(",| |\\||\\d");//同时使用", 空格| 数字分割"连续所有分割
System.out.println("str的原值:["+str+"]");//显示str的原值
System.out.print("使用\",\"分割:");//输出语句
for(String b:a1) {//循环遍历数组
System.out.print("["+b+"]");//输出语句
}
System.out.println();//换行
System.out.print("使用空格分割:");//输出语句
for(String b:a2) {//循环遍历数组
System.out.print("["+b+"]");//输出语句
}
System.out.println();//换行
System.out.print("使用\"|\"分割:");//输出语句
for(String b:a3) {//循环遍历数组
System.out.println("["+b+"]")//输出语句
}
System.out.println();//换行
System.out.print("使用数字分割:");//输出语句
for(String b:a4) {//循环遍历数组
System.out.print("["+b+"]");//输出语句
}
System.out.println();
System.out.println("同时使用所有分隔符:");//输出语句
for(String b:a5) {//循环遍历数组
System.out.print("["+b+"]");//输出语句
}
System.out.println();//换行
}
}
对字符串进行二次拆分
package f;
public class f21 {
public static void main(String[] args) {
String str="192.168.0.1";//创建字符串
String[] firstArray=str.split("\\.");//按照"."进行分割
String[] secondArray=str.split("\\.",2);//按照"."进行两次分割
System.out.println("str的原值为:["+str+"]");//输出str原值
System.out.print("全部分割的结果:");//输出语句
for(String a:firstArray) {//将firstArray的值给a
System.out.print("["+a+"]");//输出语句
}
System.out.println();//换行
System.out.println("分割两次的结果:");//输出语句
for(String a:secondArray) {//将secondArray的值给a
System.out.print("["+a+"]");//输出语句
}
System.out.println();//换行
}
}
package f;
public class f22 {
public static void main(String[] args) {
String str="abc DEF";//创建字符串
System.out.println(str.toLowerCase());//按照小写格式输出
System.out.println(str.toUpperCase());//按照大写格式输出
}
}
5.4.5去掉空白内容
package f;
public class f23 {
public static void main(String[] args) {
String str=" abc ";//创建字符串
String shortStr=str.trim();//使用trim去掉空格
System.out.println("str的原值是:["+str+"]");//输出语句
System.out.println("去掉首尾空白的值:["+shortStr+"]");//输出语句
}
}
把空白字符换成空字符
package f;
public class f24 {
public static void main(String[] args) {
String str="a b cd e f g ";//创建字符串
String shortstr=str.replaceAll("\\s", "");//将字符串空白内容替换成""
System.out.println("str的原值是:["+str+"]");//输出语句
System.out.println("删除空内容之后的值是:["+shortstr+"]");//输出语句
}
}
比较字符串
package f;
public class f25 {
public static void main(String[] args) {
String tom,jerry;//直接引入字符串常量
tom="I am a student";//赋值
jerry="I am a student";//赋值
System.out.println("直接引入字符串常量的比较结果:"+(tom=jerry));//输出语句
tom=new String("I am a student");//赋值
jerry=new String("I am a student");//赋值
System.out.println("使用new创建对象的比较结果:"+(tom=jerry));//输出语句
}
}
判断两个字符串是否相等
package f;
public class f26 {
public static void main(String[] args) {
String str1="Hello";//创建字符串
String str2=new String("Hello");//创建字符串
String str3=new String("你好");//创建字符串
String str4=str2;//给str4赋值
System.out.println("str1==str2的结果:"+(str1==str2));//输出语句
System.out.println("str1==str3的结果:"+(str1==str3));//输出语句
System.out.println("str1==str4的结果:"+(str1==str4));//输出语句
System.out.println("str2==str4的结果:"+(str2==str4));//输出语句
System.out.println("str.equals(str2)的结果:"+str1.equals(str2));//输出语句
System.out.println("str.equals(str3)的结果:"+str1.equals(str3));//输出语句
System.out.println("str.equals(str4)的结果:"+str1.equals(str4));//输出语句
}
}
判断两个是否相等
package f;
public class f27 {
public static void main(String[] args) {
String str1="abc";//创建字符串对象
String str2="ABC";//创建字符串对象
System.out.println("区分大小写的结果:"+str1.equals(str2));//输出语句
System.out.println("不区分大小写的结果:"+str1.equalsIgnoreCase(str2));//输出语句
}
}
5.4.7格式化字符串
package f;
import java.util.Date;//导入java.util.Date类
public class f28 {
public static void main(String[] args) {
Date date=new Date();//创建Date对象date
String year=String.format("%tY",date);//将date进行格式化
String month=String.format("%tm", date);//将date进行格式化
String day=String.format("%td",date);//将date进行格式化
System.out.println("今天是:"+year+"年");//输出信息
System.out.println("现在是:"+month);//输出语句
System.out.println("今天是:"+day+"号");//输出语句
}
}
package f;
import java.util.Date;
public class f29 {
public static void main(String[] args) {
Date date=new Date();//创建Date对象date
String hour=String.format("%tH",date);//将date进行格式化
String minute=String.format("%tM",date);//将date进行格式化
String second=String.format("%tS",date);//将date进行格式化
System.out.println("现在是:"+hour+"时"+minute+"分"+second+"秒");//输出语句
}
}
package f;
import java.util.Date;
public class f30 {
public static void main(String[] args) {
Date date=new Date();//创建Date对象date
String time=String.format("%tc", date);//将Date格式化
String form=String.format("%tF", date);//将date进行格式化
System.out.println("全部的时间信息是:"+time);//输出语句
System.out.println("年-月-日格式:"+form);//输出语句
}
}
不同类型数字格式化
package f;
public class f31 {
public static void main(String[] args) {
String str1=String.format("%c", 'X');//输出字符
System.out.println("字母x大写:"+str1);//输出字符
String str2=String.format("%d", 1251+3950);//输出数字
System.out.println("1251+3950的结果是:"+str2);//输出字符
String str3=String.format("%.2f", Math.PI);//输出小数点后2位
System.out.println("Π取两位小数点:"+str3);//输出字符
String str4=String.format("%b", 2<3);//输出布尔值
System.out.println("2<3的结果是:"+str4);//输出字符
String str5=String.format("%h", 3510);//输出哈希散列码
System.out.println("3510的hashCode值:"+str5);//输出字符
String str6=String.format("%o",33);//输出8进制
System.out.println("33的8进制结果是:"+str6);//输出字符
String str7=String.format("%d",33);//输出16进制
System.out.println("33的16进制结果是:"+str7);//输出字符
String str8=String.format("%e", 120000.1);//输出科学计数法
System.out.println("120000.1用科学计数法表示:"+str8);//输出字符
String str9=String.format("%a", 40.0);//输出带有效位数和指数的16进制浮点值
System.out.println("40.0的进制浮点值:"+str9);//输出百分号和数字
System.out.println(String.format("天才是由%d%的灵感,%d%%的汗水。",1,99));//输出语句
}
}
使用字符串的输出格式
package f;
public class f32 {
public static void main(String[] args) {
String str1=String.format("%5d", 123);//让字符串输出的最大长度的最大长度为5,不足补空格
System.out.println("输出长度为5的字符串|"+str1+"|");
String str2=String.format("%-5d", 123);//让字符串左对齐
System.out.println("左对齐|"+str2+"|");//输出字符
String str3=String.format("%#o", 33);//在8进制前加一个0
System.out.println("33进制8进制结果是:"+str3);//输出字符
String str4=String.format("%#x", 33);//在16进制前加一个0x
System.out.println("33进制16进制结果是:"+str4);//输出字符
String str5=String.format("%+d", 1);//显示数字正负号
System.out.println("我是正数:"+str5);//输出字符
String str6=String.format("%+d",-1);//显示数字正负号
System.out.println("我是负数:"+str6);//输出字符
String str7=String.format("% d", 1);//在正数前补一个空格
System.out.println("我是正数,前面有空格:"+str7);//输出字符
String str8=String.format("% d", -1);//在负数前补一个负号
System.out.println("我是负数,前面有负号:"+str8);//输出字符
String str9=String.format("%05d", 12);//让字符串输出的最大长度的最大长度为5,不足补0
System.out.println("前面不够的数用0填充:"+str9);//输出字符
String str10=String.format("%,d", 123456789);//用逗号分割数字
System.out.println("用逗号分隔:"+str10);//输出字符
String str11=String.format("%(d", 13);//正数无影响
System.out.println("我是正数,我没有括号:"+str11);//输出字符
String str12=String.format("%(d", -13);//让负数用括号括起来
System.out.println("我是正数,我有括号:"+str12);//输出字符
}
}
5.5可变字符串
package f;
public class f33 {
public static void main(String[] args) {
StringBuffer sbf=new StringBuffer("门前大桥下,");//创建StringBuffer对象
sbf.append("游过一群鸭,");//追加字符串常量
StringBuffer tmp=new StringBuffer("快来快来数一数,");//追加StringBuffer对象
sbf.append(tmp);//追加整数变量
int x=24678;//定义值
sbf.append(x);//追加整数变量
System.out.println(sbf.toString());//输出
}
}
setCharAt的使用方法
package f;
public class f34 {
public static void main(String[] args) {
StringBuffer sbf=new StringBuffer("0123456");//创建StringBuffer对象
System.out.println("sbf的原值是"+sbf);//输出语句
sbf.setCharAt(3,'A');//将索引为3的字符改成'A'
System.out.println("修改后的值是"+sbf);//输出语句
}
}
字符串反序输出
package f;
public class f35 {
public static void main(String[] args) {
StringBuffer sbf=new StringBuffer("0123456");//创建StringBuffer对象
System.out.println("sbf的原值为:"+sbf);//输出语句
sbf=sbf.insert(5,"F");//将索引为5的字符改成'F'
System.out.println("修改之后的值是"+sbf);//输出语句
}
}
删除指定字符串内容
package f;
public class f36 {
public static void main(String[] args) {
StringBuffer sbf=new StringBuffer("同一个世界,同一个梦想");//创建StringBuffer对象
System.out.println("sbf的原值为:"+sbf);//输出语句
sbf=sbf.reverse();//将字符序号sbf反转
System.out.println("修改之后的值是"+sbf);//输出语句
}
}
StringBuffer的使用方法
package f;
public class f38 {
public static void main(String[] args) {
StringBuffer sbf=new StringBuffer("ABCDEFG");//创建字符串序列
int lenght=sbf.length();//获取字符串序列的长度
char chr=sbf.charAt(5);//获取索引为5的字符
int index=sbf.indexOf("DEF");//获取DEF字符
String substr=sbf.substring(0,2);//截取DEF字符串所在的索引位置
StringBuffer tmp=sbf.replace(2,5,"1234");//将从索引2开始至5之间的字符序列替换成"1234"
System.out.println("sbf的原值为:"+sbf);//输出语句
System.out.println("sbf的长度为:"+lenght);//输出语句
System.out.println("索引为5的字符为:"+chr);//输出语句
System.out.println("DEF字符串的索引位置为:"+index);//输出语句
System.out.println("索引0开始至索引2之间的字符串为:"+substr);//输出语句
System.out.println("替换成字符串为:"+tmp);//输出语句
}
}
StringBuffer的使用方法
package f;
public class f39 {
public static void main(String[] args) {
StringBuffer sbd=new StringBuffer();//创建StringBuffer对象
System.out.println("sbf的原值为空");//输出语句
sbd.append("我是StringBuffer类");//输出语句
System.out.println("sbf追加字符串"+sbd);//输出语句
int length=sbd.length();//输出sbd的长度
System.out.println("sbd的长度为:"+length);//输出语句
sbd=sbd.insert(length-1, "123456");//使用insert长度减一插入"123456"
System.out.println("插入字符串:"+sbd);//输出语句
sbd=sbd.delete(sbd.length()-1, sbd.length());//使用delete把sbd长度减1长度不够剪掉最后一个字
System.out.println("删除最后一个字:"+sbd);//输出语句
sbd=sbd.reverse();//使用reverse反序输出sbd
System.out.println("反序输出:"+sbd);//输出语句
}
}
5.5.3StringBuffer,StringBuilder,String之间的关系
package f;
public class f40 {
public static void main(String[] args) {
String str="String";//创建字符串
StringBuffer sbf=new StringBuffer(str);//String转换成StringBuffer
StringBuilder sbd=new StringBuilder(str);//String转换成StringBuffer
str=sbf.toString();//StringBuffer转换成String
str=sbd.toString();//StringBuffer转换成String
StringBuilder bufferToBuilder=new StringBuilder(sbf.toString());//StringBuffer转换成StringBuilder
StringBuilder builderToBuffer=new StringBuilder(sbd.toString());//StringBuffer转换成StringBuilder
}
}
验证字符串操作和字符串生成器操作的效率
package f;
public class f41 {
public static void main(String[] args) {
String str="";//创建空字符串
long starTime=System.currentTimeMillis();//定义对字符串执行操作的起始时间
for(int i=0;i<10000;i++) {//循环10000次循环
str=str+i;//循环追加字符串
}
long endTime=System.currentTimeMillis();//定义对字符串执行操作的时间
long time=endTime-starTime;//计算对字符串执行操作的时间
System.out.println("String循环1万次消耗时间:"+time);//输出语句
StringBuilder builder=new StringBuilder("");//创建字符串生成器
starTime=System.currentTimeMillis();//定义对字符串执行操作的时间
for(int j=0;j<10000;j++) {//循环语句
builder.append(j);//循环追加字符
}
endTime=System.currentTimeMillis();//定义操作后的时间
time=endTime-starTime;//计算对字符串执行操作的时间
System.out.println("StringBuilder循环1万次消耗时间:"+time);//输出语句
StringBuilder builder2=new StringBuilder("");//创建字符串生成器
starTime=System.currentTimeMillis();//定义对字符串执行操作的时间
for(int j=0;j<50000;j++) {//循环10000次循环
builder2.append(j);//循环追加字符串
}
endTime=System.currentTimeMillis();//定义操作后的时间
time=endTime-starTime; //追加操作执行的时间
System.out.println("StringBuilder循环5万次消耗时间:"+time);//输出语句
}
}
5.6 总结
本章学习了很多字符串的操作,处理字符串的代码在程序占有很大比例,对理解,学习和操作字符串打下基础。