日常总结 -- 字符串池

最近被人问到关于java字符串的问题,做了一点小的归纳
先上经典代码:

  1.String a = "Hello";

  2.String b = "Hello";

  3.String c = new String("Hello");

  4.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为了提高内存利用率而采取了字符串池这个手段。在遇到第一句话时,会自动在字符串池中寻找是否存在"Hello"对象,

没有则创建;当第二句话执行时,再一次在字符串池中寻找这个对象,发现已经存在了,那么直接将变量b指向这个地址。那么第三和第四的语句又是怎么回事呢?

因为其使用了new这个关键字,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。对于java中两个String类型的比较,"=="比较的是地址,

而equals比较的是值。那么不难得出,a和b指向的是同一个对象,地址相同,a==b返回true;b和c还有c和d指向的对象都不相同,那么他们使用"=="比较自然

返回false。因为equals比较的是值,这里都是"Hello"所有后面三个返回的是true。

  总结(摘抄自网络):Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池
中的一个对象。使用new操作创建的字符串

对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的
字符串--使用equals方法确定,则直接返回池中的

字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回
真。

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));

时间: 2024-10-14 20:27:22

日常总结 -- 字符串池的相关文章

字符串池

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

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

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

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 =

java6,7,8中字符串池的进化史与深度剖析

这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整. 字符串池 字符串池(有名字符串标准化)是通过使用唯一的共享 String 对象来使用相同的值不同的地址表示字符串的过程.你可以使用自己定义的 Map<String, String> (根据需要使用 weak 引用或者 soft 引用)并使用 map 中的值作为标准值来实现这个目标,或者你也可以使用 JDK 提供的 String.intern().

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字符串池(String Pool)深度解析(转)

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

什么是字符串池机制

分析问题 由于字符串的不可变性,程序中对用一字符串的大量修改或者对多个引用赋值同一字符串理论上会产生大量的临时字符串对象,这会极大程度地降低系统的性能.对于前者,可以使用StringBuilder类型来解决问题,这在前面章节中已经有所介绍了,而对于后者,.NET提供了另外一种不透明的机制来帮助优化性能,这就是字符串池机制,或者称为字符串的复用机制. 一旦使用了字符串池机制,当CLR启动的时候,会在内部创建一个容器,容器的键是字符串内容,而值是字符串在堆栈上的引用.当一个新的字符串对象需要分配时,

1.字符串池化(intern)机制及拓展学习

1.字符串intern机制 用了这么久的python,时刻和字符串打交道,直到遇到下面的情况: a = "hello" b = "hello" print(a is b) #--->True print(a == b) #---> True a = "hello world" b = "hello world" print(a is b) # ---> False print(a == b) # --->

【基础】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 要分常量.简单类型