字符串常量池也是运行时常量池

jdk1.6中,它是在方法区中,属于“永久代”

jdk1.7中,它被移除方法区,放在java堆中

jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了

public class RuntimeConstantPoolOOM {
public static void main(String[] args) throws Exception{
String str1 = new StringBuffer("计算机").append("shuju").toString();
String str2 = new StringBuffer("计算机").append("shuju").toString();
//jdk1.6的测试效果
System.out.println(str1.intern()==str1);//false
System.out.println(str2==str2.intern());//false //jdk1.7的测试效果
System.out.println(str1.intern()==str1);//true
System.out.println(str2==str2.intern());//false //jdk1.8的测试效果
System.out.println(str1.intern()==str1);//true
System.out.println(str2==str2.intern());//false
}
}

String.intern()在JDK1.6中,会先判断常量池中是否存在当前字符串,不存在就会将当前字符串复制到常量池,并返回常量池中字符串的引用。

而JDK1.7以后,会先判断常量池中是否存在当前字符串,不存在时不会将当前字符串复制到常量池,只是当前字符串的引用。如果存在,也不会改变存在的引用,以及只会保存首次存储的字符串的引用。如上代码所示,常量池保存的是str1的引用,即使str2调用intern()方法,返回的也是str1的引用。

从以上代码也可以看出,调用toString方法只会在堆中创建字符串对象。

字符串创建各种状态如下:

1.只在常量池上创建常量
    String a1 = "AA";
2.只在堆上创建对象:调用toString方法或者+
    String a2 = new String("A") + new String("A");
3.在堆上创建对象,在常量池上创建常量
    String a3 = new String("AA");
4.在堆上创建对象,在常量池上创建引用
    String a4 = new String("A") + new String("A");//只在堆上创建对象AA
    a4.intern();//将该对象AA的引用保存到常量池上

字符串常量池和String.intern()方法在jdk1.6、1.7、1.8中的变化的更多相关文章

  1. 常量池之String.intern()方法

    JDK7将String常量池从Perm区移动到了Java Heap区.在JDK1.6中,intern方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中的实例.但是在JDK1.7以后,Str ...

  2. Knowledge Point 20180309 字符串常量池与String,intern()

    引言 什么都先不说,先看下面这个引入的例子: public static void test4(){ String str1 = new String("SEU") + new S ...

  3. Java String类相关知识梳理(含字符串常量池(String Pool)知识)

    目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...

  4. 关于jvm中的常量池和String.intern()理解

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  5. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  6. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  7. Java进阶——Java中的字符串常量池

    转载. https://blog.csdn.net/qq_30379689/article/details/80518283 字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内 ...

  8. Java中的字符串常量池,栈和堆的概念

    问题:String str = new String(“abc”),“abc”在内存中是怎么分配的?    答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...

  9. 对于JVM中方法区,永久代,元空间以及字符串常量池的迁移和string.intern方法

    在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...

随机推荐

  1. Vue-Router模式、钩子

    转:https://www.cnblogs.com/heioray/p/7193841.html 模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const ro ...

  2. Linux:Day12(上) 进程

    内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能 Process:运行中的程序的一个副本. 存在生命周期 Linux内核存储进程信息的固定格式 :task struct 多个任务 ...

  3. Web前端知识点记录

    一.HTML的加载顺序 浏览器边下载HTML,边解析HTML代码,二者是从上往下同步进行的 先解析<head>中的代码,在<head>中遇到了<script>标签, ...

  4. 性能测试监控平台:InfluxDB+Grafana+Jmeter

    前面的博客介绍了InfluxDB.Telegraf.Grafana的安装和使用方法,这篇博客,介绍下如何利用这些开源工具搭建性能测试监控平台... 前言 性能测试工具jmeter自带的监视器对性能测试 ...

  5. 将List按照指定大小等分的几种实现方式和效率对比及优化

    今天碰到一个需求,定时任务,批量从表里取数据并做一些其他操作然后再存表,每次取1000条,由于计算过程比较耗时所以要起多个线程同时跑,需要将List按照指定大小等分,如每100条数据起一个线程,若最后 ...

  6. Linux下时钟框架实践---一款芯片的时钟树配置

    关键词:时钟.PLL.Mux.Divider.Gate.clk_summary等. 时钟和电源是各种设备的基础设施,整个时钟框架可以抽象为几种基本的元器件:负责提供晶振 Linux内核提供了良好的CC ...

  7. 第一个Jsp页面,基于普元EOS

    跨界了.搞一下Jsp,实现MES系统看板一处.

  8. Grunt自动化构建环境搭建

    1.环境准备 需要安装Git.Node.Bower.Grunt.Ruby NodeJS https://nodejs.org/en/ Ruby    http://rubyinstaller.org/ ...

  9. js对时间的一些操作

    new Date()  //Thu Dec 27 2018 12:16:16 GMT+0800 (中国标准时间); new Date('2018-1-1,12:20:20'/1258454512000 ...

  10. Scrapy安装报错

    python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Micro ...