Java——字符串

2024-06-09 1299阅读

Java——字符串

前言

字符串详解


文章目录

  • 一、String类
    • 1.1 创建字符串
    • 1.2 String的操作
    • 二、StringBuilder类
    • 三、StringBuffer类
    • 四、StringJoiner类

      一、String类

      String类位于java.lang包中,用于表示字符串的不可变对象。

      1.1 创建字符串

      我们可以使用字面量和使用new关键字创建字符串,但有一些区别:

      字面量创建字符串:

      String str1 = "Hello, World!";
      String str2 = "Hello, World!";
      System.out.println(str1 == str2); // 输出: true,str1和str2指向的是同一个字符串对象
      

      当使用字面量创建字符串时,Java会先检查字符串常量池(String Pool)(在Java7之前,常量池在永久代,在7之后字符串常量池移至堆内存),中是否已经存在内容相同的字符串。如果存在,则直接返回池中的引用,而不会创建新的对象。如果不存在,则将该字符串添加到池中。

      使用new关键字创建字符串

      //将字符数组转换为字符串对象
      char[] charArray = {'H', 'e', 'l', 'l', 'o'};
      String str1 = new String(charArray);
      //使用字节数组的部分内容的构造方法,根据ASCII码找到对应的字符
      byte[] byteArray = {72, 101, 108, 108, 111};
      String str = new String(byteArray);
      System.out.println(str); // 输出: Hello
      //根据传递的字符串创建新的字符串对象
      String str3 = new String("Hello, World!");
      String str4 = new String("Hello, World!");
      System.out.println(str3 == str4); // 输出: false
      

      在这个例子中,str3和str4是两个不同的对象,即使它们的内容相同,因为每次new都会创建新的实例。


      1.2 String的操作

      基本操作:

      获取字符串长度

      String str1 = "Hello, World!";
      int length = str1.length();//length = 13
      

      获取指定位置的字符

      char ch = str1.charAt(0); // 'H'
      

      获取子字符串

      String subStr = str1.substring(0, 5); // "Hello"
      

      字符串比较:

      在使用new关键字创建对象时我们发现,直接将对象进行比较,即使字符串内容完全一致,返回的也是false,这是因为str3和str4实际上都是对内存中实际对象的引用,如果我们要比较字符串需要使用equals和equalsIgnoreCase方法

      String str3 = new String("Hello, World!");
      String str4 = new String("Hello, World!");
      System.out.println(str3 == str4); // 输出: false
      

      使用equals()方法

      boolean isEqual = str1.equals(str2);
      

      使用equalsIgnoreCase()方法,忽略大小写

      boolean isEqualIgnoreCase = str1.equalsIgnoreCase("hello, world!");
      

      字符串查找:

      查找子字符串的索引

      int index = str1.indexOf("World"); // 7
      

      判断是否包含子字符串

      boolean contains = str1.contains("World");
      

      字符串转换:

      转换为小写

      String lowerStr = str1.toLowerCase();
      

      转换为大写

      String upperStr = str1.toUpperCase();
      

      字符串拼接:

      使用+操作符

      String str4 = "Hello, " + "World!";
      

      二、StringBuilder类

      StringBuilder类用于创建和操作可变字符串。它是java.lang包的一部分,专门用于在需要对字符串进行频繁修改的场景下提高性能。

      我们知道String类创建的对象是不可变对象,也就是说,如果这意味着一旦一个String对象被创建,它的值就不能被修改,举例:

      String str1 = "Hello";
      String str2 = str1; // str2和str1引用同一个字符串对象
      str1 = str1 + " World"; // 会创建一个新的字符串对象,但str1引用的对象不会被修改
      System.out.println(str1); // 输出: Hello World
      System.out.println(str2); // 输出: Hello
      

      虽然我们对 str1 进行了拼接,但实际上是创建了一个新的字符串对象,并将 str1 指向这个新对象,而 str2 仍然指向原始的 “Hello” 对象。


      StringBuilder对象是可变的,这意味着它的内容可以在不创建新对象的情况下被修改。

      // 初始状态
      System.out.println("初始状态:");
      System.out.println("StringBuilder地址: " + System.identityHashCode(sb));
      // 追加字符串
      sb.append(" World");
      System.out.println("StringBuilder地址: " + System.identityHashCode(sb));
      //追加字符串前后的地址并不会改变
      

      StringBuilder的底层实现主要依赖于一个可变的字符数组 char[],以及一个表示当前字符串长度的整数 length。StringBuilder类提供了一系列方法来操作这个字符数组,从而实现字符串的各种操作,如追加、插入、删除、替换等。


      StringBuilder的基本操作

      StringBuilder sb = new StringBuilder("Hello");
      // 追加字符串
      sb.append(" World");
      System.out.println(sb.toString()); // 输出: Hello World
      // 插入字符串
      sb.insert(5, " Beautiful");
      System.out.println(sb.toString()); // 输出: Hello Beautiful World
      // 删除字符串
      sb.delete(5, 16);
      System.out.println(sb.toString()); // 输出: Hello World
      // 替换字符串
      sb.replace(6, 11, "Java");
      System.out.println(sb.toString()); // 输出: Hello Java
      // 反转字符串
      sb.reverse();
      System.out.println(sb.toString()); // 输出: avaJ olleH
      // 设置长度
      sb.setLength(5);
      System.out.println(sb.toString()); // 输出: avaJ
      

      三、StringBuffer类

      StringBuilder和StringBuffer都是Java中用于操作可变字符串的类,它们的主要区别在于线程安全性和性能特征。

      StringBuilder 是在 Java 5 中引入的,它是非线程安全的,但是在单线程环境中性能更好。主要特点包括:

      • 非线程安全:StringBuilder 的方法不是线程安全的,适合在单线程环境下使用。
      • 性能:由于不需要进行线程同步操作,StringBuilder 的性能通常比 StringBuffer 更高。
      • 可变性:StringBuilder 是可变的,允许在不创建新对象的情况下修改其内容。

        StringBuffer 是 StringBuilder 的前身,它从 Java 1.0 开始就存在了,提供了与 StringBuilder 类似的 API,但是它是线程安全的。主要特点包括:

        • 线程安全:所有 StringBuffer 的方法都是同步的,所以它是线程安全的,适合在多线程环境下使用。
        • 性能:由于需要进行线程同步操作,StringBuffer 的性能通常比 StringBuilder 差一些。
        • 可变性:StringBuffer 也是可变的,允许在不创建新对象的情况下修改其内容。

          四、StringJoiner类

          StringJoiner 是 Java 8 中引入的一个类,用于在处理字符串序列时,特别是以分隔符分隔的序列时,提供了方便的方法。它允许你指定一个分隔符、可选的前缀和后缀,然后通过追加元素来构建最终的字符串。

          主要特点和用法

          1. 构造方法

            StringJoiner 提供了多个构造方法,其中最常用的是带有分隔符参数的构造方法:

            StringJoiner sj = new StringJoiner(",", "[", "]");
            
            • 第一个参数是分隔符,用于将添加的元素分隔开。
            • 第二个参数是可选的前缀。
            • 第三个参数是可选的后缀。
            • 添加元素

              使用 add 方法向 StringJoiner 中添加元素:

              sj.add("Apple").add("Banana").add("Cherry");
              

              这会在 StringJoiner 中依次添加 “Apple”, “Banana”, “Cherry” 这三个元素,每个元素之间用逗号分隔。

            • 获取结果

              使用 toString 方法获取最终的合并结果:

              String result = sj.toString();
              

              在上面的例子中,result 的值将是 "[Apple,Banana,Cherry]"。

          可选操作

          • 设置空值处理

            可以通过 setEmptyValue 方法设置当 StringJoiner 没有任何元素时,默认的返回值:

            StringJoiner sj = new StringJoiner(",");
            sj.setEmptyValue("Empty");
            

            当没有任何元素被添加时,调用 toString 方法会返回 “Empty”。

          • 合并多个 StringJoiner

            可以使用 merge 方法合并多个 StringJoiner:

            StringJoiner sj1 = new StringJoiner(",");
            sj1.add("Apple").add("Banana");
            StringJoiner sj2 = new StringJoiner(",");
            sj2.add("Cherry").add("Date");
            sj1.merge(sj2);
            

            这将把 sj2 中的元素合并到 sj1 中。


            Java——字符串

            如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!

            欢迎大家提出疑问,以及不同的见解。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]