Java中String类型的创建关系、什么是常量池、以及StringBuilder/Buffer等

news/2024/11/28 5:26:25/

Java的String字符串使用

	String s1 = "Hello World";String s2 = "Hello World";String s3 = new String("Hello World");String s4 = new String("Hello World");System.out.println(s1==s2); // trueSystem.out.println(s1==s3); // falseSystem.out.println(s3==s4); // false

这段 Java 代码中,字符串 s1 和 s2 都使用字面量的方式赋值,它们在编译时会被放入常量池中。由于字符串常量池的特性,s1 和 s2 在常量池中的引用地址是相同的,因此 s1 == s2 的结果为 true。

而字符串 s3 和 s4 是通过 new 关键字创建的,它们在内存中是两个不同的对象,因此 s3 == s4 的结果为 false。
需要注意的是,字符串比较应该使用 equals() 方法,而不是 == 操作符。在上述代码中,使用:

System.out.println(s1/s2/s3/s4.equals(s1/s2/s3/s4));

输出结果都出结果都是true。




扩充知识1:什么是常量池

Java 常量池(Constant Pool)是 Java 虚拟机在执行程序时所维护的一块内存区域,它用于存放在编译期被确定,并被保存在 class 文件中的各种常量、符号引用和字面量等。

常量池中包含了以下类型的常量:

字面量:包括字符串、数字和布尔型常量。
符号引用:包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
运行时常量:包括动态生成的字符串和类名等。

在 Java 中,字符串常量池和类常量池是两种常量池,分别用于存放字符串常量和类常量。字符串常量池用于存放字符串字面量,类常量池用于存放类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。

由于 Java 常量池的特性,相同的字符串字面量在常量池中只会被存储一次,因此多个引用变量可以共享同一个字符串字面量,从而减少了内存的占用。例如:

String s1 = "Hello World";
String s2 = "Hello World";
System.out.println(s1 == s2); // true

在这个例子中,字符串 “Hello World” 只会被存储一次,s1 和 s2 都引用同一个字符串字面量,因此 s1 == s2 的结果为 true。

需要注意的是,通过 new 关键字创建的字符串对象不会被放入常量池中,每次创建都会生成一个新的对象。例如:

String s3 = new String("Hello World");
String s4 = new String("Hello World");
System.out.println(s3 == s4); // false

在这个例子中,字符串 s3 和 s4 是通过 new 关键字创建的,它们在内存中是两个不同的对象,因此 s3 == s4 的结果为 false。




扩充知识2:String | StringBuilder | StringBuffer

String、StringBuilder 和 StringBuffer 都是 Java 中用于处理字符串的类,它们有以下的区别:

  1. String 类型是不可变的,一旦创建就不能修改。而 StringBuilder 和 StringBuffer 类型都是可变的,可以随时修改其值。
  2. 在字符串拼接时,如果使用 String 类型进行拼接,会导致创建大量的中间字符串对象,这会占用大量的内存和系统资源。而 StringBuilder 和 StringBuffer 类型则不会创建中间对象,可以直接对字符串进行修改,因此在频繁的字符串拼接操作中,StringBuilder 和 StringBuffer 的效率更高。
  3. StringBuilder 是线程不安全的,而 StringBuffer 是线程安全的。在多线程环境下,使用 StringBuffer 类型可以避免竞争条件的发生,但是会带来一定的性能开销。
  4. StringBuilder 和 StringBuffer 的 API 是类似的,但是 StringBuffer 中的方法都是 synchronized 关键字修饰的,因此在使用 StringBuffer 时需要考虑到同步的问题。而 StringBuilder 则没有这个问题。

因此,如果不需要考虑多线程的安全问题,可以使用 StringBuilder 类型来进行字符串的拼接和修改。如果需要考虑多线程的安全问题,则应该使用 StringBuffer 类型。如果只是进行字符串的读取和操作,可以使用 String 类型。


http://www.ppmy.cn/news/39286.html

相关文章

线性回归算法

class LR_LS(): def __init__(self): self.w None def fit(self, X, y): # 最小二乘法矩阵求解 # show me your code self.w np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) # show me your code def predict(self…

重复的子字符串代码随想录刷题 (力扣刷题)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/repeated-substring-pattern 为什么会使用KMP 在一个串中查找是否出现过另一个串…

集合详解之(三)单列集合接口Set及具体子类HashSet、TreeSet

文章目录🐒个人主页🏅JavaSE系列专栏📖前言:🎀Set集合接口🎀HashSet实现类🎀TreeSet实现类🪅HashSet类常用方法:🪅TreeSet类常用方法:&#x1f41…

访问学者评审工作的考察内容

访问学者评审工作主要从以下几方面进行考察: 一、申请人的综合素质及发展潜力。 二、申请人的主要业绩及获奖情况。 三、出国研修学科专业及方向的需要程度、国内和国际发展水平的差距。 四、出国访学的必要性、研修计划的可行性及访学目标的应用前景。 五、访学…

监控专题zabbix

官网:zabbix.com 官网源可以去阿里云镜像,然后单独用一台服务器连接外网使用reporsync同步repo本地源 就可以实现内网的源更新了 vim /etc/repos.d/zabbix.repo reporsync --repoid仓库名称 同步更新仓库源 一、zabbix服务器安装 1、安装zabbix和m…

2023.4.3学习日志

一,今天在用mybaties加springmvc改四阶段项目 1.controller大致代码 RestController RequestMapping("/user") public class UserController {Autowiredprivate UserService userService;PostMapping("/add")public ResultDTO add( UserVO us…

vite+ts 中全局定义的方法无法识别 类型报错 类型“{ $: ComponentInternalInstance;...“

因为有一些全局的方法 我们直接挂在了 app.config.globalProperties app.config.globalProperties {filters : (str) > return "我是过滤器" str }然后可以直接在模板中使用这些方法 比如一些过滤器什么的东西 但是我们挂完之后 发现在模版中使用的时候 会出现…

图解redis中的复制

目录 1.背景: 2.新版复制 2.1PSYNC 3.复制的实现 3.1设置主服务器的地址和端口 3.2建立套接字连接 3.3发送ping命令 3.4身份验证 3.5发送端口信息 3.6同步 3.7命令传播 1.背景: 在Redis中,用户可以通过执行SLAVEOF命令或者设置slav…