1. String类
java中本身并没有直接提供对字符串的基本类型数据,提供了为一个可用关于字符的基本类型是char
,但是char类型表示只是单个字符;而字符串是有多个字符组合而成,对于字符串的需求,实际java中是通过一个字符序(CharSequence
)列提供的支持,可以将字符序列理解为字符数组(char[]
),但是为了符合面向对象这一特征,Java中特别定制了一个用于表示字符串对象的引用数据类型:java.lang.String
;String
实现了CharSequence
接口。
String类是一种定长(初始化之后即最终值,改变只能改变引用地址的指向不能修改堆空间中的对象内容)字符串的表示,区别于StringBuffere
和StringBuilder
。
1.1.String类常用的构造器
String()
:构建个空字符(“”)串对象String(String s)
:根据提供的字符串对象创建String对象String(char[] c)
:根据提供的字符数组构建一个String对象String(char[] c,int offset,int len)
:将字符数组中从offset开始截取len个元素作为String对象
public static void main(String[] args) {
char[] c = {'h', 'e', 'l', 'l','o'};
// 根据提供的字符数组构建一个String对象
String s = new String(c);
System.out.println(s);
//将字符数组中从offset开始截取len个元素作为String对象
s = new String(c, 2, 3);
System.out.println(s);
}
String(byte[] b)
:将字节数组内容解析为一个String对象String(byte[] b,int offset,int len)
: 截取字节数组中的某一段元素构建为String对象
空字符串(“”)和
null
对象的区别?
//空字符串:表示String对象已创建,但是内容为“”,但是可以调用String中的一些成员方法
String a = “”;
//空对象:表示String对象并不存在,无法通过对象调用其他任何方法(会导致空指针异常)
String b = null;
1.2 String常见方法
1.2.1 判断比较操作
String提供的常见判断方法主要包含以下:
contains(CharSequence cs)
:判断目标字符串中是否存在指定子串
// 查询指定字符串是否包含子串
System.out.println("helloword".contains("word"));
contentEquals(CharSequence cs)
:jdk1.5新增,用于比较两个字符序列是否一致
//判断指定的charsequence对象是否与当前对象的字符序列一致
System.out.println("helloword".contentEquals("hello"));
equals(Object obj)
:用于比较两个字符串对象是否一致(完全一致,包括大小写)equalsIgnoreCase(String anotherString)
:忽略大小写比较两个字符串对象
//比较两个字符串是否完全一致(包括大小写)
System.out.println("hello".equals("Hello"));
// 忽略大小写比较两个字符串对象
System.out.println(" Hello".equalsIgnoreCase("hello"));
endsWith(String suffix)
:判断字符串对象是否以指定的后缀结尾startsWidth(String prefix)
:判断字符串对象是否以指定的前缀开头
// 判断目标字符串是否以指定的子串结尾
System.out.println("helloworld".endsWith("d"));
// 判断目标字符串是否以指定的子串开头
System.out.println("helloworld".startsWith("h"));
isEmpty()
:判断当前字符串对象是否是空字符串(length == 0)
// 判断目标字符串对象的length是否为0
System.out.println("".isEmpty());
matches(String regex)
:判断当前字符串对象是否匹配给定的正则表达式
// 将目标字符串对象与参数字符串表达式(正则表达式:验证,查找,替换)匹配,能匹配则为true,否则false
System.out.println("123456".matches("123456"));
System.out.println("123456".matches("\\d{6}"));
// // 验证手机号
System.out.println("13245678653".matches("1[35789]\\d{9}"));
compareTo(String s)
:比较两个字符串再字母表的顺序compareToIgnoreCase(String s)
:// 比较两个字符串在字母表的顺序(忽略大小写)
// 比较两个字符串在字母表的顺序
System.out.println("abc".compareTo("abd"));
// 比较两个字符串在字母表的顺序(忽略大小写)
System.out.println("abc".compareToIgnoreCase("abD"));
1.2.2 获取操作
String中常见的获取操作包含如下方法:
charAt(int i)
:获取字符串对象中指定索引处的字符
//获取字符串中指定位置的字符,索引从0开始
System.out.println("helloworld".charAt(0));
length()
:获取字符串的字符个数
// 获取字符串序列中的字符的个数(数组长度)
System.out.println("hello".length());
indexOf(int ch)
:获取指定字符第一次在字符串中出现的索引intdexOf(String str)
获取指定字符(串)第一次在字符串中出现的索引lastIndexOf(int ch)
获取指定字符最后一次在字符串中出现的索引lastIndexOf(String str)
获取指定字符(串)最后一次在字符串中出现的索引
// 获取指定字符串在当前字符串第一次出现的位置
System.out.println("周杰伦弹钢琴,曲目名称叫周杰伦".indexOf("杰伦"));
System.out.println("周杰伦弹钢琴,曲目名称就叫周杰伦".indexOf("杰伦", 2));
// 获取指定字符串在当前字符串最后一次出现的位置
System.out.println("周杰伦弹钢琴,曲目名称就叫周杰伦".lastIndexOf("杰伦"));
1.2.3 转换操作
String中常见的转换操作包含如下方法:
toUpperCase()
:将字符串对象转换为大写toLowerCase()
:将字符串对象转换为小写
System.out.println("helloworld".toUpperCase()); // 转大写
System.out.println("HelloWorld".toLowerCase()); // 转小写
replace(char oldChar,char newChar)
:替换字符串中指定的字符replace(CharSequence target,CharSequence replacement)
:替换字符串中指定的子串replaceAll(String regex,String replacement)
:使用给定的正则表达式将匹配的所有字符串替换replaceFirst(String regex,String replacement)
:使用给定的正则表达式将匹配的第一个字符串替换
// 使用*替换字符串中指定子串
System.out.println("hello".replace("l", "*"));
String msg = "张三时任组长,私人电话是13568567833,于2022年卸任!\n" +
"李四时任班长,私人电话是17786776456,于2080年卸任";
// 使用指定的正则表达式对目标字符串中匹配的子串替换
System.out.println(msg.replaceAll("1[35789]\\d{9}", "***"));
// 使用指定的正则表达式对目标字符串中匹配的子串替换(只替换找到的第一个元素)
System.out.println(msg.replaceFirst("1[35789]\\d{9}", "***"));
valueOf(Object obj)
:将任何类型数据转换为String对象
char[] b = {'h', 'e', 'l', 'l', 'o'};
System.out.println(String.valueOf(b));
getBytes()
:将字符串对象转换为字节数组
// 将一个字符串转换为字节数组(文件操作常见)
byte[] bytes = "hello".getBytes();
for (byte b : bytes) {
System.out.print(b + " ");
}
System.out.println();
toCharArray()
:将字符串对象转换为字符数组
// 将字符串转换成字符数组(新建数组+数组拷贝)
char[] chars = "helloworld".toCharArray();
for (char c : chars) {
System.out.print(c + " ");
}
System.out.println();
1.2.4 截取分割操作
String中常见的转换操作包含如下方法:
split(String regex)
使用指定的正则表达式对字符串分割,并返回字符串数组对象
String info = "1001/张三/18/男/软件工程/65";
// 将指定的分隔符将字符串分割为字符数组(与join相反)
String[] infos = info.split("/");
// 将字符串对象转为int对象
int sno = Integer.parseInt(infos[0]);
int age = Integer.parseInt(infos[2]);
double score = Double.parseDouble(infos[5]);
System.out.println("学号:" + sno);
System.out.println("年龄:" + age);
System.out.println("成绩:" + score);
substring(int start)
:从字符串中指定索引处开始截取,截取到字符串末尾substring(int start,int end)
:从字符串中start
位开始截取到end
位结束
// 从指定位置开始截取到字符串末尾
System.out.println("hello".substring(2));
// 从指定字符串的目标索引处开始截取,截取到开始结束索引(不含)处(包前不包后)
System.out.println("hello".substring(2, 4));
trim()
:将字符串前后空格去除
// 去除指定字符串前导和后置空格(中间不影响)
System.out.println(" hello world ".trim());;
join
:将一个CharSequence数组转换为字符串(使用特定分隔符)-static(java8新增)
String join = String.join("-", "h", "e", "l", "l", "o");
System.out.println(join);
1.3 动态参数列表
在JDK5中,新增一种动态数组参数语法技术,允许可以在声明方法参数是使用...
表示数组参数,例如:
public static void test2(String... s){
for (String s1 : s) {
System.out.println(s1);
}
}
public static void main(String[] args) {
//传入的参数个数不限
test2("kobe","james","wade","curry","mc");
}
注意事项:
- 如果方法的参数除了动态数组参数之外,还有其他类型的参数,则这些类型参数必须声明在参数最前面,即:动态参数列表只能位于参数的最末尾
public static void test2(int i,String... s){ for (String s1 : s) { System.out.println(s1); } }