一、String

「Java-API帮助文档」,链接:https://pan.quark.cn/s/d7ced3b48f33

在 Java 中,字符串(String) 是一个非常重要的类,下面先简单介绍一下字符串吧:

不可变性(Immutable)

  • Java 中的字符串是不可变的,即一旦创建,其内容不能被修改。
  • 任何对字符串的修改操作(如拼接、替换)都会生成一个新的字符串对象。

常用创建方式

1、直接赋值:String str = "Hello";//节约内存

  • 字符串存储在字符串常量池(String Pool)中【字符串常量池是JVM中的一块内存区域,用于存储字符串字面量,避免重复创建相同字符串。】,相同内容的字符串会共享同一内存地址。

2、使用 new 关键字:String str = new String("Hello");

  • 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。

代码示例

package com.hongwu.apidemo;

public class Stringdemo1 {
    public static void main(String[] args) {

        String s1 = "abc";
        System.out.println(s1);

        String s2 =new String("abc");
        System.out.println(s2);

        char[] chs ={'a','b','c','d'};//常用
        String s3 = new String(chs);
        System.out.println(s3);

        byte[] bytes ={97,98,99,100};//常用
        String s4 = new String(bytes);
        System.out.println(s4);
    }
}

结果输出:

abc
abc
abcd
abcd  //代码输出 "abcd" 是因为 String(byte[] bytes) 构造方法依据默认字符集将 byte 数组中的 ASCII 码值转换为了对应的字符。

二、字符串的比较equals()

在Java中,String类的equals方法是用于比较两个字符串的内容是否相同的方法。与==操作符不同,==比较的是两个字符串对象的地址是否相同(前面说过:直接赋值方式,相同内容的字符串会共享同一内存地址),而equals方法比较的是字符串的实际内容。我们来看一下示例:

String str1 = "Hello";
String str2 = "Hello";
String str3 = "World";

System.out.println(str1.equals(str2)); // 输出: true
System.out.println(str1.equals(str3)); // 输出: false

equals与==的区别

  • ==比较的是两个字符串对象的引用是否相同,即它们是否指向同一个内存地址。
  • equals比较的是两个字符串的内容是否相同。
String str1 = new String("Hello");
String str2 = new String("Hello");

System.out.println(str1 == str2);      // 输出: false
System.out.println(str1.equals(str2)); // 输出: true

在比较字符串时,通常使用equals方法而不是==,因为==可能会因为字符串的创建方式(如使用new关键字)而返回错误的结果。String类还提供了equalsIgnoreCase方法,用于忽略大小写比较字符串内容。

用户登录练习

import java.util.Scanner;

public class StringDemo2 {
    public static void main(String[] args) {

        //1定义用户名和密码
        String rightUsername = "张三";
        String rightPassword = "123456";
        Scanner sc = new Scanner(System.in);
//进入循环
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名");
            String username = sc.next();
            System.out.println("请输入密码");
            String password = sc.next();
//比较用户名和密码
            if (username.equals(rightUsername) && password.equals(rightPassword)) {
                System.out.println("登录成功");
                break;
            } else {
                if (i == 2) {
                    System.out.println("账号已被锁定,请联系客服解决");
                } else {
                    System.out.println("用户登陆失败,请重新登录,您还剩下" + (2 - i) + "次机会");
                }
            }
        }
    }
}

三、StringBuilder

StringBuilder是Java中用于高效处理字符串的一个类,特别适用于需要频繁修改字符串内容的场景。与String类不同,String是不可变的(即一旦创建,内容不能更改)而StringBuilder是可变的,允许在不创建新对象的情况下修改字符串内容。

StringBuilder提供了多种方法来动态修改字符串内容,如追加、插入、删除和替换等,下面简单介绍一下都有哪些方法:

append:在字符串末尾追加内容。

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 结果: "Hello World"

insert:在指定位置插入内容。

sb.insert(5, ","); // 结果: "Hello, World"

delete:删除指定范围的字符。

sb.delete(5, 6); // 结果: "Hello World"

replace:替换指定范围的字符。

sb.replace(6, 11, "Java"); // 结果: "Hello Java"

reverse:反转字符串。

sb.reverse(); // 结果: "avaJ olleH"

toString():转换成字符串 

public class StringDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        String str = sb.toString();//再把SB转换回字符串
        System.out.println(str); // 输出: "Hello World"
    }
}

 对称字符串练习

public class StringDemo3 {
    public static void main(String[] args) {
        //1.键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();

        //2.反转键盘录入的字符串
        String result = new StringBuilder().append(str).reverse().toString();

        //3.比较
        if(str.equals(result)){
            System.out.println("当前字符串是对称字符串");
        }else{
            System.out.println("当前字符串不是对称字符串");
        }
    }
}

【Java】字符串_jvm

四、StringJoiner 

StringJoiner是Java 8引入的一个用于拼接字符串的工具类,它提供了灵活的方式来定义连接符、前缀和后缀,并且可以高效地将多个字符串连接成一个字符串。与StringBuilder相比,StringJoiner更适合处理需要分隔符、前缀和后缀的字符串拼接场景。

  • 字符串拼接:将多个字符串以指定的分隔符连接成一个字符串。
  • 前缀和后缀:可以在拼接的字符串前后添加自定义的前缀和后缀。
  • 简化代码:相比手动使用StringBuilder拼接分隔符,StringJoiner提供了更简洁的API。

add():将字符串添加到StringJoiner中。

joiner.add("Hello").add("World");

merge():合并另一个StringJoiner的内容。

StringJoiner joiner2 = new StringJoiner("-");
joiner2.add("Java");
joiner.merge(joiner2);

toString():返回拼接后的字符串。

String result = joiner.toString(); // 输出: [Hello,World,Java]

length():返回拼接后字符串的长度。

int len = joiner.length();

 完整代码练习

import java.util.StringJoiner;

public class StringDemo4 {
    public static void main(String[] args) {

        // 1. 创建一个StringJoiner对象,指定分隔符为", ",前缀为"[",后缀为"]"
        StringJoiner sj = new StringJoiner(", ", "[", "]");
        sj.add("Hello").add("World"); // 添加"Hello"和"World",结果为"[Hello, World]"
        
        StringJoiner joiner2 = new StringJoiner("-");
        joiner2.add("Java").add("666"); 
        System.out.println(joiner2);
        
        sj.merge(joiner2); // 合并
        int len = sj.length(); // 计算字符串的长度,结果为24
        
        // 2. 打印
        System.out.println(len); // 输出: 24
        System.out.println(sj); // 输出: [Hello, World, Java-666]
        String str = sj.toString(); // 转换为String类型
        System.out.println(str); // 输出: [Hello, World, Java-666]
    }
}

【Java】字符串_jvm_02