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").toString();
        String b = new StringBuffer("a").append("a").toString();
        System.out.println(a == b); // false
        if (a.intern() == a) { //true
            System.out.println("intern method was == the first object");
        }
        System.out.println(a.intern() == b); //false

        System.out.println(b.intern() == b); //false
        System.out.println(a.intern() == b.intern()); //true
    }
}

toString方法,每次会返回一个新的堆内存的地址,因此a不等于b;

由于intern方法等于首次创建的对象的堆地址,因此  a.intern() == a 成立;但 a.intern() == b 不成立;

原文地址:https://www.cnblogs.com/dasheng-maritime/p/11710021.html

时间: 2024-10-11 17:51:31

Java 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设定大小),和堆相独立

java中String类intern()方法探索

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

String的Intern方法详解

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

java String 提供的方法

String类的判断功能: 1 * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写 2 * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 3 * boolean contains(String str):判断大字符串中是否包含小字符串 4 * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头 5 * boolean endsWith(St

java String拼接的方法选择及性能分析

String 拼接的方法选择 在拼接静态字符串时,尽量用 +,因为通常编译器会对此做优化,如: String test = "this " + "is " + "a " + "test " + "string" 编译器会把它视为: String test = "this is a test string" 在拼接动态字符串时,尽量用 StringBuffer 或 StringBuilde

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