Java 字符串处理全解:String、StringBuffer、StringBuilder
1、String类的常用方法1.1 获取字符串信息int length()返回字符串的长度intlenstr.length();char charAt(int index)返回指定索引处的字符charcstr.charAt(0);boolean isEmpty()判断字符串是否为空长度是否为 0booleanemptystr.isEmpty();1.2 大小写转换String toLowerCase()将字符串转换为小写默认语言环境Stringlowerstr.toLowerCase();String toUpperCase()将字符串转换为大写默认语言环境Stringupperstr.toUpperCase();1.3 字符串处理String trim()去除字符串首尾的空白字符Stringresultstr.trim();String substring(int beginIndex)从指定位置开始截取子字符串Stringsubstr.substring(2);String substring(int beginIndex, int endIndex)截取指定范围的子字符串左闭右开Stringsubstr.substring(2,5);1.4 字符串比较boolean equals(Object obj)比较字符串内容是否相同booleanflagstr1.equals(str2);boolean equalsIgnoreCase(String anotherString)比较字符串内容是否相同忽略大小写booleanflagstr1.equalsIgnoreCase(str2);int compareTo(String anotherString)比较两个字符串的大小按字典顺序intresultstr1.compareTo(str2);1.5 字符串拼接String concat(String str)将指定字符串拼接到当前字符串末尾等价于Stringresultstr1.concat(str2);// 或Stringresultstr1str2;1.6 字符串查找与匹配boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束Stringstr1helloworld;booleanb1str1.endsWith(rld);boolean startsWith(String prefix)测试此字符串是否以指定的前缀开始Stringstr1helloworld;booleanb2str1.startsWith(He);boolean startswith(String prefixint toffset)测试此字符串从指定索引开始的子字符串是否以指定的前缀开始Stringstr1helloworld;booleanb3str1.startsWith(11,2);boolean contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时返回trueStringstr1helloworld;Stringstr2wor;System.out.println(str1.contains(str2));int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引Stringstr1helloworld;System.out.println(str1.indexOf(lol));int indexOf(String str,int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引从指定的索引开始Stringstr1helloworld;System.out.println(str1.indexOf(lo,5));int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引Stringstr3hellorworld;System.out.println(str3.lastIndexOf(or));int lastlndexOf(String str,int fromlndex)返回指定子字符串在此字符串中最后次出现处的索引从指定的索引开始反向搜索从后往前找Stringstr3hellorworld;System.out.println(str3.lastIndexOf(or,6));注indexOf和lastlndexOf方法如果未找到都是返回-11.7 字符串替换方法String replace(char oldChar,char newChar)返回一个新的字符串它是通过用newChar替换此字符串中出现的所有oldchar得到的。Stringstr1咕噜咕噜咚;Stringstr2str1.replace(咕,嘟);System.out.println(str1);System.out.println(str2);String replace(CharSequence target, CharSequence replacement)使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。Stringstr1咕噜咕噜咚;Stringstr3str1.replace(咕噜,嘟呜);System.out.println(str3);1.8 正则匹配与替换String replaceAll(String regex, String replacement)使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。Stringstr123java456mysql21345spring215mybatis4444// 把字符串中的数字替换成如果结果中开头和结尾有的话去掉Stringstringstr.replaceAll(\\d,,).replaceAll(^,|,$,);System.out.println(string);String replaceFirst(String regex, String replacement)使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串。Stringstr12345;//判断str字符串中是否全部有数字组成即有1-n个数字组成booleanmatchesstr.matches(\\d);System.out.println(matches);boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。Stringtel0571-4534289;//判断这是否是一个杭州的固定电话booleanresulttel.matches(0571-\\d{7,8});System.out.println(result);1.9 字符串拆分String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。Stringstrhello|world|java;String[]strsstr.split(\\|);for(inti0;istrs.length;i){System.out.println(strs[i]);}String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串最多不超过limit个如果超过了剩下的全部都放到最后一个元素中。Stringstr2hello.world.java;String[]strs2str2.split(\\.);for(inti0;istrs2.length;i){System.out.println(strs2[i]);}2、String与基本数据类型转换字符串→基本数据类型、包装类Integer包装类的public static int parselnt(String s)方法可以将由 “数字”字符组成的字符串转换为整型。类似地使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串转化为相应的基本数据类型。基本数据类型、包装类→字符串调用String类的public String valueOf(int n)可将int型转换为字符串相应valueOf(byte b)、valueOf(long I)、valueOf(float f)、valueOf(doubled)、valueOf(boolean b)可由参数的相应类型到字符串的转换Stringstr1123;// 字符串 - int// int num (int) str1; //错误的intnumInteger.parseInt(str1);// int - 字符串Stringstr2String.valueOf(num);Stringstr3num;System.out.println(str2);System.out.println(str3);2.1 String与字符数组之间的转换字符串→字符数组String -- char[]调用String的toCharArray()/public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)方法// getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)Stringstr1abc123;char[]charArray1newchar[str1.length()];str1.getChars(0,6,charArray1,0);for(inti0;icharArray1.length;i){System.out.println(charArray1[i]);}// toCharArray()str1abc123;char[]charArraystr1.toCharArray();for(inti0;icharArray.length;i){System.out.println(charArray[i]);}字符数组→字符串char[]--String调用String的构造器String(char[])String(char[],int offset,int length)// String(char[])char[]arrnewchar[]{h,e,l,l,o};Stringstr2newString(arr);System.out.println(str2);// String(char[],int offset,int length)Stringstr3newString(arr,1,3);System.out.println(str3);2.2 String与字节数组之间的转换字符串→字节数组编码字符串→字节看得懂→看不懂的二进制数据调用String的public byte[] getBytes()/public byte[] getBytes(String charsetName)方法Stringstr1abc123中国;byte[]bytesstr1.getBytes();// 使用默认字符集进行转换System.out.println(Arrays.toString(bytes));byte[]gbksstr1.getBytes(gbk);System.out.println(Arrays.toString(gbks));字节数组→字符串解码编码的逆过程字节→字符串看不懂的二进制数据→看得懂调用String的构造器String(byte[])String(byte[],int offset,int length)// 使用默认字符集进行解码StringsnewString(bytes);System.out.println(s);Strings1newString(gbks,gbk);System.out.println(s1);Strings2newString(gbks);System.out.println(s2);说明解码时要求解码使用的字符集必须与编码时使用的字符集一致否则会出现乱码。3、String/StringBuffer/StringBuilder类3.1 String、StringBuffer、StringBuilder三者的异同String不可变(final)的字符序列底层使用char[]存储StringBuffer可变的字符序列线程安全的效率低底层使用char[]存储StringBuilder可变的字符序列jdk5.0新增的线程不安全的效率高底层使用char[]存储3.2 StringBuffer源码分析StringstrnewString();//char[] value new char[0];Stringstr1newString(abc);//char[] value new char[]{a,b,c};StringBuffersb1newStringBuffer();//char[] value new char[16]; 底层创建了一个长度为16的字符数组sb1.append(a);//value[0]a;sb1.append(b);//value[1]b;StringBuffersb2newStringBuffer(abc);//char[]value new char[abc.length()16];//问题1.System.out.println(sb2.length());//3//问题2.扩容问题如果要添加的数据底层数组盛不下了那就需要扩容底层的数组。// 默认情况下扩容为原来容量的2倍2同时将原有数组中的元素复制到新的数组中。// 开发中建议大家使用:StringBuffer(int capacity)或 StringBuilder(int capacity)3.3 StringBuffer中的常用方法3.3.1 字符串操作方法拼接StringBuffer append(xxx)用于字符串拼接支持多种数据类型是最常用的方法sb.append(hello).append( world);删除StringBuffer delete(int start, int end)删除指定范围的字符左闭右开sb.delete(0,2);替换StringBuffer replace(int start, int end, String str)将指定区间的内容替换为新字符串sb.replace(0,2,hi);插入StringBuffer insert(int offset, xxx)在指定位置插入内容sb.insert(1,abc);反转StringBuffer reverse()将字符序列反转sb.reverse();当append和insert时如果原来value数组长度不够可扩容。如上这些方法支持方法链操作。StringBuffer 支持方法链调用例如sb.append(a).append(b).append(c);原理方法返回的是this当前对象因此可以连续调用多个方法3.3.2 查询相关方法int indexOf(String str)返回子字符串第一次出现的位置String substring(int start, int end)截取子字符串左闭右开int length()返回当前长度char charAt(int n)获取指定位置字符void setCharAt(int n, char ch)修改指定位置字符方法总结增append(xxx)删delete(int start,int end)改setCharAt(int n ,char ch)/replace(int start, int end, String str)查charAt(int n)插insert(int offset,xxx)长度length();遍历for()charAt()/toString()