调皮的String及多种玩法(下部)

👨‍💻作者简介:👨🏻‍🎓告别,今天

📔高质量专栏 :☕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.8String类的部分实现:

 

 

 String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

1. String类被final修饰,表明该类不能被继承

2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。//通过第三张图可以看出

2.所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

纠正】网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。

 这种说法是错误的,不是因为String类自身,或者其内部valuefinal修饰而不能被修改。

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

 

🎊总结

相关推荐

  1. 怎样合理规划游戏、关卡结构剧情线?

    2024-03-17 03:48:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 03:48:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 03:48:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 03:48:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 03:48:04       18 阅读

热门阅读

  1. 稳定币套利案例解析一 两个疑点

    2024-03-17 03:48:04       20 阅读
  2. 【Python学习笔记】Python近期总结

    2024-03-17 03:48:04       20 阅读
  3. 24计算机考研调剂 | 哈尔滨理工大学

    2024-03-17 03:48:04       22 阅读
  4. CentOS7下使用Dockers安装MinIO

    2024-03-17 03:48:04       16 阅读
  5. 【面经&八股】搜广推方向:面试记录(八)

    2024-03-17 03:48:04       19 阅读
  6. 程序员如何选择职业赛道

    2024-03-17 03:48:04       16 阅读
  7. LeetCode -- 76. 最小覆盖子串

    2024-03-17 03:48:04       18 阅读
  8. 前端如何识别上传的二维码---jsQR

    2024-03-17 03:48:04       18 阅读
  9. 计算机安全

    2024-03-17 03:48:04       17 阅读
  10. MySQL 中的锁机制详解

    2024-03-17 03:48:04       19 阅读
  11. transformer注意力权重系数绘图

    2024-03-17 03:48:04       18 阅读
  12. vue数据

    vue数据

    2024-03-17 03:48:04      14 阅读
  13. 以太坊的扩容方案之二层网络 L2-Rollup & zkEVM

    2024-03-17 03:48:04       18 阅读