目录
5.5.3 StringBuffer 、StringBuilder、String之间的关系
5.1 String类
String a;
String a,b;
注意:在不给字符串变量赋值的情况下,默认值为null,就是空对象,如果此时调用String的方法会发生空指针异常
5.1.1 声明字符串
字符串是常量它可以显示任何文字信息,字符串的值在创建之后不能更改。在Java语言中,单引号中的内容表示字符,例如's'。而双引号的内容表示字符串,例如,"我是字符串"。
' ' 字符 1个
" " 字符串 多个
5.1.2创建字符串
1.引用字符串常量
String a = " 建团一百周年"
String b = ''百年校庆",c = "时间就是金钱"
String str1,str2;
str1 = "we are students";
srt2 = "we are students";
2、利用构造方法实例化
String a = new String("建团一百周年")
String b = new String(a);
3、利用字符组实例化
定义一个字符数组charArray,使用该字符数组创建一个字符。代码如下:
char [ ] charArray = {'t','i','m','e'};
String a = new String(charArray);
4、提取字符数组中的一部分创建字符串对象
定义一个字符数组charArray,从该字符数组索引3的位置开始,提取两个元素,创建一个字符串。代码如下:
char[ ] charArray = {'建',''团,'一','百' ,'周' ,'年'};
String a = new String(charArray,3,2);
5.2 连接字符串
连接字符串就是字符串操作中较简单的一种。可以对多个字符串进行连接,也可使字符串与其他数据类型进行连接。
5.2.1 连接字符串
使用 "+" 运算符可实现拼接多个字符串的功能,并产生一个String对象。除了"+"运算符,"+="同样可以实现字符串拼接。
String a = "建团";
String b = "建团一百周年";
b = a + b; //b = "建团一百周年"
b += a; //b = b + a ="建团一百周年"
字符串是常量,是不可修改的。拼接两个字符串之后,原先的字符串不会发生变化而是在内存在生成一个新的字符串。
5.2.2 连接其他数据类型
String a = "建团";
int b = 100;
String c = "周年";
String d = a + b + c; //d = "建团一百周年"
a += (b+c);
1.b+c ="100周年"
本例实现的是将字符串常量与整型变量booktime和浮点型变量practice相连后的结果出输,booktime和·practice都不是字符串,当他们与字符串连接时会自动调用toString()方法将其转换成字符串形式参与连接。
5.3 提取字符串信息
5.3.1 获取字符串长度
str . length(); //长度 字符串名
例如,定义一个字符串a,使用length()方法获取其长度。代码如下:
String a = " 建团一百周年";
int b = a.length();
5.3.2 获取指定的字符
charAt(String index)方法可将指定索引处的字符返回。语法如下:
str . charAt(index);
str:任意字符串对象。
index:char值的索引。
5.3.3 获取子字符串索引位置
1、indexOf(String str)
a . indexOf(substr);
a:任意字符串对象
substr:要搜索的字符串
查找字符e在字符串str中首次出现的索引位置。代码如下:
String str = "we are the world";
int size = str,indexOf('e'); //size的值为1
String a = "";
int b = a.indexOf("a"); //0
int c = a.IastIndexOf("a") //8
int d = a.indexOf("a", 3); //4
int e = a.lastIdexOf("a" , 7);//6
2、indexOf(String str, int formIndex)
a.indexOf(str ,formIndex);
formIndex:开始搜索的索引位置
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);//获取字符串中"r"第二次出现的索引位置
int thirdIndex=str.indexOf("r",secondIndex+1);//获取字符串中"r"第三次出现的索引位置
System.out.println("r第一次出现的索引位置是:"+firstIndex);//输出信息
System.out.println("r第一次出现的索引位置是:"+secondIndex);//输出信息
System.out.println("r第一次出现的索引位置是:"+thirdIndex);//输出信息
}
}
3、public int lastIndexOf(String str)
返回指定子字符串中最右边出现处的索引。语法如下:
a.lastIndexOf(str);
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);//输出信息
}
}
4、lastIndexOf(String str,int formIndex)
返回指定子字符串在此字符串中最后一次出现的索引,从指定的索引开始反向搜索。
a.lastIndexOf(str, formIndex);
public static void main(String[] args) {
String str="01a3a56a89";//定义一个字符串
int lastIndex=str.lastIndexOf("a");//返回字母“a”最后一次出现的索引位置返回字母“a”的索引位置otherIndex
int fiveBeforeIndex=str.lastIndexOf("a",5);//满足0<=fiveBeforeIndex<=5条件,在满足条件的结果集中,返回最大的数字
int threeBeforeIndex=str.lastIndexOf("a",3);//满足0<=threeBeforeIndex<=3条件,在满足条件的结果集中,返回最大的数字
System.out.println("字符串\"a\"最后一次出现的位置是:"+lastIndex);//输出信息
System.out.println("从索引位置5开始往回搜索,字母\"a\"最后一次出现的位置:"+fiveBeforeIndex);//输出信息
System.out.println("从索引位置3开始往回搜索,字母\"a\"最后一次出现的位置:"+threeBeforeIndex);//输出信息
}
}
5.3.4 判断字符串首尾内容
String a = "建团一百周年";
Boolean b= a.startwith("建团");//判断是否以建团结尾·
Boolean c = a.endswith("建团") // 判断是否以建团开始
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("没有以\"我有一个梦想\"开始的。");//输出信息
}
}
public static void main(String[] args) {
String str="床前明月光,疑是地上霜。\n举头望明月,低头思故乡。";//创建字符串对象
System.out.println("《静夜思》\n"+str+"\n");//打印古诗
int enterIndex=str.indexOf("\n");//返回换行符所在的位置
test10 test10 = new test10();
boolean flag=str.startsWith("举",enterIndex+1);//返回从换行之后开始的子字符串前缀是否为"举"。
if(flag){
System.out.println("第二行是以\"举\"开始的");//输出信息
}else{
System.out.println("第二行是以\""+str.charAt(enterIndex+1)+"\"开始的");//输出信息
}
}
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);//输出信息
}
}
5.3.5 获取字符数组
Char[ ] ch = 字符串名.toCharArray();
String a = "建团一百周年";
Char[ ] ch = a.toCharArray();
5.3.6 判断子字符串是否存在
Boolean b = 字符串名.contains(子串);
String a = "建团一百周年";
Boolean b = a.contains("一百");
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.4 字符串的操作
5.4.1 截取字符串
str.substring(beginIndex,endIndex);
str:任意字符串
beginIndex:起始索引(包括)
endIndex:结束索引(不包括)
1.substring(int beginIndex)
public static void main(String[] args) {
String str="为革命保护视力,眼保健操开始!";//创建字符串
String substr=str.substring(8);//从第8位开始截取字符串
System.out.println("字符串str的后半句是:"+substr);//输出信息
}
}
2.substring(int beginIndex,int endIndex)
public static void main(String[] args) {
String str="闭门造车,出门合辙。";//定义一个字符串并赋予初值
String substr=str.substring(0,4);//从0开始(即从头开始)截取至4-1索引位置的子字符串
System.out.println("字符串str的前半句是:"+substr);//输出信息
}
}
5.4.2 字符串替换
1、str . replace(oldstr,newstr) //(老,新);
String a = "建团一百周年"
regex:要被替换的字符序列。
replacement:替换后的字符序列。
2、a.replace("团","校");
repalceAll();
1.replace(CharSequence target,CharSequence replacement)
public static void main(String[] args) {
String str="明月几时有,把酒问青天";//创建字符串
String restr=str.replace("月", "日");//将月换成日
System.out.println("字符串str替换之后的效果:"+restr);//输出信息
}
}
2.replaceAll(String regex,String replacement)
3.replaceFirst(String regex,String replacement)
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 字符串分割
该语法可根据给定的分隔符对字符串进行拆分,支持正则表达式,最后返回一个字符串数组。
str.split(regex)
字符串.split(子串<可传正则表达时>,次数):
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]);//输出信息
}
}
public static void main(String[] args) {
String str="a1b2,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+"]");//输出信息
System.out.print("使用\",\"分割:");//输出信息
for(String b:a1){//使用for-each循环展示数字分割的结果
System.out.print("["+b+"]");//输出结果
}
System.out.println();//换行
System.out.print("使用空格分割:");//输出结果
for(String b:a2){//使用for-each循环展示数字分割的结果
System.out.print("["+b+"]");//输出结果
}
System.out.println();//换行
System.out.print("使用\"|\"分割:");//输出结果
for(String b:a3){//使用for-each循环展示数字分割的结果
System.out.print("["+b+"]");//输出结果
}
System.out.println();//换行
System.out.print("使用数字分割:");//输出结果
for(String b:a4){//使用for-each循环展示数字分割的结果
System.out.print("["+b+"]");//输出结果
}
System.out.println();//换行
System.out.print("同时使用所有分隔符:");//输出结果
for(String b:a5){//使用for-each循环展示数字分割的结果
System.out.print("["+b+"]");//输出结果
}
System.out.println();//换行
}
}
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){//使用foreath的方法遍历数组
System.out.print("["+a+"]");//输出信息
}
System.out.println();//换行
System.out.print("分割两次的结果:");//输出信息
for(String a:secondArray){//使用foreath的方法遍历数组
System.out.print("["+a+"]");//输出信息
}
System.out.println();//换行
}
}
5.4.4 大小写转换
大转小:字符串.toLowerCase();
小转大:字符串.toUpperCase();
5.4.5 去除空白内容
字符串.trim();
public static void main(String[] args) {
String str=" abc ";//创建字符串
String shortStr=str.trim();//忽略空白
System.out.println("str的原值是:["+str+"]");//输出信息
System.out.println("去掉首位空白的值:["+shortStr+"]");//输出信息
}
}
去除字符串所有的空白内容。
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+"]");//输出信息
}
}
5.4.6 比较字符串是否相等
a ==b 位置
a. equals(b) 值
a.equalsIgnoreCase(b)
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==jerry返回的值
tom=new String("I am a student");//创建一个字符串并赋值
jerry=new String("I am a stuent");//创建一个字符串并赋值
System.out.println("使用new创建对象的比较结果:"+(tom==jerry));//输出tom==jerry返回的值
}
}
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 格式化字符串
String format("转换符",....)
日期和时间字符串格式化
Date d = new Date
String str = String.format("转换符",d)
import java.util.Date;//导入java.utill.Date类
public class test27 {
public static void main(String[] args) {
Date date=new Date();//创建Date对象date
String year=String.format("%tY", date);//将date进行格式化
String month=String.format("%tB", date);//将date进行格式化
String day=String.format("%td", date);//将date进行格式化
System.out.println("今年是:"+year+"年");//输出信息
System.out.println("现在是:"+month);//输出信息
System.out.println("今天是:"+day+"号");//输出信息
}
}
import java.util.Date;
public class test28 {
public static void main(String[] args) {
Date date=new Date();
String hour=String.format("%tH", date);
String minute=String.format("%tM", date);
String second=String.format("%tS", date);
System.out.println("现在是:"+hour+"时"+minute+"分"+second+"秒");
}
}
import java.util.Date;//导入java.util.Date类
public class test30 {
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);//输出信息
}
}
public class test31 {
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);//输出小数点后两位
System.out.println("n取两位小数点:"+str3);//输出信息
String str4=String.format("%b",2<3);//输出布尔类型
System.out.println("2<3的结果是:"+str4);//输出信息
String str5=String.format("%h",3510);//输出哈希散列码,等同于Integer.toHexString(3510)
System.out.println("3510的hashCode值:"+str5);//输出信息
String str6=String.format("%o", 33);//输出8进制
System.out.println("33的8进制结果是:"+str6);//输出信息
String str7=String.format("%x", 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的16进制浮点值:"+str9);//输出信息
System.out.println(String.format("天才是由%d%%的灵感,%d%%的汗水",1,99));//输出百分号和数字
}
}
public class test32 {
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 可变字符串
常规类型格式化
String str = string.format("转换符", . . .)
可变字符串
String
String str = "Hello";
str = "Helloworld";
StringBuffer 有锁 安全 慢
StringBuffer sbf = new StringBuffer("Hello");
sbf = sbf.append("world");
StringBuilder 不安全 快
ublic 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());//输出
}
}
5.5.1 StringBuffer 类的常用方法
追加 字符串名.append(需要追加的值);
设定某一个元素值 字符串名.setCharAt(序号,值);
插入 字符串名.insert(序号,值);
反转 字符串.reverse();
删除 字符串名.delete(前序号,后序号).
5.5.2 StringBuffer 类的使用方法
StringBuffer类和StringBuilder类具有兼容的API,所以两者的使用方法也相同。
5.5.3 StringBuffer 、StringBuilder、String之间的关系
1.区别:
String 常量
StringBuffer 变量 有锁 安全 慢
StringBuilder 变量 不安全 快
2、转换:
String ->StringBuffer new StringBuffer 对象
String ->StringBuilder new StringBuilder 对象
StringBuffer ->String .toString()方法
StringBuffer->String .toString()方法
StringBuffer < - > String < - > StringBuilder