String 中intern

首先贴上源码中的注释

在一个String类上调用这个方法的时候如果常量池中存在和这个String对象相同的对象的时候,直接返回常量池中的常量,如果常量池中不存在这个对象,就直接将其将其加入常量池,并且返回一个引用。

String str2=new String("nihao");   //在堆中创建一个String对象

String str3=str2.intern();     //调用str.intern()的时候,常量池中没有‘nihao’,所以在常量池中创建一个,返回创建的引用,所以此时str3指向的是常量池中的对象

String str="nihao";           //这种是直接去常量池创建对象的,但是现在常量池中已经有了“nihao”,所以这时候直接返回常量池中已经有的对象的引用,此时str指向的也是常量池中的“nihao”

System.out.println(str3==str2);//str2指向的是堆中的,所以地址不同返回false

System.out.println(str3==str); //两个指向的是常量池中的同一个对象,这时候判断地址是否相等返回的是true

System.out.println(str==str2.intern());//str2.intern()首先会判断常量池中是否存在,存在就返回常量池中的引用,所以两只地址对比返回的是true

System.out.println(str==str2);//这行返回的是false,说明intern()函数对调用的String对象没有什么影响,

intern()方法直接从常量池中取值,这样会比直接从堆中取值快。

String str2=new String("nihao");
System.out.println(str2.intern()=="nihao");

执行“==”效率高,相当于equals,节省内存

由于intern()操作每次都需要与常量池中的数据进行比较以查看常量池中是否存在等值数据,同时JVM需要确保常量池中的数据的唯一性,这就涉及到加锁机制,这些操作都是有需要占用CPU时间的,所以如果进行intern操作的是大量不会被重复利用的String的话,则有点得不偿失。由此可见,String.intern()主要 适用于只有有限值,并且这些有限值会被重复利用的场景


蓝色部分来源于下面
作者:LilacZiyun
链接:https://www.jianshu.com/p/95f516cb75ef
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10545694.html

时间: 2024-11-13 07:54:42

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方法的作用

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

String中intern的方法

首先,这篇博客除了最后几段是自己的总结外,其他部分全部来自于http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857513.html这篇博客. 首先查看官方API那个的解释: --------------------------------------- intern public String intern() 返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如

java中String类intern()方法探索

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

String类中intern方法的原理分析

一,前言 ? 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今天就弥补昨天缺失的知识点. 二,String.intern() ? 先来看下网上流行的关于intern()方法的示例代码: public static void main(String[] args) { String s = new String("1"); s.intern(); St

java-String中intern()的详解

这里首先介绍字符串池.类java.lang.String负责维护一个字符串池.可以将字符串池看作一个字符串的集合.在该字符串池中,具有相同字符序列的字符串只对应一个字符串实例对象.该字符串存放3类元素: 存放字符串常量 存放有限个字符串直接量进行"+"运算的结果 由类java.lang.String的成员方法intern创建的字符串实例对象 类java.lang.String的成员方法 public String intern() 首先判断当前字符串是否已经在字符串池中. 如果当前字符

String的Intern方法详解

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

c# 中Intern的作用

1. 函数如下 public static string Intern(string str) { if(str == null) { throw new ArgumentNullException("str"); } return Thread.GetDomain().GetOrInterString(str); } 2. 举例说明 string s1 = "name"; string s2 = "name"; 上述函数的作用就是确保s1,s2

String的intern方法解析

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