10.10-字符串
String类
相当于char[]+操作(方法)
char[]
本身就是一串字符,在Java中可以作为字符串来使用
例子
package day10_10;
import java.util.Arrays;
public class StringDemo01 {
public static void main(String[] args) {
char[]chs1 = {'中','国'};
char[]chs2 = {'台','湾','省'};
//将chs1和chs2拼接在一起
chs1 = Arrays.copyOf(chs1, chs1.length+3);
System.arraycopy(chs2, 0, chs1, 2, 3);
System.out.println(Arrays.toString(chs1));
String s1 = "中国";
String s2 = "台湾省";
//将s1与s2拼接在一起
String s3 = s1.concat(s2);
System.out.println(s3);
}
}
注意事项
char[]
只有数据,没有操作(方法)一串字符就是字符串:
String/char[]/StringBuilder/StringBuffer
字符串的字面量都是String类型
String类中的常量均为
static final
修饰String类的内部就是一个
char[]
String类有一个原则,对象内容不变,String对象永远不变;这使得String类使用起来与基本类型差不多。
String字面量相同时,会替换为同一个String对象引用;这是由于常量池拥有常量优化机制,会将相同的字面量优化为同一个
常用方法
String类重写了Object类中的toString/equals/hashCode方法
String字符串中所有的字符都有下标,下标从0开始,到
lenght()-1
结束常用API
charAt()
根据给定的下标获取对应的字符indexOf()
根据给定的字符获取对应的下标lastIndexOf()
查看给定字符串在当前字符串中最后一次出现的位置toUpperCase()
将当前字符串中所有的小写字母转为大写toLowerCase()
将当前字符串中所有的大写字母转为小写trim()
去除当前字符串两边的空白startsWith()
判断当前字符串是否以给定的字符串起始endsWith()
判断当前字符串是否以给定的字符串结尾length()
获取当前字符串的长度(字符量)equals()
比较两个字符的内容是否相等equalsIgnoreCase()
忽略英文大小写比较两个字符串内容是否相等substring()
截取字符串toCharArray()
将当前字符串转换为对应的字符数组getBytes()
根据给定的字符集将当前字符串转换为对应的字节序列
例子一
package day10_10;
public class StringDemo02 {
public static void main(String[] args) {
String s = "abcdefghij";
//获取下标为5的字符
System.out.println(s.charAt(5));//f
String email = "[email protected]";
//获取字母o的下标值
int i = email.indexOf('o');
System.out.println(i);//4
String str = "Thinking in java";
//获取字符串in的下标
int index = str.indexOf("in");
System.out.println(index);//2
//从当前字符串给定位置查找第一次出现的给定字符串位置
index = str.indexOf("in", 7);
System.out.println(index);//9
//从当前字符串给定位置查找第一次出现的给定字符位置
index = str.indexOf('i', 7);//9
System.out.println(index);
//从当前字符串查找最后i一次出现的给定字符位置
index = str.lastIndexOf('i');
System.out.println(index);
//从当地前字符串查找给定字符串最后一次出现的位置
index = str.lastIndexOf("in");
System.out.println(index);//9
//到指定位置截至,查找给定字符串最后一次出现的位置
index = str.lastIndexOf("in", 7);
System.out.println(index);//5
}
}
例子二
package day10_10;
import java.util.Arrays;
public class StringDemo03 {
public static void main(String[] args) {
String str ="HelloWorld";
//小写转大写
String upper = str.toUpperCase();
System.out.println(upper);
//大写转小写
String lower = str.toLowerCase();
System.out.println(lower);
String str1 = " h e ll o ";
str1 = str1.trim();
//trim()只能去除字符串两边的空白
System.out.println(str1);
//判断字符串str是否以字符串"Hel"开头
System.out.println(str.startsWith("Hel"));//true
//判断字符串str是否以字符串"rold"结尾
System.out.println(str.endsWith("rold"));//false
//获取当前字符串长度
System.out.println(str.length());//10
//比较两个字符串内容是否相等
String str2 ="HelloWorld";
System.out.println(str.equals(str2));//true
//忽略字符串英文字母大小比较内容是否相等
String str3 ="HELLOWORLD";
System.out.println(str.equalsIgnoreCase(str3));//true
//从指定下标截取往后的字符串
String str4 =str.substring(1);
System.out.println(str4);//elloWorld
//从指定下标1开始截取到下标5的字符串,不包括下标5的字符
String str5 = str.substring(1, 5);
System.out.println(str5);//ello
//将指定字符转换为字符数组
char[] c1 = str.toCharArray();
System.out.println(Arrays.toString(c1));
}
}
例子三
package day10_10;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class StringDemo04 {
/**
* 将字符串转换为对应字节序列的过程,称之为编码
* 将字节序列转换为对应字符串的过程称之为解码
* 解码和编码使用的字符集应当一致,否则会出现乱码的情况
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "我爱Java";
/*
* 若想将字符串存储到磁盘文件中,
* 必须先将字符串转换为对应的字节序列后才可以存入
* 所谓的字节序列就是一个byte类型的数组byte[]
*/
byte[] gbk=str.getBytes("GBK");
System.out.println(gbk.length);
//GBK中汉字占两字节
System.out.println(Arrays.toString(gbk));
byte[] utf=str.getBytes("UTF-8");
//UTF8中汉字占三字节
System.out.println(utf.length);
System.out.println(Arrays.toString(utf));
/*
* String的构造器
* String(byte[] data,String csn)
* 将给定的字节数按照给定字符集转换为对应的字符串
*/
String gbkStr = new String(gbk,"GBK");
System.out.println(gbkStr);
String utfStr = new String(utf, "UTF-8");
System.out.println(utfStr);
}
}
正则表达式
负责字符串的匹配处理,一般用于验证字符串的格式
正则表达式本身也是一个字符串
格式
^正则表达式$
字符集
[123456789]
表示123456789其中之一[1-9]
表示1-9的数组(与上一个同义)[^12345]
表示除了12345以外的所有[a-z]
表示a-z之间的字符[0-9a-zA-Z]
表示0-9az-A-Z其中之一{6}
表示出现了6次{8,10}
表示出现了8-10次……
例子一
定义正则表达式,表示8~15位数字、字母、下划线组成的密码
String regex = "^[0-9a-zA-Z_]{8,15}$"
预定义字符集
\d
表示任意数字,等价于[0-9]
.
表示任意字符\w
表示单词字符,等价于[0-9a-zA-Z_]
\s
表示匹配空白\D
表示非数字\S
表示非空白\W
表示非单词字符?
表示出现了0-1次+
表示出现了1次以上*
表示出现了0~n次|
表示或者&
表示并且
例子二
书写一个正则表达式,用于验证邮政编码的格式(6位纯数字)
String postNum = "^\\d{6}$";
例子三
验证三种手机号码
15951618999
+86 15951618999
0086 15951618999
String phoneNum = "^((\\+\\d{2}\\s)|(\\d{4}\\s))?\\d{11}$";
如何验证
使用String类中的
matches(String regex)
方法
例子四
/*
* 验证当前字符串是否满足给定正则表达式的格式要求
* 邮箱正则表达式
* \w+@\w+(\.com|\.cn|\.com\.cn)
*/
String regex = "^\\w+@\\w+(\\.com|\\.cn|\\.com\\.cn)$";
String email = "[email protected]";
/*
* matches(String regex)
* 使用给定的正则表达式来验证当前字符串是否满足要求,返回 boolean值
*/
if(email.matches(regex)) {
System.out.println("合法");
}else {
System.out.println("不合法");
}
利用正则表达式替换字符串内容
例子五
使用String类中的replaceAll()方法
/*
* String replaceAll(String regex,String replacement)
* 将当前字符串中满足正则表达式的部分替换为给定字符串
*/
String str = "QWE123YUI89HJK456RTY09";
//将上述字符串中数字部分替换位#NUM#
String str1 = str.replaceAll("\\d+", "#NUM#");
System.out.println(str1);
StringUtils类
此类为commons-lang jar包所携带的扩展内容
该jar包是由Apache组织提供的,用于扩展Java中lang包中类的一些功能
例子
package day10_10;
import java.util.Arrays;
import org.apache.commons.lang3.StringUtils;
public class StringUtilsDemo {
/**
* commons-lang
* 该jar包是由Apache组织提供的,
* 用于扩展Java中lang包中类的一些功能
*/
public static void main(String[] args) {
/*
* String repeat(String str,int repeat)
* 将给定的字符串重复次数返回
*/
String repeat = StringUtils.repeat("abc", 5);
System.out.println(repeat);
String str = "123,456,789";
//拆分字符串 String类中spilt()方法
String[] array = str.split(",");
System.out.println(Arrays.toString(array));
/*
* StringUtils提供的join()方法相当于String类spile()方法的反操作
* 将给定的数组中每一项根据给定的字符串链接在一起
*/
String join = StringUtils.join(array, ".");
System.out.println(join);
/*
* StringUtils leftPad(String str, int size, char chs)
* 将给定字符串str的左侧添加若干个给定的字符chs,以使字符串的长度达到给定的size
*/
String leftPad = StringUtils.leftPad("12345", 10, '*');
System.out.println(leftPad);
/*
* StringUtils rightPad(String str, int size, char chs)
* 将给定字符串str的右侧添加若干个给定的字符chs,以使字符串的长度达到给定的size
*/
String rightPad = StringUtils.rightPad("12345", 10, '*');
System.out.println(rightPad);
}
}
StringBuilder
StringBuilder是用来修改字符串的类,是一个变长字符序列
StringBuilder JDK1.5 效率较高,线程不安全
StringBuffer JDK1.0 效率较低,线程安全
StringBuilder类中方法
append/delete/replace/instert
字符串的增/删/改/插操作方法
返回值都是StringBuilder对象本身的引用(表明是同一个对象)
例子
package day10_11;
public class StringBuilderDemo02 {
/**
* 字符串修改操作
*/
public static void main(String[] args) {
String str = "好好学习Java";
StringBuilder builder = new StringBuilder(str);
/*StringBuilder append(String str)
* 向当前字符串末尾追加给定的字符串
* "好好学习Java,为了找个女朋友"
*/
builder.append(",为了找个女朋友");
System.out.println(builder);
/* StringBuilder replace(int start,int end,String)
* 将当前字符串中给定范围的字符串替换为给定的字符串
* "好好学习Java,为了改变世界"
*/
builder.replace(11, 16, "改变世界");
//前包后不包
System.out.println(builder);
/*
* StringBuilder delete(int start,int end)
* 将当前字符串中给定范围的字符串删除
* ",为了改变世界"
*/
builder.delete(0, 8);
System.out.println(builder);
/*
* StringBuilder insert (int offset,String str)
* 将给定的字符串插入到给定位置中
* "活着,就是为了改变世界"
*/
builder.insert(0, "活着");
builder.insert(3, "就是");
System.out.println(builder);
}
}
reverse
字符串的反转方法
例子
package day10_11;
public class StringBuilderDemo03 {
public static void main(String[] args) {
String str = "上海自来水来自海上";
/*
* StringBuilder reverse()
* 将当前字符串反转
*/
StringBuilder b1 = new StringBuilder(str);
StringBuilder b2 = new StringBuilder(str);
b1 = b1.reverse();
System.out.println(b1);
System.out.println(b2);
/*
* StringBuild类并没有重写Object类中的equals()
* 若要比较两个字符串内容是否相等,需要将字符串转换为String类型后再作比较
*/
if (b1.toString().equals(b2.toString())) {
System.out.println("是回文");
}else {
System.out.println("不是回文");
}
}
}
最后更新于