零底子Java第二十期:熟悉String(二)

[复制链接]
发表于 2025-12-5 12:39:40 | 显示全部楼层 |阅读模式


目次
 一、String的常用方法
1.1. 去除左右两边的空缺
 1.2. intern方法
1.3. 字符串的不可变性 
1.4. 字符串修改
二、StringBuilder和StringBuffer
2.1. StringBuilder的先容 
2.2. append方法
2.3. capacity方法 


一、String的常用方法

1.1. 去除左右两边的空缺

       利用trim方法会去掉字符串开头和末端的空缺字符,好比空格、换行、回车、制表符、翻页符等空缺字符都可以去除。这个方法针对用户输入时的场景,好比,用户再搜刮框内里输入了一些空格,一样平常属于偶然义的数据,trim方法就能进步“容错性”。
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         String str = new String("\t\t\thello\n\n\n");
  4.         System.out.print(str);
  5.         System.out.print(str.trim());
  6.     }
  7. }
复制代码

  1. String str1 = "hello";//字面值常量,本身就在池中
  2. char[] arrays = {'h','e','l','l','o'};
  3. String str2 = new String(arrays);
  4. System.out.println(str1 == str2);
复制代码
 1.2. intern方法

        某些字符串常量我们必要经常利用,intern方法可以资助我们把字符串常量手动入池中。如许能资助我们优化步调的服从,也能低沉步调内存的开销。 
  1. String str1 = "hello";//字面值常量,本身就在池中
  2. char[] arrays = {'h','e','l','l','o'};
  3. String str2 = new String(arrays);
  4. String str3 = str2.intern();
  5. System.out.println(str1 == str2);
  6. System.out.println(str1 == str3);
复制代码
        上面的代码中,str2字符串由于在池外,str1在池内,以是说str2与str1所指向的所在差别。
  1. public native String intern();
复制代码
        JVM我们来看一下intern的源码,可以看到这个方法没有实现,而且另有一个native关键字,如许的方法称之为“当地方法”。如许的方法没有在Java中实现,而是在JVM上实现的。JVM本体是由C++编写的,要想看到这里的逻辑实现,就必要下载JVM源码。
1.3. 字符串的不可变性 

        String类是不能修改的,全部的修改都会创建新对象,服从非常低下。这里的修改是对象本体不能修改,而不是String的引用不能修改。

        为啥String是不可变的呢?我们来看一下String内里的源码,可以看到内里的字节数组被private修饰。针对这个数组,String没有提供public方法。那为啥要把String计划成不可修改呢?1. 方便实现字符串对象池,假如 String 可变, 那么对象池就必要思量写时拷贝的题目了;2. 不可变对象是线程安全的。3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的生存到 HashMap 中。
  1. //String的源码
  2. private final byte[] value;
复制代码
1.4. 字符串修改

  1. public class Main {
  2.     public static void main(String[] args) {
  3.         String str = "hello";
  4.         str += " world";
  5.         System.out.println(str);//结果为“hello world”
  6.     }
  7. }
复制代码
        但是这种方式不保举利用,由于其服从非常低,中央创建了很多多少临时对象。我们还可以利用StringBuffer大概StringBuilder。
二、StringBuilder和StringBuffer

2.1. StringBuilder的先容 

方法阐明
StringBuff append(String str)在尾部追加,相当于String的+=,可以追加
char charAt(int index)获取index位置的字符
int capacity()获取底层生存字符串空间总的巨细
void ensureCapacity(int mininmumCapacity)扩容
void setCharAt(int index, char ch)将index位置的字符设置为ch
int indexOf(String str)返回末了一次出现str的位置
int indexOf(String str, int fromIndex)从fromIndex位置开始查找str第一次出现的位置
        博主在这里只重点先容一下append和capacity方法
2.2. append方法

  1. //这里没有创建一个新的对象
  2. StringBuilder str1 = new StringBuilder("hello");
  3. str1.append(" world");
  4. System.out.println(str1);
复制代码
        下面博主会用一个例子来带你更直观地感受StringBuilder的上风。
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         String str1 = "";//空字符串
  4.         StringBuilder str2 = new StringBuilder("");
  5.         int time = 10_000;
  6.         //获取时间戳
  7.         long startTime = System.currentTimeMillis();
  8.         for (int i = 0; i < time; i++) {
  9.             str2.append(i);
  10.         }
  11.         long endTime = System.currentTimeMillis();
  12.         System.out.println("时间: " + (endTime - startTime));
  13.         main2(args);
  14.     }
  15. //每次都创建新的对象
  16.     public static void main2(String[] args) {
  17.         String str1 = "";//空字符串
  18.         StringBuilder str2 = new StringBuilder("");
  19.         int time = 10_000;
  20.         //获取时间戳
  21.         long startTime = System.currentTimeMillis();
  22.         for (int i = 0; i < time; i++) {
  23.             str1 += i;
  24.         }
  25.         long endTime = System.currentTimeMillis();
  26.         System.out.println("时间: " + (endTime - startTime));
  27.     }
复制代码
 

        留意,这里打印出来的效果单元是毫秒。 
2.3. capacity方法 

  1. public class Main {
  2.     public static void main(String[] args) {
  3.         StringBuilder str1 = new StringBuilder("hello");
  4.         System.out.println(str1.capacity());//容量是21
  5.         str1.ensureCapacity(128);
  6.         System.out.println(str1.capacity());//修改之后的容量是128
  7.     }
  8. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表