字符串常量池到底存放的是字符串引用还是字符串对象

如题所述

你看看String源码就明白了,是对象!

s="123";
写这句话的时候,会在常量池先找有没有123这个字符串对象如果没有,他就开始抽取,1,2,3
然后拼接成一个对象即:"123";
假如后面又来一个也需要这个对象,比如说s1="123";
这个时候在操作s1的时候还是先去常量池找有没有这个对象,如果有,直接把地址拿过来,因为常量池数据为共享的,
假如这个时候s1="1234";那么常量池是没有的,就会重新抽取,1,2,3,4,然后重新拼接成一个新的对象放在常量池!
String源码里面有一个私有变量一个字符类型的数组,他就是用来抽取这些单个字符,然后拼接成
一个字符串对象!
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-11-01
引用,相同内容的字符串,会返回同一个引用
第2个回答  2018-10-16
众所周知,JDK1.8版本中,String常量池已经从方法区中的运行时常量池分离到堆中了,那么在堆中的String常量池里存的是String对象还是引用呢?我在网上查了一晚上,各有各的说法,最后索性直接查看API(果然API才是最强大的!!!),废话少说,直接上图:
(此图为JavaAPI中的阐述,我是用手机在网页打开的百度,不能复制图片,想看的原图可以去下面的原文链接里面看一下)

翻译一下,String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。 对于任意两个字符串s和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。所有字面值字符串和字符串赋值常量表达式都使用 intern方法进行操作。
所以答案显而易见,官方都给了明确说明,还有什么好争论的呢?

转载自CSDN博主(木舟遥)————https://blog.csdn.net/weixin_39460458/article/details/79982765

字符串常量池到底存放的是字符串引用还是字符串对象
答案是有5个。每一个+都会产生一个字符串,因此如果你不用StringBuilder则每多一个+就会多产生2个字符串。而如果你写成:StringBuilderstrb=newStringBuilder("abc");strb.append("hello");strb.append("world");这里只有3个字符串常量和一个StringBuffer对象。每多append一个新的字符串,最多多出一个...

什么叫做字符串常量池
这个常量池是一个运行时用于保存字符串对象的内存区域。当创建一个字符串字面量时,Java会首先检查字符串常量池中是否已经存在一个具有相同内容的字符串对象。如果存在,则不会创建新的对象,而是直接引用已存在的对象;如果不存在,则会在常量池中创建一个新的字符串对象。2. 为了提高效率:这种机制的...

什么是字符串常量池
字符串常量池(String Constant Pool)是Java语言中的一个重要概念。它是一个内存区域,用于存储重复使用的字符串字面量。当你在代码中创建多个字符串字面量时,Java虚拟机会将它们放入字符串常量池中,只有当这些字符串字面量确实不同时,才会在内存中创建新的对象实例。这样,可以减少内存的分配和垃圾...

JS 的字符串如何分配内存?通过 Chrome Devtools 给出证明
JS 中的字符串存在字符串常量池中,被栈或堆上的变量引用。如果变量的值是字符串字面量,则在栈上的变量直接引用字符串常量池中的字符串;如果是字符串是 new String 创建的,则会在堆上创建 String 对象,指向字符串常量池中的字符串,栈上变量指向堆中的 String 对象。我们通过 Chrome Devtools ...

java中字符串常量放在哪里
String str=new String("abc");* 所以通过new操作符的操作都是在堆完成的 它创建两个对象 abc对象和str引用对象 两个必须存放在堆中 str指向堆中的abc对象 也就是说 两个对象和str的地址全部存放在堆中 因为使用了new操作符 所以下面的例子里str2,str3和str4即使是值都为abc因为str2的地址在...

Java 基础:String——常量池与 intern
字符串字面量在Java中是常量池中的关键概念,它们在堆中创建对象后,其引用被插入到常量池。在JDK6及之前,常量池存储对象本身;而在JDK7及以上版本中,常量池存储的是对象的引用。通过实例,我们可以观察到:JDK6中,如`String s4 = "33" + "3";`,s4创建了两个对象,即使内容相同,但因为常量...

String类及字符串常量池的学习
运行时常量池则是方法区的一部分,存放了常量池中的内容以及类的符号引用解析后的直接引用。综上所述,String类的创建涉及多个重要概念,包括字符串常量池、运行时常量池和字节码常量池,以及字符串对象在堆中的创建和引用管理。通过深入理解这些机制,可以更高效地使用String类,并避免常见的性能问题。

java 字符串常量池
一、前言 字符串常量池是Java内存优化机制之一,旨在提高性能并减少内存消耗。二、字符串常量池解析 创建字符串时,先检查字符串常量池中是否存在同值字符串,若有则直接引用;若无,则创建并放入常量池。这优化了效率与内存使用。三、String实例对比 "str"与new String()差异:前者可能创建或不创建对象...

什么叫做字符串常量池
字符串常量池,简单来说,是Java内存中为String类型变量预留的一块专门区域。当你在代码中定义一个字符串变量,如`String a = "abc";`时,Java首先会在常量池中搜索是否存在这个字符串。如果找到,JVM会直接返回该字符串的内存地址给变量a,避免了重复创建。例如,当你再次声明`String b = "abc";`...

java 常量池 到底是在堆中还是栈中?
常量池:存放字符串常量和基本类型常量(public static final)。对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

相似回答