小学徒进阶系列—JVM对String的处理

  对于String类型,java官网的文档是这样子描述的:

  String类代表着字符串。java程序中的所有字符串字面值(如”abc”)都作为此类的实例实现。

  字符串是常量,虚拟主机,他们的值在创建之后不能更改。因为 String 对象是不可变的,香港虚拟主机,所以可以共享。

  那么,jvm是怎么共享这些字符串的呢?

  为了节省内存,提高资源的复用,jvm引入了常量池这个概念,它属于方法区的一部分的,作用之一就是存放

  因此,缓存在字符串缓冲区中的字符串对象基本是不被回收的,而jvm也正是通过复用这些对象从而达到共享作用。

  从上一段话中的概念可以知道,一般情况下,只有编译期间可以确定下来的的字符串才能存放到缓冲区中。为什么要强调是一般情况下呢?因为String类为我们提供了一个intern()方法,它可以帮我们将不存在于缓存池中的java字符串添加到缓存池中,并返回缓存池中该字符串对象的引用。

  具体关于intern()方法,后面我们再给出代码做简单说明吧。现在我们将重点放在,什么情况下能够在编译期间直接确定字符串变量值并且将它添加到缓冲区中呢?

  如果程序的字符串连接表达式中没有使用变量或者调用方法,服务器空间,那么该字符串变量的值就能够在编译期间确定下来,并且将该字符换缓存在缓冲区中,同时让该变量指向该字符串;否则将无法利用缓冲区,因为使用了变量和调用了方法之后的字符串变量的值只能在运行期间才能确定连接式的值,也就无法在编译期间确定字符串变量的值,从而无法将字符串变量增加到缓冲区并加以利用。

下面我们来看看如何代码并通过查看他的编译过程来验证上述结论吧。

代码一(没有使用变量或者调用方法):

1 package com.xiaoxuetu.string; Test { main(String args[]) { 6String param1 = “abc”; 7String param2 = “abc” + “def”; 8String param3 = “abcdef”; 9 }10 }不是每一次努力都有收获,但是,每一次收获都必须经过努力。

小学徒进阶系列—JVM对String的处理

相关文章:

你感兴趣的文章:

标签云: