👨💻作者简介:👨🏻🎓告别,今天
📔高质量专栏 :☕java趣味之旅
欢迎🙏点赞🗣️评论📥收藏💓关注
💖衷心的希望我的📙作品能给大家带来收获。
🎊前言:
让我们如大自然般🌱悠然自在😊地生活一天吧,
别因为有坚果外壳或者蚊子翅膀落在铁轨上🛤️而翻了车🚆。让我们该起床时🛏️就赶紧起床🛏️,
该休息🛏️时就安心休息🛏️,
保持安宁而没有烦扰的心态;身边的人要来就让他来,要去就让他去,
让钟声🕰️回荡,让孩子👼哭喊—
下定决心好好地过一天。
🙏希望大家都可以过好每一天。也🙏希望我的博客,能给大家带来💯收获。
1. String的进阶方法
1.1 字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
代码示例: 字符串的替换处理
public static void main(String[] args) {
String str = "hihihello" ;
String ret = str.replace('h','p');//替换所有第一个字符,为第二个参数
System.out.println(ret);
String ret1 = str.replace("hi","ppp");//可以替换字符串
System.out.println(ret1);
String ret2 = str.replaceAll("hi","pt");
System.out.println(ret2);
String ret3 = str.replace("hi","pu");//替换第一个内容
System.out.println(ret3);
System.out.println(str);
}
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.
1.2 字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:
代码示例: 实现字符串的拆分处理
String str = "hello world hello wanwan";
String[] result = str.split(" ");//分割之后存入数组中
for (String s:result) {
System.out.println(result);
}
代码示例: 字符串的部分拆分
public static void main(String[] args) {
String str = "hello world hello wanwan";
String[] result1 = str.split(" ",2);//limit限定分格几组
for (String s:result1) {
System.out.println(result1);
}//拆分两部分并不是从中间拆分,而是从第一个空格,进行拆分
String[] result2 = str.split(" ",10);
for (String s:result2) {
System.out.println(result2);
}
}
如果分割次数超出最大次数,结果以最大分割次数呈现
代码示例: 拆分IP地址
String str = "192.168.1.1" ;
String[] result = str.split(".") ;
for(String s: result) {
System.out.println(s);
}
String[] result1 = str.split("\\.") ;
for(String s: result1) {
System.out.println(s);
}
String str1 = "192\\168\\1\\1";
String[] ret2 = str1.sqlit("\\\\");
for(String s: result2) {
System.out.println(s);
String str2 = "name=zhangnasan&age=10";
String[] ret3 = str1.sqlit("&|=");
for(String s: result3) {
System.out.println(s);
}
注意事项:
1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
1.3 字符串截取
从一个完整的字符串之中截取出部分内容。可用方法如下:
代码示例: 观察字符串截取
String str = "helloworld" ;
System.out.println(str.substring(5)); 从指定索引截取到结尾
System.out.println(str.substring(0, 5));截取部分内容
注意事项:
1. 索引从0开始.这里如果传入的是0下标,那么默认回原来的对象
2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
1.4 其他操作方法
代码示例: 观察trim()方法的使用
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]")
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).
代码示例: 大小写转换
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
这两个函数只转换字母。
2. 字符串的特性
2.1 字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1. String类在设计时就是不可改变的,String类实现描述中已经说明了
以下来自JDK1.8中String类的部分实现:
String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
1. String类被final修饰,表明该类不能被继承
2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。//通过第三张图可以看出
2.所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
【纠正】网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。
public static void main(String[] args) {
final int array[] = {1,2,3,4,5};
array[0] = 100;
System.out.println(Arrays.toString(array));
// array = new int[]{4,5,6}; // 编译报错:Error:(19, 9) java: 无法为最终变量array分配值
}
那如果想要修改字符串中内容,该如何操作呢?
2.2 字符串修改
注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s); // 输出:hello world
}
但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。
public static void main(String[] args) {
long start = System.currentTimeMillis();
String s = "";
for(int i = 0; i < 10000; ++i){
s += i;
}
long end = System.currentTimeMillis();//获取当前系统的时间戳
System.out.println(end - start);
start = System.currentTimeMillis();
StringBuffer sbf = new StringBuffer("");
for(int i = 0; i < 10000; ++i){
sbf.append(i);
}
end = System.currentTimeMillis();
System.out.println(end - start);
start = System.currentTimeMillis();
StringBuilder sbd = new StringBuilder();
for(int i = 0; i < 10000; ++i){
sbd.append(i);
}
end = System.currentTimeMillis();
System.out.println(end - start);
}
可以看待在对String类进行修改时,效率是非常慢的,因此:尽量避免对String的直接需要,如果要修改建议尽量使用StringBuffer或者StringBuilder。
b. 借助StringBuffer 和 StringBuilder