java string什么是字符串常量,什么是字符串数组,什么是字符串常量池?

java string什么是字符串常量,什么是字符串数组,什么是字符串常量池?

1个回答

  在 Java 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。
  8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:

1)直接使用双引号声明出来的String对象会直接存储在常量池中。
2)如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中

jdk6 和 jdk7 下 intern 的区别
String s = new String("abc")这个语句创建了几个对象? 这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了2个对象,第一个对象是”abc”字符串存储在常量池中,第二个对象在JAVA Heap中的 String 对象。

来看一段代码:

打印结果是
jdk6 下false false
jdk7 下false true
具体为什么稍后再解释,然后将s3.intern();语句下调一行,放到String s4 = "11";后面。将s.intern(); 放到String s2 = "1";后面。是什么结果呢

打印结果为:
jdk6 下false false
jdk7 下false false

1,jdk6中的解释

注:图中绿色线条代表 string 对象的内容指向。 黑色线条代表地址指向。

如上图所示。首先说一下 jdk6中的情况,在 jdk6中上述的所有打印都是 false 的,因为 jdk6中的常量池是放在 Perm 区中的,Perm 区和正常的 Java Heap 区域是完全分开的。上面说过如果是使用引号声明的字符串都是会直接在字符串常量池中生成,而 new 出来的 String 对象是放在 JAVA Heap 区域。所以拿一个 JAVA Heap 区域的对象地址和字符串常量池的对象地址进行比较肯定是不相同的,即使调用String.intern方法也是没有任何关系的。

2,jdk7中的解释
再说说 jdk7 中的情况。这里要明确一点的是,在 Jdk6 以及以前的版本中,字符串的常量池是放在堆的 Perm 区的,Perm 区是一个类静态的区域,主要存储一些加载类的信息,常量池,方法片段等内容,默认大小只有4m,一旦常量池中大量使用 intern 是会直接产生java.lang.OutOfMemoryError: PermGen space错误的。 所以在 jdk7 的版本中,字符串常量池已经从 Perm 区移到正常的 Java Heap 区域了。为什么要移动,Perm 区域太小是一个主要原因,当然据消息称 jdk8 已经直接取消了 Perm 区域,而新建立了一个元区域。应该是 jdk 开发者认为 Perm 区域已经不适合现在 JAVA 的发展了。

正式因为字符串常量池移动到 JAVA Heap 区域后,再来解释为什么会有上述的打印结果。

在第一段代码中,先看 s3和s4字符串。String s3 = new String("1") + new String("1");,这句代码中现在生成了2最终个对象,是字符串常量池中的“1” 和 JAVA Heap 中的 s3引用指向的对象。中间还有2个匿名的new String("1")我们不去讨论它们。此时s3引用对象内容是”11″,但此时常量池中是没有 “11”对象的。
接下来s3.intern();这一句代码,是将 s3中的“11”字符串放入 String 常量池中,因为此时常量池中不存在“11”字符串,因此常规做法是跟 jdk6 图中表示的那样,在常量池中生成一个 “11″ 的对象,关键点是 jdk7 中常量池不在 Perm 区域了,这块做了调整。常量池中不需要再存储一份对象了,可以直接存储堆中的引用。这份引用指向 s3 引用的对象。 也就是说引用地址是相同的。
最后String s4 = "11"; 这句代码中”11″是显示声明的,因此会直接去常量池中创建,创建的时候发现已经有这个对象了,此时也就是指向 s3 引用对象的一个引用。所以 s4 引用就指向和 s3 一样了。因此最后的比较 s3 == s4 是 true。
再看 s 和 s2 对象。 String s = new String("1"); 第一句代码,生成了2个对象。常量池中的“1” 和 JAVA Heap 中的字符串对象。s.intern(); 这一句是 s 对象去常量池中寻找后发现 “1” 已经在常量池里了。
接下来String s2 = "1"; 这句代码是生成一个 s2的引用指向常量池中的“1”对象。 结果就是 s 和 s2 的引用地址明显不同。图中画的很清晰。

来看第二段代码,从上边第二幅图中观察。第一段代码和第二段代码的改变就是 s3.intern(); 的顺序是放在String s4 = "11";后了。这样,首先执行String s4 = "11";声明 s4 的时候常量池中是不存在“11”对象的,执行完毕后,“11“对象是 s4 声明产生的新对象。然后再执行s3.intern();时,常量池中“11”对象已经存在了,因此 s3 和 s4 的引用是不同的。
第二段代码中的 s 和 s2 代码中,s.intern();,这一句往后放也不会有什么影响了,因为对象池中在执行第一句代码String s = new String("1");的时候已经生成“1”对象了。下边的s2声明都是直接从常量池中取地址引用的。 s 和 s2 的引用地址是不会相等的。
[java] view plain copy 在CODE上查看代码片派生到我的代码片
String str1 = new StringBuilder("php").append("a").toString(); //toString调用的是new String(0,value,count)

System.out.println(str1.intern()==str1); //true

String str2 = new StringBuilder("ja").append("va").toString();

System.out.println(str2.intern()==str2); //false 原因是java是关键字已经在常量池中存储了,所以调用intern()返回池中对象

小结
从上述的例子代码可以看出 jdk7 版本对 intern 操作和常量池都做了一定的修改。主要包括2点:
将String常量池 从 Perm 区移动到了 Java Heap区
String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
什么是字符串常量池?
字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为 了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中, 就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是...
Java| 什么是字符串常量池( String Pool )?
顾名思义,Java 中的字符常量串池( String Pool )是一个存储在 Java 堆内存中的字符串池。 我们知道 String 是 java 中的特殊类,我们可以使用 new 操作创建 String 对象,也可以使用双引号来创建 String 对象. 字符串常量池在哪里? 字符串常量池 ( String Pool )存在于方法区 在分析字符串常量池的位置时,首先了解一下堆、栈、方法区:...
字符串常量池之一二三
在理解字符串常量前,我们先熟悉一下如何创建一个字符串,在Java中有两种方法可以创建一个字符串对象: 使用new运算符。例如: 1 String str = new String("Hello"); 使用字符串常量或者常量表达式。例如: 1 2 String str="He
什么是C++字符串数组
什么是C++字符串数组,最好举例说明,要有源码
什么是string::npos?
如题,npos是啥?string::npos又是啥?
什么是Java?什么是JavaWeb?
Java 简介 Java语言是当前最流行的开发语言之一。它的风格十分接近C++语言,是一个纯粹的面向对象的程序设计语言。Java继承了C++语言面向对象技术的核心,舍弃了C++语言中复杂和一些容易出错的特性,并在内存管理方面得到了增强。  Java语言有20年的历史 1995年Sun公司推出Java语言 1996年发布第一个 Java开发包Jdk1.0 随后的时间里, Java技术不断更
什么是JVM?什么是JAVA?
一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java语言的跨平台并不是指Java语言本身跨平台,而是Java源程序编译后的字节码文件的跨平台,Java程序执行过程是Java源文件编译成.class字节码文件,再由jvm翻译成不同操作平台的机器码并执行,跨平台就是在不同操作平台安装不同的jvm,而字节码文件都是一样的,这是因为jvm屏蔽所有有关操作平台的信息,字节码文件翻...
JAVA中什么是类,什么是方法,什么是属性,什么是对象
public class XXX 这是什么。nnpublic void XXX 这是什么。nnAA aa = new AA(); 这是什么。nnaa.XX(); 这是什么。nnaa(); 这是什么。nnprivate AA aa; 这是什么。nnaa = bb; 这是什么。nnaa= bb.xx(); 这是什么。nnpublic void AA(BB bb, CC cc) 里面的是什么。nnAA 这是什么。nn这些东西,用专业名词如何说啊!!n心里知道是什么,却不知道如何表达。n哪个大神对理论知识熟悉的,介绍下。n当然这是基础知识。
什么是http,什么是tomcat,什么是Servlet
为了不让网络编程在自己看来是一个黑盒子 在学习tomcat和servlet,jsp之前,需要了解这些一、tomcat是一个封装和实现了http传输协议的容器,那么http是什么?http全称是超文本传输协议 即是指从万维网服务器端(http server端)传送超文本到本地浏览器的协议 它是基于安全连接tcp/ip协议产生的 所谓超文本传输,传输的即是html/css/js可视化前端代码 h
什么是用户线程,什么是守候线程?什么是守护进程?
有的人说,线程总体分两类:用户线程和守候线程。但是却没说明白什么是用户线程,什么是守候线程?有什么区别?我在程序里写的属于哪个阿?rn还有,有的人还说,有守护进程。守护进程又是什么东东呢?我们的项目程序里怎么没有阿?
什么是三层?什么是DNA?什么是....
我初接触Delphi,rn很多东西听不明,大家能给我解答一下吗rn什么是三层?rn什么是DNA?rn什么是B/Srn什么是C/Srn怎样学好Delphirn
什么是数据库,什么是SQL,什么是MySQL
数据库 是一种数据集合。这种数据集合是有组织的,有序的。 数据库中包含【表】。【表】是由【列】组成的。【表】对信息独有的描述方式叫作模式。【表】的存储方式是按【行】存储。 【模式】负责对接受到的信息进行分解和命名,从而储存进表中。 SQL 是这一种用来和数据库通信的语言。 SQL 特点是 语言简单,描述性强,灵活强大。 大多数DBMS(数据库管理系统),都支持SQL语言。不同的D
什么是数据结构,什么是控制结构,什么是程序结构?
如题
什么是类?什么是OLE?什么是ACTIVEX?
初学VC,不懂就问。什么是类?和普通函数有什么区别?OLE是什么?其中的容器,MINI-SERVER和FULL-SERVER又是什么意思?ACTIVEX是什么?
什么是物理模型,什么是数据模型,什么是逻辑模型?
什么是物理模型,什么是数据模型,什么是逻辑模型?rn
什么是接口?什么是虚拟类?什么是抽象类??
请高手解答。。。。rn搜索的答案太复杂了。。。rn 请有经验的高手通俗点说。。。rn能有例子最好
什么是ETF,什么是QDII,什么是QFII?
交易型开放式指数基金   交易型开放式指数基金,通常又被称为交易所交易基金(Exchange Traded Funds,简称“ETF”),是一种在交易所上市交易的、基金份额可变的一种开放式基金。 交易型开放式指数基金属于开放式基金的一种特殊类型,它结合了封闭式基金和开放式基金的运作特点,投资者既可以向基金管理公司申购或赎回基金份额,同时,又可以像封闭式基金一样在二级市场上按市场价格买卖ETF...
什么是网关?什么是ap?什么是ac?
网关是一种ac,管理终端设备,终端设备通过loura wifi等无线协议连接到网关,网关设备为其分配内存空间存储相关设备信,然后上报到控制器。
什么是需求?什么是bug?什么是测试用例?
目录 (一)什么是需求 (二)什么是bug (三)什么是测试用例 ## (一)什么是需求 需求分为 用户需求 和 软件需求。 用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务。该需求一般比较简略。 软件需求:或者叫功能需求,该需求会详细描述开发人员必须实现的软件功能。 (二)什么是bug 当且仅当规格说明是存在的并且正确,程序与规格说明之间的...
什么是正弦?什么是余弦?什么是反余弦?
如题:最好带图说明?
什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,什么是接口。...
简单来说,类就是对一个事物抽象出来的结果。比如人可以作为一个类。一般来说,一个类具有成员变量和成员方法。成员变量相当于属性,比如‘人’具有的变量有胳膊,手脚等。而成员方法是该类能完成的一些功能,比如‘人’可以说话(talk),行走(walk)等。 对象,如果说类是一个抽象概念,那么对象就是具体对象。比如我们说‘人’就是一个抽象概念,但是具体到某个人,比如你,我,他,就是一个‘人’对象。 封装,简单...
什么是内连接?什么是左连接什么是右连接?什么是组合查询
单表查询不能满足要求,通过多表关联实现预期的需求 订单详情表orderdetail中有订单表的订单order_id和商品表的商品items_id,这两个字段称为orderdetail表的外键,他们之间存在关联关系 为什么会存在关联信息? 订单详情表orderdetail和商品表items为例,为什么要进行分开呢,以商品表为例,因为会存在很多一样的商品,如果每一件这种商品都使用订单表进行存储,那...
请问什么是强类型?什么是弱类型? 什么是显式转换?什么是隐式转换
请问什么是强类型?什么是弱类型? 什么是显式转换?什么是隐式转换
谁来帮我解释一下,什么是SOA?什么是AJAX?什么是敏捷开发,什么是XP开发?
如题,以及还有些什么新名词?该怎么去理解它们。谢谢!
什么是缓存区buffer? 什么是通道channel?什么是多路复用selector?什么是io多路复用技术?
学习笔记(简单概念介绍)什么是buffer? 首先Buffer是一个对象 它包含一些要写入或者要读出的数据。Buffer api 参考地址  https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html什么是channel?Channel 是一个通道,网络数据通过Channel 来读取和写入。channel是全双工的什么是select...
什么是对象,什么是类,什么是面向对象的编程语言,什么是面向面向对象的编程思想?
什么是对象,什么是类,什么是面向对象的编程语言,什么是面向面向对象的编程思想? 什么是对象,对象就是拥有属性值得特殊数据类型。 JavaScript对象是这样,Java类也是这样,任何面向对象的编程语言都是这样。面向对象的变成思想,其实就是这个意思。 看一个编程语言是不是面向对象的,就看他的数据类型里,有没有一种类型,是拥有属性值得,即有没有类的概念,由此来看Java是有
什么是三层?什么是分布式系统?什么是COM?什么是DCOM?
如题,特别是DCOM跟分布有什么关系?
什么是数据仓库?什么是联机分析?什么是数据挖掘?什么是集群技术?
关系型数据:是以关系数学模型来表示的数据。它以二维表的形式来描述数据 关系型数据库系统:硬件(客户机、服务器)、操作系统、关系型数据库管理系统和数据库、关系型数据应用系统、用户 什么是数据仓库 什么是联机分析 什么是数据挖掘 什么是集群技术 oracle2种工作模式:C/S和B/S 数据库服务器体系结构 进程结构(用户进程、服务器进程) 内存结构(系统全局区SGA(用户进程和服务...
什么是模型,什么是模式
模型(model)与模式(Pattern),英文显然是两个词,但是,在实际使用过程中,却是比较混乱。 虽然,我还不清楚厘清这两个词的关系,对基层的数学工作者有怎样的价值,但是至少对理解什么是数学是有益处的,能够帮助我们不止是了解数学的结论,而且了解数学的思考方法。     一、模型与数学模型       (一)模型的定义:       数学辞海第5卷第109页有关于模型的定义:模型
什么是VoLTE?什么是4G+?
什么是VoLTE?VoLTE是基于IMS的语音业务。VoLTE即Voice over LTE,它是一种IP数据传输技术,无需2G/3G网,全部业务承载于4G网络上,可实现数据与语音业务在同一网络下的统一。现在我们用的4G网络只是用来实现数据传输,语音通话用的是3G或是2G,走的是CS域,所以VoLTE和之前的语音通话有着本质的区别。VoLTE是架构在4G网络上全IP条件下的端到端语音方案。VoLTE
什么是数据库范式?什么是设计范式?
设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
什么是类?什么是对象?
对这2个概念有点模糊rn谁能通俗的解释一下rn谢~
什么是引用类型,什么是值类型
我知道他们的区别,值类型是直接储存数据,而引用类型是储存在其相应的内存上的位置,rn我想知道他们的概念是什么
什么是"静态成员" 什么是"实例成员"?
请问 什么是"静态成员" 什么是"实例成员"?rnrn请详细解答, 也可以把书上的概念抄写在上面
到底什么是并口什么是串口?
请问,什么是宽带,什么是带宽!
您好:rn 感谢解答。
什么是JAVABEAN,什么是JAVABEANS。
今天居然下雨了。
什么是SOA,什么是工作流
什么是SOA,什么是工作流rn怎么学起啊~~
什么是ASM???什么是DDK???
-
什么是SDK?什么是中间件?
请对其做一些说明。
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池