javase:String工具类
String类的特点
字符串的表示方式
Char[],String,StringBuilder,StringBuff
字符串的使用方法
。
public class Stringdemo {
public static void main(String[] args){
/**
* str : String
* "abc" String
*/
String str = "abc";//等价于String str = new String("abc");
//1.String类型的对象不会被改变
String str1 = new String("123");
String str2 = str1.concat("4");
System.out.println(str1);//123
System.out.println(str2);//1234
System.out.println("比较两个对象的地址是否相同"+str1 == str2);//false str2重新产生对象
//2.如果字面量的结果相同被优化成一个对象
String s1 = "abc1234";
String s2 = "abc" + "1234";
System.out.println("比较s1和s2的结果地址:" + (s1 == s2));//true
String s3 = "abc" + 1234;
System.out.println("比较s1和s3的结果地址:" + (s1 == s3));//true
String s4 = "a" + "bc" + "1234";
System.out.println("比较s1和s4的结果地址:" + (s1 == s4));//true
String s5 = "a" +"b" + "c" + 123 + 4;
System.out.println("比较s1和s5的结果地址:" + (s1 == s5));//true
final int ONE = 1234;//常量
String s6 = "abc" + ONE;
System.out.println("比较s1和s6的结果地址:" + (s1 == s6));//true
int a = 1234;//变量
String s7 = "abc" + a ;
System.out.println("比较s1和s7的结果地址:" + (s1 == s7));//false a是变量不是常量
//除toString()方法外 其他所有方法返回值都产生了新对象
String st1 = "a b c ";
String st2 = st1.concat("1");//字符串连接
System.out.println(st1 == st2 );//false
String st3 = st1.trim();//去掉空白 包含换行,制表符,首尾空格(中间空格不会被去掉))
System.out.println(st1 == st3 );//false
}
}
String类的特点
①String类不能被继承,被finall修饰
②String类内部实现是char[],char[]的值可以随意改变,字符串本身也是一个类型无法随意改变
③字符串的字面量也是String类型的实例:String str = “abc”;”abc”就是字符串的字面量
④String设计原则:对象的内容不变,即String这个字符串对象内容不变
⑤String类在实例化过程中,如果它的实例都是字面量,而且字面量的结果是一致的,那么系统就会优化,让其在内存中的值存在一个对象。
⑥String重写了equals().hasCode().toString()方法.String API如果String的方法返回值为String类型,那么就会产生一个新String对象。toString()除外,包括(+)也会产生新对象。
String常用API
String类型的常用API
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class StringAPI {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.String类型API
//构造方法
//a)创建一个空串
String s1 = new String();
System.out.println("s1:"+s1);//空
String s2 = " ";
System.out.println("s2:"+s2);//空
//b)将byte[]数组转换成String
byte[] data = {65,66,67,67,68,69,70};
String s3 = new String(data);
System.out.println("s3:"+s3);//ABCCDEF 转换成ASCLL码打印
//c)将部分byte[]数组转换成String
String s4 = new String(data,2,3);//(data,2,3) (数组,初始位置。数组长度)
System.out.println("s4:"+s4);//CCD 转换成ASCLL码打印
//d)将char[]数组的内容转化成字符串
char[] buf = {'a','b','c','d','e','f'};
String s5 = new String(buf);
System.out.println("s5:"+s5);//abcdef
//e)将char[]数组中部分内容转换成字符串
String s6 = new String(buf,3,3);//(数组,初始位置,长度)
System.out.println("s6:"+6);//6
//f)货汽车字符串中的某个字符
String s7 = "asdfghj";
char c = s7.charAt(4);
System.out.println("字符为:"+c);//g
//g)将字符串串长度转换成字符数组
char[] buff = s7.toCharArray();
System.out.println("数组的内容:"+ Arrays.toString(buff));//[a, s, d, f, g, h, j]
//h)将字符串转换成byte数组
byte[] b = s7.getBytes();
System.out.println("数组内容:"+Arrays.toString(b));//[97, 115, 100, 102, 103, 104, 106]
//i)将字符串按照指定的字符集转换成byte数组
String s8 = "java学习过程";
//1)将字符串按照指定的字符集转换成byte数组 编码
byte[] b1 = s8.getBytes("gbk");
byte[] b2 = s8.getBytes("utf-8");
System.out.println("数组内容为:"+b1);//[B@1b2c6ec2
System.out.println("数组内容为:"+b2);//[B@4edde6e5
//2)将byte数组转换成文字 解码
System.out.println("转换结果为:"+new String(b1,"gbk"));//java学习过程
System.out.println("转换结果为:"+new String(b2,"utf-8"));//java学习过程
//常用普通方法
String st1 = "abnadfaAJHJcnsAjf";
//a.获取第一个“A“的位置
int index = st1.indexOf("A");
System.out.println("第一个A所在的位置:"+index);//7
//b.获取第二个“A”所在的位置
int index1 = st1.indexOf("A",index+1);
System.out.println("第二个A所在的位置:"+index1);//14
//c.反向查找
int last = st1.lastIndexOf("A");//14
System.out.println("最后一个A所在的位置:"+last);//14
//d.获取倒数第二个“A”所在的位置
int last1 = st1.lastIndexOf("A",last-1);
System.out.println("倒数第二个A所在的位置:"+last1);//7
//e.字符串截取
String st2 = "abnadfaAJHJcnsAjf";
//1)从第二个字符开始截取到第八个字符
String sub1 = st2.substring(1,7);
System.out.println(sub1);//bnadfa
//2)截取第二个字符到末尾
String sub2 = st2.substring(2);
System.out.println(sub2);//nadfaAJHJcnsAjf
//f.获取字符串的长度
System.out.println("字符串长度:"+st2.length());//17
//g.比较两个字符串是否相等
String st3 = "abc";
String st4 = "abc123";
System.out.println("比较两个字符串是否相等:"+st3.equals(st4));//false
//h.去掉首位空白(换行,制表符,空格)
String st5 = "\t a \n b c \n";
System.out.println("st5.length:"+st5.length());//12
String st6 = st5.trim();
System.out.println("St6.length:"+st6.length());//8
//i.字符大小写转换
String st7 = "KDJHFSndjfsjf";
System.out.println("将字符串转换成大写:"+st7.toUpperCase());//KDJHFSNDJFSJF
System.out.println("将字符串转换成大写:"+st7.toLowerCase());//kdjhfsndjfsjf
}
}
String工具类正则
正则表达式
概念:一个字符串,用指定字符来限制当前字符串的内容
语法:普通字符串:“abc”
当前位置可以出现的字符:[]
当前字符串可以出现的次数:{}
从起始位置到结束位置之间的字符都可取:-
字符串的起始位置:^
字符串的结束位置:$
可以出现start到end之间的次数:(start,end)
表示[0,9]:\d
表示非数字:\D
表示[a-z A-Z 0-9]:\w
表示^\w:\w
String处理正则API
①boolean natch(String regx) 用英语判断当前字符串是否符合regx的正则表达式
②String[] split(String regx) 更具regx将字符串切割成多个子串
③String replaceAll(String regx,String str) rehex 要被替换的正则, str:替换的内容 String:替换后的字符串
简单的正则表达式样例
1.正数 ^\d*.\d+& = ^ [0-9]{1,}.[0-9]{0,}$
2.负数 ^-\d*.\d+$ = ^-[0-9](1,0}.[0-9]{0,}$
3.用户名正则(4-16位,字母,数字,下划线,减号): ^ [a-zA-Z0-9_]{4,1}$
= ^ [\w-][4,16]$
String处理正则表达式API
package StringRegularExpression;
import java.util.Arrays;
public class StringRegexDemo {
public static void main(String[] args){
//1.判断字符是否满足正则表达式
String str = "123";
String str1 = "asd";
//2.正则表达式 ^[0-9]{1,3}$ 或者 ^\d{1,3}$ 含义:0-999
boolean rs = str.matches("^[0-9]{1,3}$");
System.out.println(rs);//true
boolean rs1 = str1.matches("^[0-9]{1,3}$");
System.out.println(rs1);//false
//3.字符串切割
String msg = "123-456#ABC-78#abc-6#mnq-45623-544#LDS";
String[] ms = msg.split("-");
System.out.println("切割结果为:"+ Arrays.toString(ms));//[123, 456#ABC, 78#abc, 6#mnq, 45623, 544#LDS]
String[] ms1 = msg.split("#");
System.out.println("切割结果为:"+ Arrays.toString(ms1));//[123-456, ABC-78, abc-6, mnq-45623-544, LDS]
String[] ms2 = msg.split("[#-]");
System.out.println("切割结果为:"+ Arrays.toString(ms2));//[123, 456, ABC, 78, abc, 6, mnq, 45623, 544, LDS]
//4.字符串替换 replaceAAll() 可以使用正则表示替换字符
String m1 = msg.replace("-",",");
System.out.println("m1:"+m1);//123,456#ABC,78#abc,6#mnq,45623,544#LDS
String m2 = msg.replaceAll("#",",");
System.out.println("m2:"+m2);//123-456,ABC-78,abc-6,mnq-45623-544,LDS
String m3 = msg.replaceAll("[-#]",",");
System.out.println("m3:"+m3);//123,456,ABC,78,abc,6,mnq,45623,544,LDS
//5.其他替换的方法
//replace():只支持单种符号的替换,不能使用正则表示
String m4 = msg.replace("-","_");
System.out.println("m4:"+m4);//123_456#ABC_78#abc_6#mnq_45623_544#LDS
//reolaceFirst() 只替换第一次出现的字符串
String m5 = msg.replaceFirst("[-#]","@");
System.out.println("m5"+m5);//123@456#ABC-78#abc-6#mnq-45623-544#LDS
}
}
StringBuilder和StringBuffer
StringBuilder特点
①都是被final修饰,不能继承
②StringBuilder,StringBuffer都是动态字符序列(字符串),采用动态数组的算法,来实现动态存储数据方式,完成字符串的动态存储,即StringBuilder,StringBufferC采用变长数组存储
③StringBuilder,StringBuffer内部原理是char[]
④StringBuilder,StringBuffer的内存对象是可变的,说明他们是一个可变字符序列
StringBuilder常用API
①StirngBuilder append(String)向原字符串后面追加新的字符
②String insert(int index,String str)在index位置插入新的字符串index从0开始
③StringBuilder delete(int start,int end)删除从start到end之间的字符串,不包含end
StringBuilder使用样例
。
public class StringBuilderDemo {
public static void main(String[] args){
//1.创建一个StringBuilder
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = sb.append("abc");
StringBuilder sb2 = sb.append("123");
System.out.println("比较地址是否相等:"+(sb == sb1));//true
System.out.println("比较地址是否相等:"+(sb == sb2));//true
System.out.println(sb);//abc123
System.out.println(sb1);//abc123
System.out.println(sb2);//abc123
//2.StringBuilder的API
StringBuilder s1 = new StringBuilder("信管1812");
System.out.println(s1);//信管1812
s1.append("qjg");
System.out.println(s1);//信管1812qjg 追加字符串
s1.insert(2,"2018");
System.out.println(s1);//信管20181812qjg 指定位置插入字符串
s1.delete(5,8);
System.out.println(s1);//信管20112qjg 删除指定位置字符串
//3.连缀
StringBuilder s2 = new StringBuilder("abc").append("123").insert(1,"-").delete(2,4);
System.out.println(s2);//a-123 对字符串进行连续的操作,类型必须为StringBuilder型
}
}
StringBuilder,StringBuffer转换
String->StringBuilder,StringBuffer :
①new StringBuilder(String)
② newStringBuffer(str)
StringBuilder,StringBuffer : 调用toString方法
public class StringBuilderDemo {
//Stringhe和StringBuilder之间是可以转换的
//a)将Stringz转换成StringBuilder
String st = "abc";
StringBuilder s3 = new StringBuilder(st);
//b)StringBuilder转换成String
String st1 = s3.toString();
System.out.println(st1);//abc 转换前后没变化
//优化方案
String st2 = "abc";
String st3 = "123";
String st4 = st2 + st3;
//等价于
String st5 = new StringBuilder("abc").append("123").toString();
}
}
StringBuilder和StringBuffer对比分析
相同点:内部都是char[]数组,都是可变的字符序列,API大致相同
不同点:StringBuffer:java早期引入,线程安全,速度慢
StringBuilder:java5.0引入,非线程安全,速度快
String StringBuilder和StringBuffer对比分析
String采用定长数组,StringBuffer,StringBuilder采用变长数组