string intern

大小固定的Hashtable 如果尚不熟悉Hashtable 和Hashmap,你可能想知道到底什么是大小固定的Hashtable (特别是,这些类的Java 实现大小都是不固定的)。 从概念上讲,一个Hashtable 包含一个数组,它会保存一些条目(数组中的每个元素叫 作一个桶)。当要将一个对象保存到Hashtable 中时,可以用该对象的哈希值对桶的数 目取余,以此确定对象在数组中的存储位置。这种情况下,两个哈希值不同的对象很 有可能被映射到同一个桶中,每个桶实际就是一个链表,其中按顺序存储了映射到该 桶的条目。当两个对象映射到一个桶时,这就叫“冲突”。 随着越来越多的对象被插入到这个表中,冲突也会越来越多;进而会有更多的条目被 插入到每个链表中。要找到一个条目,就变成了在一个链表中搜索。这可能会非常慢, 特别是随着链表越来越长,速度会更慢。 解决方案是设置Hashtable 的大小,以便它有更多的桶(当然,结果就是冲突会减少)。 很多实现都是动态处理的;实际上,Java 的Hashtable 和HashMap 也是这么工作的。 其他实现,像这里讨论的JVM 内部的这个,就不能重新设置Hashtable 的大小;其数 组的大小是在创建时就固定的。

从Java 7 中开始,这个表的大小可以在JVM 启动时使用-XX:StringTableSize=N(如前面
所介绍的,默认值为1009 或60 013) 。如果某个应用会保留大量字符串,就应该增加这个
值。如果这个值是个素数,字符串保留表的效率最高。

如果将字符串表设得特别大,其损失是非常小的:每个桶只需要4 字节或8 字节(取决于
使用的是32 位还是64 位JVM),所以比最优的情况多几千,只是一次性消耗一些原生内
存(不是堆内存)。

时间: 2024-10-10 23:22:22

string intern的相关文章

深入解析String.intern()方法

转载: http://tech.meituan.com/in_depth_understanding_string_intern.html 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如

对String.intern()的理解

一直对String对象里面的intern()方法不是很了解,最近在读<深入理解Java虚拟机>这本书里面终于得到了一个比较清晰的解释.这个方法是可以获得一个具体的String在字符串常量池中的一个引用,书里面有一段实例代码, String str1= new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern()==str1); String str2=

JDK源码学习(2)-String.intern()方法详解

1.方法intern()为java内部方法,如下  public native String intern(); native方法为通过jvm进行运行,jdk8中隐藏了该方法的具体处理方法. 2.作用:该方法注释为 "如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回". 3.测试代码一 public static void main(String[] args) { String s1 = new String(&

关于 String.intern()

String.intern() 实际上会返回第一次生成该 String 内容的那个实例. 所谓内容就是 "abc", "123" 这个字符串的内容 1. String s1 = "a"; ([email protected]) 那么 s1 就是第一次生成内容 "a" 的实例 @100, 所以如果 String s1 = "a"; ([email protected]) String s2 = "a

String学习之-深入解析String#intern

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

Java中的String常量和String.intern的实现

在java中有constantPool常量池,常量池里对类,方法,接口的常量,而对于存放字符串常量通常存放的符号链接Symbol 或者真实的String的对象的引用. 我们来看一段简单的代码和反编译字节码 public class test { public static void main(String[] args) { String test = "test"; } } Constant pool: #1 = Class #2 // test #2 = Utf8 test #3

深入解析String#intern

转自:https://tech.meituan.com/in_depth_understanding_string_intern.html 深入解析String#intern john_yang ·2014-03-06 17:10 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.

String放入运行时常量池的时机与String.intern()方法解惑

运行时常量池概述 Java运行时常量池中主要存放两大类常量:字面量和符号引用.字面量比较接近于Java语言层面的常量概念,如文本字符串.声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符 运行时常量池位置 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了"永久代(Permanent Generation)".所以

String intern()方法详解

执行以下代码 String a1=new String("abc");       String a2=new String("abc");       System.out.println(a1==a2);       System.out.println(a1==a2.intern());       System.out.println("abc"==a2.intern());       System.out.println(a1.int

Java提高篇——理解String 及 String.intern() 在实际中的应用

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