正确认识String池

String Pool是运行时常量池中虚拟出来的一个概念。

举个例子:

String str0 = "abc";

String str1 = new String("abc");

 

    当执行String str0 =”abc”;时,JVM会在栈中创建三个char型的值 ’a’ , ’b’ 和 ’c’
,然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{ ’a’ , ’b’ , ’c’
},最后这个新创建的String对象的值”abc”会被添加到运行时常量池中。注意,在编译期就已经确定将该对象存储到String Pool中了。

    如果我们接着执行String str1=new
String(”abc”);代码,由于”abc”已经被创建并保存于常量池中,因此JVM只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在常量池中的
” abc ” 。注意,编译期在String Pool中创建一个,运行时Heap中创建一个。

    运行是常量池是方法区的一部分,相对于Class文件常量池的另外一个重要特性是具备动态性,Java语言并不要求常量一定只有编译器才能产生,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。

 

 String he = "he";

 String hello = he + "llo"; // hello=="hello" false,档he修饰为final时,为true,原因是编译器优化

 he==he.intern true

 

定义很长的字符串或字符串数组,会否发生栈溢出

原文链接:[http://wely.iteye.com/blog/2359838]

时间: 2024-10-23 07:59:43

正确认识String池的相关文章

java字符串-string创建对象问题字符串常量池问题

问题描述 string创建对象问题字符串常量池问题 String a=new String("aaaa")如果之前常量池没有aaaa字符串,那么这句代码具体创建的是几个对象?, 解决方案 string是比较特殊的. new String就好比开了一个空间里面装着aaa而且有了自己的地址符.也就是说是一个对象了. 而String a也是一个对象,你要记得每个类型都有默认值的,但是后面的等于号是将new String的地址符给了a,这时a也指向那个空间,于是它的值也是aaa. 其实在工作编

深入了解Java的String对象

一,从根本上认识java.lang.String类和String池 首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点.从中可以看到: 1,String类是final的,不可被继承.public final class String. 2,String类是的本质是字符数组char[], 并且其值不可改变.private final char value[]; 然后打开String类的API文档,可以发现: 3,String类对象有个特殊的创建的方式,就是直接指

JVM内存管理:GC算法精解---分代搜集算法

引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分类 上一章已经说过,分代搜集算法是针对对象的不同特性,而使用适合的算法,这里面并没有实际上的新算法产生.与其说分代搜集算法是第四个算法,不如说它是对前三个算法的实际应用. 首先我们来探讨一下对象的不同特性,接下来LZ和各位来一起给这些对象选择GC算法. 内存中的对象按照生命周期的长短大致可以分为三种

日志组件slf4j介绍及配置详解

1 基本介绍 每一个Java程序员都知道日志对于任何一个Java应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库如java.util.logging.Apache log4j.logback.但如果你还不知道SLF4J(Simple logging facade for Java)的话,那么是时候去在你项目中学习使用SLF4J了. SLF4J不同于其他日志类库,与其它日志类库有很大的不同.SLF4J(Simple logging Facade for Java)不是

01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型

一.eclipse工具的使用 1. java代码的位置        1) 选择工作空间 workspace  选择一个文件夹存放程序(代码) 不要用中文和空格        2) 新建一个java 工程(Project)        3) 建包建类   2. 快捷键        alt + / :代码自动补齐,需要配置的               打开preferences(首选项), 搜keys,打开快捷键配置面板               搜 alt+/ ,取消绑定        

提高 Java 代码性能的各种技巧

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

刚接触JAVA,求教个关于java数组的问题。

问题描述 for(inti=0;i<8;i++){String[]s=newString[i];}在java中,数组不是不可以同名的,但是在这个循环里,可以运行,不是每循环一次都从新NEW一个同名数组出来,为什么允许这样子来的,还有,这样子来新产生的数组跟之前产生的数组到底是个什么样子的关系,是包含,还是覆盖?如果是覆盖,那之前产生的数组里的内容是不是就废了??? 解决方案 解决方案二:s是局部变量,其作用域就是从定义的地方开始到for结束.所以每次循环结束时,在这次循环中定义的s已经变成垃圾了

(转载)图解Java中的参数传递

今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码: public static void main(String[] args) { String str = "11111"; changeStr(str); System.out.println(str);//输出11111 } public static void changeStr(String str){ str = "22222"; } 一开始不解

Java中的字符串用法小结_java

本文实例总结了Java中的字符串用法.分享给大家供大家参考.具体分析如下: 字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对象.这也正体现了Java完全面向对象的语言特点. String 类 1.String类对象表示的是一个常量字符串.它是不可变长度的.也就是说,一旦创建了一个String类的实例,那么这个实例所表示的串是不可改变的.类似于 str = str + "Hello"; 这样的操作,实质上是将 s