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

这篇具有很好参考价值的文章主要介绍了Java中String类型的创建关系、什么是常量池、以及StringBuilder/Buffer等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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); // true
	System.out.println(s1==s3); // false
	System.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 类型。文章来源地址https://www.toymoban.com/news/detail-403042.html

到了这里,关于Java中String类型的创建关系、什么是常量池、以及StringBuilder/Buffer等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7.1 String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

    可变性 简单的来说: String 类中使用 final 修饰字符数组来保存字符串, private final char value[] ,所以 String 对象是不可变的。 补充(来自issue 675):在 Java 9 之后,String 、 StringBuilder 与 StringBuffer 的实现改用 byte 数组存储字符串 private final byte[] value 而 StringBuilder 与 Str

    2024年02月15日
    浏览(35)
  • String类的学习笔记(下):字符串拼接以及StringBuilder和StringBuffer的学习

    本文介绍了String类对字符串进行拼接的方法 和拼接字符串的效率分析 以及能对字符串内容进行修改的StringBuilder和StringBuffer类其常用方法和区别 , 最后介绍了两个字符串经典面试题 1.String常用方法学习-2.String的不可变和字符串常量池-StringBuilder和StringBuffer String类是Java中用来描

    2024年02月05日
    浏览(55)
  • Java中的String、StringBuffer和StringBuilder

    在 Java 中,字符串是最常用的数据类型之一。 Java 中有三种处理字符串的方式:String、StringBuffer 和 StringBuilder。它们都被设计为处理字符串操作,但是它们之间有所不同。本篇博客将会介绍 String、StringBuffer 和 StringBuilder 的区别以及如何在 Java 中使用这些类型。 在 Java 中,

    2024年02月02日
    浏览(41)
  • java基础四-String/StringBuffer/StringBuilder区别

    String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。 StringBuffer 和

    2024年02月14日
    浏览(46)
  • Java字符串知多少:String、StringBuffer、StringBuilder

    String 是 Java 中使用得最频繁的一个类了,不管是作为开发者的业务使用,还是一些系统级别的字符使用, String 都发挥着重要的作用。 String 是 不可变 的、 final 的,不能被继承,且 Java 在运行时也保存了一个字符串池(String pool) ,就使得 String 变得很特殊。 实现三个接口:

    2024年02月06日
    浏览(50)
  • 【java】关于String、StringBuffer和StringBuilder的那些事

      目录 一、String 1、构造方法 2、字符串的不可变性 3、字符串的比较 4、 String的常用方法: 二、StringBuider和StringBuffer 1、字符串的拼接 2、StringBuider与StringBuffer 总结     String类提供的构造方式非常多,常用的就以下两种:   注意: 1、String 是引用类型,内部并不存储字符串

    2024年04月10日
    浏览(54)
  • 【数据结构】String类对象的创建与字符串常量池的“神秘交易”

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:

    2024年02月08日
    浏览(48)
  • 【JAVA】String ,StringBuffer 和 StringBuilder 三者有何联系?

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 在之前的文章中我们介绍了JAVA中String的运用方法,事实上在JAVA字符串操作中仅仅只知道String方法是远远不够的,今天我们要介绍的 StringBuffer 和 StringBuilder 在字符串操作中同样占据总要地位。 和 String 类不同的是,S

    2024年02月14日
    浏览(52)
  • java StringBuilder对比String的优点和15个经典案例

    Java中的 StringBuilder 类和 String 类在处理字符串时有显著的区别,主要体现在可变性、性能以及线程安全性等方面: 可变性: String :是不可变的。每次对 String 对象进行拼接、替换等操作时,都会创建一个新的 String 对象,原始对象保持不变。 StringBuilder :是可变的。它提供了

    2024年02月02日
    浏览(36)
  • 【后端面经-Java】String与StringBuffer与StringBuilder的比较

    目录 1. String 2. StringBuffer 3. StringBuilder 4. 性能提升 5. 总结和比较 面试模拟 参考资料 不可变 查看 String 源码如下:由源码可知,String中存储数据的数组被 final 修饰,因此是不可变的 运算和操作 创建对象 创建对象有两种方式:两种方式都会在栈中创建一个字符串变量

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包