一切从String str = new String("abc")说起...
这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。
我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。
首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:
形式一:String str = "abc";
形式二:"abc"
其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。
如果有如下的两行代码:
String str1 = "abc";
String str2 = "abc";
那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。
然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。
现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象
JAVA 字符串驻留池
时间: 2024-10-09 23:37:32
JAVA 字符串驻留池的相关文章
字符串驻留池的另类用法
起因 事情的起因是这样的 基于某些无法避免的因素 我有2个dll 暂且叫 a.dll 和 b.dll 这2个类库中有一部分完全相同的代码(下文中称为代码C)——遍历当前应用程序下的所有类库文件,并注入插件(没错,就是IOC了) 当开发人员仅引用a.dll或仅b.dll的时候,并没有任何问题 但是如果一个项目需要同时引用 a.dll 和 b.dll 那么麻烦就来了 那部分完全相同的代码会被执行2次, 所有插件都会被加载2次 经过 最简单的方案当然是把a.dll和b.dll中相同的代码 抽出成c.d
java字符串常量池
卧虎藏龙,是一款手机3D游戏.其效果和Pc端3D效果类似,个人感觉还是很好的. 之前曾经看过一个卧虎藏龙的轻功视频,视频内容是从武当山广场开始起跳,施展轻功一直飞到山脚下的视频.之后我对卧虎藏龙就一直很期待. 但是这次封测我只升到了24级,封测便停了,并没有玩到可以施展轻功的地步,或者我没有掌握技巧,这是一个小的遗憾. 因为之前玩Pc游戏刀剑/ 剑侠情缘三,就是看中了其中的轻功系统.而卧虎藏龙的轻功操作更让人有玩的冲动,文学功底不行,所以不会描述,大家可以百度一下这个轻功视频:http://1
Java字符串常量池是什么?为什么要有这种常量池?
简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池.我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引号("")创建字串对象. Java中的字符串常量池 下图,清楚地解释了如何在Java堆内存中维护字符串常量池,以及当我们使用不同的方式创建字符串时在堆内存中如何存放. 之所以有字符串常量池,是因为String在Java中是不可变(immutable)的,它是String interning
.Net字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量地址指向新创建的字符串地址. string s1 = "Hello"; string s2 = "Hello"; bool b = Object.ReferenceEquals(s1, s2); Console.WriteLine(b); //输入 True 它们是同一
java 字符串对象池
java字符串是一个类,是java虚拟机在启动的时候会实例化9个对象池,其中9个对象池分别用来存储8种基本数据类型(int,float,double,byte,boolean,short,long,char)的包装类和String对象. Java String创建对象有两种方式,其中一种是通过直接创建:String str1="Stringhello",另外一种是通过构造函数:String str2=new String("stringhello");前者是通过在对
关于java字符串常量池
今天发现一个好玩的东西 public static void main(String[] args) { String str1 = new StringBuilder("ja").append("va").toString(); System.out.println(str1.intern() == str1);//false String str2 = new StringBuilder("
什么是字符串常量池?
什么是字符串常量池? 在理解字符串常量前,我们先熟悉一下如何创建一个字符串,在Java中有两种方法可以创建一个字符串对象: 使用new运算符.例如: 1 String str = new String("Hello"); 使用字符串常量或者常量表达式.例如: 1 2 String str="Hello"; //(字符串常量) 或者 String str="Hel" + "lo"; //(字符串常量表达式). 这些字符串的创建方
(一)Python入门-2编程基本概念:18字符串-驻留机制-内存分析-字符串同一判断-值相等判断
一:字符串驻留 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中. Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_).字母 和数字)会启用字符串驻留机制驻留机制. 二:字符串比较和同一性 我们可以直接使用==,!=对字符串进行比较,是否含有相同的字符. 我们使用is / not is,判断两个对象是否为同一个对象.比较的是对象的地址,即 id(obj1)是 否和 id(obj2)相等. 三:成员操作符 in /not in 关键字,判断某个字符(
Java中的字符串常量池
最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的? 答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu