Java 字符串池

所谓天下文章皆是抄,在网上找一个Java 字符串池的文章,搜到N多条目,可看来看去也就两篇,总结如下:

首先看一段代码:

String a = "Hello";

String b = "Hello";

String c = new String("Hello");

String d = new String("Hello");

System.out.println(a == b);

System.out.println(b == c);

System.out.println(c == d);

System.out.println(a.equals(b));

System.out.println(b.equals(c));

System.out.println(c.equals(d));

结果是true,false,false,true,true,true。这里就涉及到字符 串池。“字符串池”,是Java为了提高内存利用率而采用的措施:当遇到String a = "Hello"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"Hello"对象,然后变量 a 指向这个地址;然后遇到语句String b = "Hello",这时字符串池中已经有 "Hello"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同, 对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true。那么String c = new String("Hello")又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。所以a == c返回false,c == d同样返回false。至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回true就不奇怪了。

Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池 中的一个对象。使用new操作创建的字符串对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的 字符串--使用equals方法确定,则直接返回池中的字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回 真。

时间: 2024-11-18 14:06:55

Java 字符串池的相关文章

Java字符串池(String Pool)深度解析

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool).字符串池由String类私有的维护. 我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值  2)采用new关键字新建一个字符串对象.这两种方式在性能和内存占用方面存在着差别. 方式一:采用字面值的方式赋值

Java字符串池(String Pool)深度解析(转)

出自  http://www.cnblogs.com/fangfuhai/p/5500065.html 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool).字符串池由String类私有的维护. 我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值  2)采用new关键字新建一个字符串对象.这两种方式在性能和内存占用方面

161207、高并发:java.util.concurrent.Semaphore实现字符串池及其常用方法介绍

实现字符串池: StrPool.java import java.util.ArrayList; import java.util.List; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class StrPool { private int poolMaxSiz

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常量池解析与字符串intern简介

在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构. 1.CONSTANT_Class入口解析 数组类的符号解析较为特殊.若是基本类型数组,那么虚拟机将创建该基本类型的新数组类,并创建一个Class实例来代表该类型,数组类的定义类加载器为 启动类加载器.若是引用类型的数组,那么在此之前还会进行引用类型的解析,数组类的定义类加载器为引用类型的定义类加载器. 非数组类和接口的的解析将经历以下步骤: (1

java字符串常量池

卧虎藏龙,是一款手机3D游戏.其效果和Pc端3D效果类似,个人感觉还是很好的. 之前曾经看过一个卧虎藏龙的轻功视频,视频内容是从武当山广场开始起跳,施展轻功一直飞到山脚下的视频.之后我对卧虎藏龙就一直很期待. 但是这次封测我只升到了24级,封测便停了,并没有玩到可以施展轻功的地步,或者我没有掌握技巧,这是一个小的遗憾. 因为之前玩Pc游戏刀剑/  剑侠情缘三,就是看中了其中的轻功系统.而卧虎藏龙的轻功操作更让人有玩的冲动,文学功底不行,所以不会描述,大家可以百度一下这个轻功视频:http://1

Java字符串常量池是什么?为什么要有这种常量池?

简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池.我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引号("")创建字串对象. Java中的字符串常量池 下图,清楚地解释了如何在Java堆内存中维护字符串常量池,以及当我们使用不同的方式创建字符串时在堆内存中如何存放. 之所以有字符串常量池,是因为String在Java中是不可变(immutable)的,它是String interning

【基础】Java 8 中的常量池、字符串池、包装类对象池

1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是不是所有的数字字面量都会被存到常量池中?3 - 包装类对象池 $\ne$JVM 常量池4 - 字符串池 4.1 字符串池的实现——StringTable 4.2 字符串池存的是实例还是引用?5 - 补充 5.1 永久代为何被 HotSpot VM 废弃? 5.2 为什么 Java 要分常量.简单类型

触摸java常量池

转:http://www.cnblogs.com/dreamroute/p/5946272.html java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布:      程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂.      本地方法栈是jvm调用操作系统方法所使用的栈.      虚拟机栈是jvm执行java代码所使用的栈.      方法区存放了一些常量.静