split
#1 含义:将字符串根据 指定分隔符分割成多个字串,并返回子串数组
有两个重载方法:
# String[] list = s.split(int separator)
根据给定分割符 seprator,将字符串s分割成多个子串
# String[] list = s.split(int separator, int limit)
根据给定分割符 separator,将字符串s分割成多个子串
1 若limit >0,则 separator最多运用limit-1次,即最多将字符串分割成limit个;
特殊:limit=1,则相当于没有分割;
limit < 分隔符出现的次数,则最后一个子串包含字符串剩下的字符串;
limit > 分隔符出现的次数,相当于limit <0,尽可能运用separator
2 若limit =0,则尽可能多的运用separator,并且结尾如果是空字符串,则丢弃
s.split(int separator)方法,limit参数默认 =0;
3 若limit <0,则可能多的运用separator(结尾是空字符串也会保留存入到数组中)
#2 使用:
String s = "ab,cd,ef";
String[] strList = s.split(",");
----> strList = [ab, cd, ef]
(1)示例
[1]示例:
String s = "adgd,13,,54,";
//没有limit参数,则limit默认为0
//limit==0,则如果结尾是空字符串,不会将空字符串放入数组中;但是处于中间的空字符串会放入数组中
String[] list = s.split(",");
System.out.println("子串数组长度:" + list.length);
for (String s1 : list) {
System.out.println(s1);
}
结果:
子串数组长度:3
adgd
13
54
[2]示例:有limit参数
String s = "adgd,13,54,,";
//设置了limit的值,如果limit值比字符串中分隔符出现的次数还大,则相当于全部分割开来,此时相当于limit <0
//如果limit < 分隔符出现的次数,则最后一个子串包含字符串剩下的字符串
String[] list = s.split(",",10);
System.out.println("子串数组长度:" + list.length);
for (String s1 : list) {
System.out.println(s1);
}
结果:
子串数组长度:5
adgd
13
54
join
#1 合并:将数组中的元素合并成一个字符串
有两个重载方法:
# String str = StringUtils.join(T... element);
合并多个元素,元素T可以是Object类型的
只有一个element时,element如果是List、Set集合,则 str = [num1,num2...]
只有一个element时,element如果是数组Object[],则 str = num1num2
# String str = StringUtils.join(List<String> list, String seperator);
将list中的元素通过分隔符seperator合并在一起,list必须是集合或是数组
seperator是分隔符,如果为"", 则没有分隔符,数组元素直接连接;
注意:seperator为""和 seperator为null,输出的结果是不一样的;seperator为null就是第一种重载方法
#2 注意:
1 第一种重载方法可以有多个对象,join方法会将多个对象合并在一起
2 如果seperator为null,则表示没有分隔符,使用第一种重载方法;
如果seperatorwei"",则表示有分隔符,但分隔符为空字符串,list
3 StringUtils.join(list);
和 StringUtils.join(list,"");的区别
# 无分隔符时,join(list)方法将list对象封装在一个 Object[]数组中
此时,遍历一次,将list这个对象的数据都放进数组了;
因此,得到 [ab, cd] 这样的结果
# 有分隔符时,join(list, "")方法将list对象作为一个 Object[]数组
此时,遍历一次,将list中某个位置的元素输出;
因此,得到 abcd 这样的结果
#3 使用:
List<String> list = new ArrayList<>();
Collections.addAll(list, "ab", "cd", "ef");
String str = StringUtils.join(list, "_");
----> str = "ab_cd_ef"
(1)示例:
Set<String> set = new HashSet<>();
set.add("dg");
set.add("eg");
System.out.println(StringUtils.join(set));
System.out.println(StringUtils.join(set, ""));
结果:
[eg, dg]
egdg
🔴String、List、String[]互转
# String -> String[]:使用String的split方法
String[] strs = str.split(",");
# String -> List<String>:先获得String[],再根据List的特性获取List
List<String> list = ArrayList.asList(str.split(","));
# String[] -> String:使用String或StringUtils的join方法
String str = String.join("", strs);
或 String str = StringUtils.join(strs, "");
# List<String> -> String:跟String[]一样
String str = String.join("", list);
或 String str = StringUtils.join(list, "");
# String[] -> List<String>:使用List的特性-> asList
List<String> list = Arrays.asList(strs);
# List<String> -> String[]:使用List的特性-> toArray
String[] strs = list.toArray(new String[list.size()]);
判断字符串的前缀
#1 startsWith(prefix)
判断字符串是否以字符串s为前缀
是,则返回true;否,则返回false;
#2 方法的重载
1 startsWith(String prefix)
判断字符串是否以s为前缀
2 startsWith(String prefix, int offset)
判断字符串从s[offset]开始,是否以字符串prefix为前缀
#3 方法的变异:endsWith(suffix)
判断字符串是否以字符串suffix为后缀
1 endsWith实现的代码也是以startsWith代码为准的
只是offset是value.length - suffix.length, 这样直接跳到了倒数suffix长度的位置开始逐位比较字符
#4 使用:
String str = "abcdef";
boolean status = str.startsWith("ab");
源代码:
public boolean startsWith(String prefix, int toffset) {
char ta[] = value;
//让value 从toffset开始比较是否以什么为前缀
int to = toffset;
char pa[] = prefix.value;
int po = 0;
int pc = prefix.value.length;
if ((toffset < 0) || (toffset > value.length - pc)) {
return false;
}
//开始逐位比较
while (--pc >= 0) {
if (ta[to++] != pa[po++]) {
return false;
}
}
return true;
}
示例:
//实现让字符串以 \
char suffix = '\';
String s = "abcdef";
if (!s.endsWith(String.valueOf(suffix))){
s += "" + suffix;
}