4.Java字符串
Java字符串:被"..... " (双引号)包含的一个或多个字符。
'c'是字符 ,"c"是字符串
4.1String类
4.1.1声明字符串
String str; //未经初始化的字符串不可使用
4.1.2创建字符串
1.引用字符串常量
String str1="We are students"
2.利用字符数组或者字节数组创建
String s=new String(a);
//a是一个字符数组或者一个字节数组
3.提取字符数组的一部分创建一个字符串对象
String s=new String(a,2,4)
//方法原型是String(char a[],int offset, int length)
4.2连接字符串
使用'+'号可以连接多个字符串,返回一个String对象
'+'号也可以将字符串和其他类型连接,此时自动调用toString()方法
'+'号调用时,只要有一个操作数为字符串,就会将其他类型转换成字符串形式
5.2获取字符串信息
1.获取字符串长度
str.length()
2.字符串查找
str.indexOf(substr)
//返回子串首次出现的索引位置
str.lastIndexOf(substr)
//返回子串最后一次出现的索引位置
3.获取指定索引位置的字符
str.chatAt(int index)
5.4字符串操作
1.获取字符子串
str.substring(int beginIndex)
//从某一索引出开始截取子串,直至字符串结尾
str.substring(int beginIndex,int endIndex)
//截取两个索引之间的字符串,子串中包含beginIndex对应字符,不包含endIndex对应字符
.2.去除空格
str.trim()
//返回字符串副本,去掉字符串前导空格和尾部空格
3.字符/字符串替换
str.replace(char oldChar,char newChar)
//用新的字符或者字符串替换掉旧的字符或者字符串
4.判断字符串开头和结尾
str.startsWith(String prefix)
//判断字符串开头是否是prefix
str.endsWith(String suffix)
//判断字符串结尾是否是suffix
5.判断字符串是否相等
str.equlas(String otherstr)
//当str和otherstr具有相同字符和长度时,返回true
str.equalsIgnoreCase(String otherstr)
//忽略大小写,比较str和otherstr是否具有相同字符和长度
6.按字典序比较字符串大小
str.compareTo(String otherstr)
//str>otherstr,返回负数;str==otherstr,返回0;str<otherstr,返回正数
7.字母大小写转换
str.toLowerCase()
str.toUpperCase()
//数字和非字符不受影响
8.字符串分割
str.split(String sign)
//按照sign对字符串拆分
str.split(String sign, int limit)
//对字符串拆分,限定次数为limit次
//注意返回值应该用String数组接收
5.5格式化字符串
静态方法String()用来创建格式化字符串,有两种重载形式
str.format(String format,Object...args)
str.format(Local 1,String format,Object...args)
//format为字符串,args是由格式说明符引用的参数;
//1为格式化过程要应用的语言环境,1为null时,则不进行本地化
1.常规类型格式化
2.日期类型格式化
3.时间类型格式化
时间类型格式化举例:
import java.util.Date;
......
Date date=new Date();
String s=String.format("%te",date);
5.6正则表达式
用于判断语句中,检查某一字符是否满足某一格式
元字符可以用一个括号括起若干个字符表示,表示该字符为括号中字符的任意一个
正则表达式中元字符:
正则表达式中限定符:
正则表达式中元字符含义举例:
代码举例1,判断某个字符串是否是合法邮箱:
String regex="\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String a1="8534@qq.cn";
String a2="cm@icloud.com";
String a3="@qq.com";
System.out.println(a1.matches(regex));
System.out.println(a2.matches(regex));
System.out.println(a3.matches(regex));
a1、a2是合法字符,a3不是
代码举例2,判断某个字符串是不是合法中电话号码:
import java.util.Scanner;
.....
Scanner sc=new Scanner(System.in);
String regex="1(3[0-9]|5[012356789]|8[056789])\\w{8}";
while(true) {
String phone =sc.nextLine();
System.out.println(phone.matches(regex));
5.7字符串生成器StringBuilder
可修改的字符序列,默认初始长度为16个字符,亦可自行指定长度
1.声明与初始化:
StringBuilder builder=new StringBuilder("");
2.尾部添加内容
append(content)
//content为任意类型
3.插入内容
insert(int offset,content)
//在索引offset处,插入任意类型的content
4.删除指定内容
delete(int start, int end)
//start、end位置字符会被保留
5.修改指定索引处的字符
public void setCharAt(int index,char ch)
6.字符串反序输出
public StringBuffer reverse()
7.删除子字符串
public StringBuffer delete(int start,int end)
//删除字符start至end-1,end-1超出最大范围则一直删除到序列尾部;若start==end,不进行任何修改
8.替换指定位置内容
public StringBuffer replace(int start,int end ,String str)
//注意区别String的replace
9.与String类似的方法
length() 、 charAt()、indexOf()、substring()
5.8StringBuilder类
和StringBuffer类具有兼容的API,使用方法相同
不保证线程同步(不上锁),线程不安全,仅能在单线程中使用,但是效率更高
5.9StringBuffer、StringBuilder、String类的转换
1.转换为StringBuffer和StringBuilder类型,需要调用对应的构造函数,函数参数为Stiring类型
StringBuffer sbf=new StringBuffer(str); //str为一个String类型 StringBuffer sbf=new StringBuffer(stf.toString()); //sbf为一个StringBuilder类型
#2.转换为String类型,直接用原来的StringBuffer和StringBuilder调用toString()函数即可,返回值是一个String类型
str=sb.toString(); //sbf为一个StringBuffer或StringBuilder类型
5.10StringBuffer、StringBuilder、String类的区别
1.创建String对象会在堆中产生一个匿名对象,指向栈中字符串的字面值;
每一次改变字符串都会在内存产生新的String对象
2.StringBuilder、StringBuffer类型的每一次操作都是在自己堆栈中操作,修改自己栈中值
3.三种类型中仅有StringBuffer是线程安全的
4.一般来说运行效率 StringBuilder>StringBuffer>String,修改较多,数据大的情况下不采用String