String Table

String的基本特性

String : 字符串,使用" "引号起来表示
         String s1 =  "hello world";                                 //字面量的定义方式
         String s2 =  new String("hello world");             //new 形式
String 声明为 final 的, 不可被继承 
String  实现了Serializable         接口: 表示字符串是支持序列化的。
           实现了Comparable        接口: 表示String 可以比较大小
           实现了Charsequence    接口: 该接口提供了 charAt(i),length() 等方法

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
}
   Jdk 8 String 的存储方式:
private final char value[];
   Jdk 9 String 的存储方式(Jdk 9以上也是这种存储方式):
private final byte[] value    官网描述

String:代表不可变得字符序列。简称:不可变性

  • 当对字符串重新赋值时,需要重写制定内存区域赋值,不能使用原有的value进行赋值。
  • 当对现有的字符串进行连接操作是,也需要重新制定内存区域赋值,不能使用原有的value进行赋值。
  • 当调用String 的replace()方法修改指定字符或字符串时,也需要重新指定内存区域值,不能使用原有的value进行赋值。

通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

字符串常量池中不会存储相同内容的字符串

  • String 的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进String Pool 的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了直接会造成的影响是当调用String.intern时性能会大幅下降。
  • 使用 XX: StringTableSize 可设置StringTable的长度
  • 在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中字符串过多就会导致效率下载很快。
  • 在jdk7中,StringTable的长度默认值是60013,jdk 8 1009是可设置的最小值

String的内存分配

在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行中速度更快,更节省内存,都提供了一种常量池的概念。

常量池就类似于一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊,它的主要使用方法有两种。

  • 直接使用双引号声明出来的String对象会直接存储在常量池中。比如:String info ="hello" 
  • 如果不是用双引号声明的String对象,可以使用String提供的intern()方法。

Java6 之前,字符串常量池存放在永久代

Java7 中 Oracle 的工程师 对字符串常量池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆中

String 的基本操作

字符串拼接操作

1.常量与常量的拼接结果在常量池,原理是编译期优化
2.常量池中不会存在相同内容的常量。
3.只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder
4.如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址。
 

字符串变量拼接操作的底层原理


拼接操作与append操作的效率对比
 

intern()的理解

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 string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

intern()的使用: jdk6 vs jdk7/8

jdk6在字符串常量池创建新的地址
jdk7/8 引用堆地址()
 

new String()到底创建了几个对象
 

关于intern()的面试难题
 

面试的拓展问题
 

intern()的课后练习1
 

intern()的课后练习2
 

intern()的空间效率测试
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值