String的intern方法

(jdk 7 以上)

String s = new String("a") + new String("b");
s.intern();

执行 s.intern() 时,如果字符串 ab 已经在常量池中,则直接返回;

如果不存在,会把当前引用放到常量池,该引用指向着 s 指向的堆中的对象。

所以:

// 例1
String s = new String("a") + new String("b");
s.intern();
String s2 = "ab"; // 此时s2实际指向的是s
System.out.println(s == s2); // 所以是true

// 例2
String s = new String("a") + new String("b");
String s2 = "ab";
s.intern();
System.out.println(s == s2); // false

通过上面例子也可以知道:字符串是在执行 ldc 字节码指令时放到常量池的,而不是类加载期间事先放到常量池。

在 jdk 6 以及以前版本有个永久代(PermGen),是方法区的实现(字符串常量池存储在永久代里;但不是都在永久代)。永久代与堆空间是隔开的,所以在这些版本里执行例1代码,会返回 false,因为堆地址和永久代中的地址是不同的。

jdk 7 开始,逐渐不使用永久代,把方法区一些数据(包括字符串常量池)放到了堆空间里。

而 jdk 8 开始,移除永久代,新建立了元区域(Metaspace),也是方法区的一种实现,区别是元区域使用的是本地内存。但字符串常量池、静态变量等还是在堆里。

注:方法区是 JVM 规范中的概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。永久代就是 Hotspot 对方法区的实现,其他 JVM 没有永久代。

知乎:方法区的Class信息,又称为永久代,是否属于Java堆?

原文地址:https://www.cnblogs.com/dmsdus/p/11460916.html

时间: 2024-11-06 23:33:27

String的intern方法的相关文章

java String 中 intern方法的概念

1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”kvill”:String str=new String (“kvill”);的区别: 在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念. 常量池(const

String的intern方法解析

public String intern()返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串.否则,将此 String 对象添加到池中,并且返回此 String 对象的引用. 它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.

String中intern方法的作用

前言 读完这篇文章你可以了解,String对象在虚拟机内存中的存放,intern的作用,这么多String对象的创建到底有什么区别,String 创建的对象有几个!! 正题 先科普几个知识点1.常量池存放于方法区中 2.jdk1.6 方法区放在永久代(java堆的一部分),jdk1.7 特别将字符串常量池移动到了的堆内存中(使用参数-XX:PermSize 和-XX:MaxPermSize指定大小),jdk1.8放在单独的元空间里面(-XX:MaxMetaspaceSzie设定大小),和堆相独立

String的Intern方法详解

引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存.8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如果不是用双引号声明的String对象,可以使用String提供的intern方法.intern 方法会从字符串常量池中查询当前字符串是否存在,

java中String类intern()方法探索

想到什么写什么,会有点乱,意思理解就行 首先我们创建两个字符串对象,如下: String a = new String("hx"); String b = new String("h")+new String("x"); 通过new关键字创建字符串对象时,会同时在堆和常量池中生成两个对象,比如说上面的第一条语句产生两个内容均为"hx"的对象,一个在堆中,一个在常量池中,a引用的是堆中的对象,内容是"hx";

Java String的intern方法

在Java6中,intern方法返回的是对应字符串在永久态(方法区)中的地址:Java7以后,intern方法返回的是该字符串首次创建时候的堆内存的地址: 在java7中: package com.ecarx.daa.data.manager.utils; public class StringTest { public static void main(String[] args) { String a = new StringBuffer("a").append("a&q

jdk1.6与jdk1.8中String的intern()方法区别

我们用如下代码来证明两个版本intern方法的区别. jdk1.6 String ab = new String("a") + new String("b"); //在堆中创建"a","b","ab"; String ab2 = ab.intern();//先判断常量池中是否有"ab",如果有直接返回常量池中的地址,如果没有则拷贝一份ab对象放入常量池. String ab3 = &qu

理解String的intern()方法

API文档中的介绍: intern public String intern() Returns a canonical representation for the string object. A pool of strings, initially empty, is maintained privately by the class String. When the intern method is invoked, if the pool already contains a stri

Java技术——你真的了解String类的intern()方法吗

0.引言 转载请注明出处:http://write.blog.csdn.net/postedit/52291082 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); System.out.println(str1.intern() == str1); System.out.println(str1 == "SEUCalvin"); 本人JDK版本1