Java 中的字符串

目录

Java 中的字符串

字符串的创建

在 Java 中,可以通过以下几种方式创建字符串:

1.使用字符串字面量:

复制代码
String str = "Hello, World!";

2.使用 new 关键字和构造函数:

复制代码
String str = new String("Hello, World!");

3.使用 StringBuilder 或 StringBuffer 类的 toString() 方法:

复制代码
StringBuilder sb = new StringBuilder("Hello, World!");
String str = sb.toString();

字符串的比较

在 Java 中,比较字符串时需要注意以下几点:

  1. 使用 == 运算符比较字符串时,比较的是字符串的引用,而不是字符串的值。

    复制代码
    public class Client {
        public static void main(String[] args) {
            String a = "123"; //创建字符串
            String b = "123";
            System.out.println(a == b);
        }
    }

    原因:相同字符串的地址共用

    图解:

    new关键字是在堆内存中开辟内存空间

    == 对基本数据类型来说进行的是值的判断,对引用数据类型来说比较的是地址是否相等

    复制代码
    public class Client {
        public static void main(String[] args) {
            String a = "123"; //创建字符串
            String b = "123";
            String c = new String(original: "123"); //new关键字是在堆内存中开辟内存空间
            System.out.println(a == b);
            System.out.println(a == c);
            System.out.println(b == c);
            //== 对基本数据类型来说进行的是值的判断,对引用数据类型来说比较的是地址是否相等
        }
    }

    对基本数据类型来说 进行的是值的判断,基本数据类型只能用判断,没有equals()这个方法

    对引用数据类型来说 ==比较的是地址是否相等,equals()方法首先比较的是地址是否相等,如果相等返回true,如果不相等,比较的是值是否相等

  2. 使用 equals() 方法比较字符串时,比较的是字符串的值。

  3. 如果需要比较字符串的大小,可以使用 compareTo() 方法。

字符串的拼接

在 Java 中,可以使用 + 运算符或 concat() 方法来拼接字符串。

1.使用 + 运算符:

+这里会调用append()方法进行拼接,利用toString()方法生成new,toString()方法里有new关键字;new关键字是在堆内存中开辟内存空间

复制代码
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + ", " + str2 + "!";

public static void main(String[] args) {
    //字符串的拼接
    String s1 = "123";
    String s2 = "456";
    String s3 = s1 + s2;
    String s4 = "123456";
    System.out.println(s3 == s4);
}

原因:s3这里:调用了append()方法,进行了字符串拼接,形成了123456

执行顺序:

复制代码
@Override
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, from: 0, count);
    }
    return new String(toStringCache, share: true);
}

并且这里返回的是new,new关键字是在堆内存中开辟内存空间,

所以是flase

例题1:

例题2:

复制代码
String s1 = "123" + "456"; //编译是编译成123456
String s2 = "123456"; //编译是编译成123456
System.out.println(s1);
System.out.println(s1 == s2); //所以是true

图解:

2.使用 concat() 方法:

复制代码
String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(", " + str2 + "!");

如何定义一个空的字符串

字符串定义空的两种方法:

复制代码
String 张三=" ";//在栈,堆内存中有指向,但是没有数据

String 李四=null;//没有指向(指向是空)

String 王五;//不能使用,必须要初始化
相关推荐
2601_962106646 分钟前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
czq_268671948713 分钟前
Python打卡第46天
开发语言·python
杨凯凡39 分钟前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard1 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android1 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤1 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J3 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter4 小时前
ZPL文件预览
开发语言·c++
aiks_yuan4 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang6 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices