Java中关于字符串常量池的详解!!!

这篇具有很好参考价值的文章主要介绍了Java中关于字符串常量池的详解!!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Java使用 “ ” 称为字符串常量,为了提高程序的运行速度,节省空间,JVM会维护一个字符串常量池。当字符串常量第一次出现,则产生新对象并将该对象置入常量池中,后续如果再出现该字符串常量,不会产生新对象,直接复用常量池中的已有对象。

1. 直接赋值法,默认从常量池中取对象

  • “ ” 内容都是字符串常量,都是字符串对象
  • 字符串对象不可变,无法修改value的内容
//第一次出现,产生新对象,入池
String s1="hello";
//第二次出现,不会产生新对象
String s2="hello";

以上代码的内存示意图s1==s2
Java中关于字符串常量池的详解!!!

2. new一个对象

  • new一个对象,需要调用构造方法进行新对象的创建。
  • 每调用一次new,都会在堆上开辟新空间,返回新创建的对象。
  • 总之:看见new就会产生新空间!!!
    对如下代码进行分析:
//直接赋值法
String s1="hello";
String s2="hello";
//构造方法产生新对象
String s3=new String("hello");
String s4=new String("hello");

分析:对于s1和s2来说,属于直接赋值类型,产生字符串对象放入字符串常量池,s2将会直接从字符串常量池取出已有对象,则s1==s2。s3属于构造方法new一个新对象,需要在堆区开辟一个新的空间,其中value值保存的是字符数组的地址。
Java中关于字符串常量池的详解!!!
上述代码共产生三个对象,一个在常量池中,两个在堆上;产生了4个引用,其中s1和s2指向的是常量池中的对象,s3和s4分别指向的是堆中的对象。

3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系

  • 字符串常量池中保存的都是字符串对象;
  • 字符串对象内部的value引用是指向字符数组的引用;
    举例:
    假如将CSDN的博客内容相当于字符数组的内容;value引用保存了这块内容的地址;字符串对象相当于博客链接;CSDN相当于字符串常量池,保存了许多字符串对象,即链接!
    new出来的字符串对象中的value引用,只是一个名字,指向字符数组,不是实体!!!

4. 手动入池方法:intern方法

将手动创建的字符串对象置入常量池,并返回置入常量池之后的地址。
看如下的代码:

char[] ch={'a','b','c'};
String s1=new String(ch)String s2="abc";
System.out.println(s1==s2);

s1:通过new的方式产生的字符串仍然在堆中存储,不会置入常量池
s2:字符串常量产生后直接置入常量池
s1 != s2

char[] ch={'a','b','c'};
String s1=new String(ch);
s1.intern();
String s2="abc";
System.out.println(s1==s2);

此时,将堆上new出来的新对象通过intern()方式手动置入常量池,当“abc”出现时,常量池中已经包含,因此,s2直接返回常量池中存储的地址。
s1 == s2
Java中关于字符串常量池的详解!!!

String s2="abc";
char[] ch={'a','b','c'};
String s1=new String(ch);
s1.intern();
System.out.println(s1==s2);

此时,s2属于直接赋值法将产生的字符串对象直接放入字符串常量池中;
s1属于new出来的对象放置在堆区,s1.intern()方法执行后的返回值无人接收,s1依旧指向的是堆区的字符串对象的地址。
s1 != s2
Java中关于字符串常量池的详解!!!

补充介绍intern()方法
尝试将当前字符串对象置入常量池;
若常量池中不存在该对象内部保存的内容“abc”,则将当前对象置入常量池;
若常量池中已经存在该对象保存的内容,则该方法直接返回常量池中的字符串对象地址!
intern()方法调用后会返回常量池中的字符串地址,调用之后进行接收即可!

如果让s1去接收intern()方法的返回值,此时由于字符串常量池中包含字符串“abc“,因此直接返回常量池中的字符串对象地址,则s1==s2文章来源地址https://www.toymoban.com/news/detail-493396.html

到了这里,关于Java中关于字符串常量池的详解!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • IDEA java: 常量字符串过长问题解决

    Error:(41, 41) java: 常量字符串过长 1、字符串长度过长,导致idea默认使用的javac编译器编译不了。 解决办法: Javac编译器改为Eclipse编译器。 File-Settings-Build.Execution,Deployment-Compiler-Java Compiler 旭东怪的个人空间-旭东怪个人主页-哔哩哔哩视频 哔哩哔哩旭东怪的个人空间,提供旭东

    2024年02月11日
    浏览(58)
  • Java中关于String类以及字符串拼接的问题

    String为什么不可变? 答案 String s1=new String(\\\"abc\\\");创建了几个字符串对象 答案 str1它首先会去方法区的常量池中找,有“hello”这个对象就直接引用,没有就创建一个新的对象“hello”,存放在常量池中。 而new的方式首先会在堆中创建一个对象,然后再去常量池中找,有直接引用

    2023年04月26日
    浏览(42)
  • 数据结构(Java实现)-字符串常量池与通配符

    字符串常量池 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。 “池” 是编程中的一种常见的, 重要的提升效率的方式, 我们会在未来的学习中遇到各

    2024年02月10日
    浏览(50)
  • 36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

    ✏️ Java 中用 java.lang.String 类代表字符串 ✏️ 底层用 char[] 存储字符数据。从 Java9 开始,底层使用 byte[] 存储字符数据 🌿 字符串的底层是 char[] ,但是 char 数组和字符串不能等价。 char 数组是 char 数组,字符串是字符串。 🌿 C 语言中是可以把 char 数组 和字符串等价的 ✏️

    2023年04月08日
    浏览(63)
  • java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容

    项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。 如果我们使用 枚举 定义的话,idea 编译的时候就会出现编译报错 网上还有一个说法,说是编译器问题,修改 idea 工具的编译为 eclipse 即可。 但是结果我仍然不满意,所以我决定把他放在

    2023年04月13日
    浏览(114)
  • C语言常量(整型、实型、字符型、字符串、符号常量)

    对于C语言常量,该文章有详讲,由于文章太长,可参考如下思维导图和目录,可通过目录选择自己所需要的内容阅读。 整型常量即整数,包括正整数、负整数和零。C语言中,整型常量可以用十进制、八进制、和十六进制表示。 十进制表示: 由数字0-9,正、负号组成,如3

    2024年02月07日
    浏览(41)
  • C语言入门之变量、常量、字符串、转义字符

    文章目录 变量 常量 字符串 转义字符 1.变量的命名规则: 只能由字母(包括大写和小写)、数字和下划线( _ )组成。 不能以数字开头。 长度不能超过63个字符。 变量名中区分大小写的。 变量名不能使用。 2.变量的分类:         变量可以分为局部变量以及全局

    2023年04月19日
    浏览(63)
  • C语言——字符串常量初始化

            使用双引号括住字符串的字符来创建字符串常量。         使用字符数组来存储字符串常量。         使用字符串指针来初始化字符数组。         无论使用哪种方法,字符串常量在C语言中都是不可修改的。尝试修改字符串常量会导致未定义的行为。

    2024年01月23日
    浏览(52)
  • 【Go基础】编译、变量、常量、基本数据类型、字符串

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 使用 go build 1.在项目目录下执行 2.在其他路径下编译 go build ,需要再后面加上项目的路径(项目路径从GOPATH/src后开始写起,编译之后的可执行文件就保存再当前目录) 3.打包的时候自定义名字:

    2024年02月09日
    浏览(56)
  • JVM运行时数据区——字符串常量池位置的调整

            在JDK6及之前,使用永久代来实现方法区,字符串常量池(StringTable)是在 永久代(方法区)中 的,但是方法区的回收效率不高,在Full GC时才会回收。           在JDK7中,将字符串常量池 转移到了堆中 ,分配在年轻代和老年代中。         在JDK8中,为了 融合

    2024年02月16日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包