Java--String

Java 中 String 与 StringBuffer 和 StringBuilder 的区别

String类中常用的API

1. 判断字符串内容是否相等的方法

public boolead equals(Object anObject)

2. 忽略大小写判断字符串内容是否相同的方法

public boolean equalsIgnoreCase (String anotherString)

测试

public class Test {
      public static void main(String[] args) {
          String str1="abc";
          String str2="abc";
          String str3="ABC";
          System.out.println(str1.equals(str2));//true
          System.out.println(str1.equals(str3));//false
          System.out.println(str1.equalsIgnoreCase(str3));
  
     }
 }

3. 获取功能的方法

public int length() 返回字符串长度

public String concat (String string)  将指定字符串连接到该字符串末尾

public char charat(int index)  返回指定索引处的char值

public int indexOf(String str) 返回指定字符串第一次出现的地方

public String substring (int beginIndex)  剪取字符串,字符串的范围为从begin到末尾

测试

package com.uin;
  
  public class Test {
      public static void main(String[] args) {
         String str1="abc";
         String str2="abc";
         System.out.println("字符串长度是:"+str1.length());
         String concat = str1.concat(str2);
         System.out.println("连接后的字符串:"+concat);
         System.out.println("第一个字母:"+str1.charAt(0));
         System.out.println("b第一次出现地方的索引:"+str1.indexOf("b"));
         String substring = str1.substring(1);
         System.out.println("截取后的字符串:"+substring);
     }
 }

image-20220119110402843

4. 转换功能的方法

public char[] toCharArray() 将字符串转换为数组

public byte[] getbytes()  将字符串转换为新的字节数组

public String replace(CharSequence target,CharSequence replace) 替换字符串中的指定字符

测试

public class Test {
    public static void main(String[] args) {
         String str1="abc";
         char[] chars = str1.toCharArray();
         byte[] bytes = str1.getBytes();
         System.out.println("转换为数组:");
         for (int i = 0; i < chars.length; i++) {
              System.out.print(chars[i]+",");
         }
         System.out.println();
         System.out.println("转换为字节数组:");
         for (int i = 0; i < bytes.length; i++) {
             System.out.print(bytes[i]+",");
         }
         System.out.println();
         String replace = str1.replace("a", "A");
         System.out.println("替换后的字符串:"+replace);
     }
 }

image-20220119110614864

5. 分割方法

public String[] split(String regex)将字符串按照指定的分隔符分隔成数组
package cn.itcast;

import com.alibaba.druid.sql.visitor.SQLASTOutputVisitorUtils;

public class Test {
    public static void main(String[] args) {
        String str1="aa,bb,cc";
        String[] split = str1.split(",");
        System.out.println("以逗号分隔:");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }

    }
}

image-20220119110804697

推荐阅读

面试题

package com.uin.string;


/**
 * @author wanglufei
 * @description: TODO
 * @date 2021/12/17/8:07 AM
 */
public class test {
    public static void main(String[] args) {
      	
        String s1 = "HelloWorld";
        String s2 = new String("HelloWorld");
        String s3 = "Hello";
        String s4 = "World";
        String s5 = "Hello" + "World";
        String s6 = s3 + s4;//等价于 String s6 = new String(s3+s4)
        
        //false
      	// == 比较的是对象的地址。
        System.out.println(s1 == s2);
        //true
        System.out.println(s1 == s5);
        //false
        System.out.println(s1 == s6);
        //false
        System.out.println(s1 == s3 + "World");
      	//intern() 先判断"HelloWorld"是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则					//处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量池的引用,实际在堆中存在。
        //true
      	//强制从常量池中获取字符串,若不存在,则在常量池中创建一个字符串对象。
        System.out.println(s1 == s6.intern());
        //false
        System.out.println(s2 == s2.intern());
    }
}
首先记住一点,栈区存引用和基本类型,而堆区存对象。
字符常量池独立于栈和堆而存在,存储不可变量
String s1 = "HelloWorld";
这种形式定义的String。首先栈区创建s1的引用,然后在字符串常量池中寻找其只想的内容的为"HelloWorld"的对象,如果有,则s1指向该对象地址。如果没有,会在字符串常量池中创建一个,s1指向创建的字符串地址。
通过这种方式创建的可能创建一个对象或者不创建对象。
  
String s2 = new String("HelloWorld");
因为是new对象,会在堆(Heap)中创建对象s2,同时如果这个"HelloWorld"字符串在字符串常量池不存在,会在字符串常量池中创建这个string对象。
  
String str1 ="ABC";
String str2 = "AB";
String str3 = str2 +"C"
System.out.println(str1 == str3); //false
因为str2+"C"的过程是创建了一个StringBuffer对象,然后用StringBuffer对象执行append()方法追加上去的,最后才转换成String类型,也就是str3是放在堆(Heap)里面的对象,str1是放在常量池里的。两个的内存地址不一样。

image-20220119111120141

介绍

String 是 Java 中很常用的类之一,同时,字符串是 Java 面试中最重要的话题之一。

StringBuffer 和 StringBuilder 类提供了操作字符串的方法。

我们将研究 StringBuffer 和 StringBuilder 之间的区别。

StringBuffer 与 StringBuilder 的区别是 Java 中很常见的面试题。

在控制台上打印程序的内容,可以使用 String。此博客介绍 String 类的主要功能,然后我们将比较 StringBuffer 和 StringBuilder 类。

String

注意一个常见的错误,不要记错了。因为 String 是 final 修饰的,无法被继承。所以 String 不是 Java 的基本数据类型。
字符串在 Java 中是不可变的,因此适合在多线程环境下使用。
当我们使用双引号创建一个字符串时,如下,JVM 首先在字符串池中寻找具有相同值的字符串。

String str1 = "ABC";

如果找到了,它将返回字符串池中的字符串对象的引用。否则,它会在字符串池中创建字符串对象并返回引用。JVM 通过在不同的线程中使用相同的字符串,节省了大量的内存。

如果使用 new 运算符创建字符串,则会在堆中创建它。

运算符 + 是为 String 重载的,我们可以用它来串联两个字符串。尽管在内部它使用 StringBuilder 来执行这个动作。

两个字符串只有在它们具有相同字符串的时候才相等,equals() 方法区分大小写。如果您正在寻找不区分大小写的检查,您应该使用 equalsIgnoreCase() 方法。

拼接字符串

由于 String 在 Java 中是不可变的,因此每当我们执行字符串拼接操作时,它都会生成一个新的 String 并丢弃旧的 String 以进行垃圾收集。
这些重复的操作会在堆中产生大量垃圾冗余。所以 Java 提供了 StringBuffer 和 StringBuilder 类,应该用于字符串操作。
StringBuffer 和 StringBuilder 是 Java 中的可变对象。

它们为字符串操作提供了 appendinsertdeletesubstring 方法。

StringBufferStringBuilder
线程安全非线程安全
同步非同步
始于 Java 1.0始于 Java 1.5

在 Java 1.4 之前,StringBuffer 是字符串操作的唯一选择。但是,它的一个缺点是所有公共方法都是同步的。 StringBuffer 提供线程安全性,但以性能为代价。

在大多数情况下,我们不会在多线程环境中使用 String。所以 Java 1.5 引入了一个新类 StringBuilder,除了线程安全和同步之外,它与 StringBuffer 类似。

StringBuffer 有一些额外的方法,例如 substring, length, capacity, trimToSize 等。但是,这些不是必需的,因为 String 中也有所有这些。这就是为什么这些方法从未在 StringBuilder 类中实现的原因。

StringBuffer 是在 Java 1.0 中引入的,而 StringBuilder 类是在查看 StringBuffer 的缺点后在 Java 1.5 中引入的。

假设在单线程环境中或无关线程安全,要使用 StringBuilder。反之,使用 StringBuffer 进行线程安全的操作。

总结

  • String 是不可变的,而 StringBuffer 和 StringBuilder 是可变类。
  • StringBuffer 是线程安全和同步的,而 StringBuilder 不是。这就是 StringBuilder 比 StringBuffer 快的原因。
  • 字符串连接运算符 (+) 在内部使用 StringBuilder 类。
  • 对于非多线程环境中的字符串操作,我们应该使用 StringBuilder 否则使用 StringBuffer 类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值