通过JVM原理理解字符串的比较

Java中的字符串也是一连串的字符,但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理。将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。

  JVM运行时数据区的内存模型由五部分组成:

  (1)方法区

  (2)堆

  (3)JAVA栈

  (4)PC寄存器

  (5)本地方法栈

  对于String s = "haha" ,它的虚拟机指令:

  0: ldc "16; //String haha 2: astore_1 3: return

 

JVM常量池

  虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM常量池在内存当中是以表的形式存在的,对于 String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。 说到这里,对JVM常量池中的字符串值的存储位置应该有一个比较明了的理解了。

  在介绍完JVM常量池的概念后,接着谈开始提到的"haha"的值的内存分布的位置。对于haha的值,实际上是在class文件被JVM装载 到内存当中并被引擎在解析ldc指令并执行ldc指令之前,JVM就已经为haha这个字符串在常量池的CONSTANT_String_info表中分 配了空间来存储haha这个值。

  既然haha这个字符串常量存储在常量池中,常量池是属于类型信息的一部分,类型信息也就是每一个被转载的类型,这个类型反映到JVM内存模型 中是对应存在于JVM内存模型的方法区中,也就是这个类型信息中的JVM常量池概念是存在于在方法区中,而方法区是在JVM内存模型中的堆中由JVM来分 配的。所以,haha的值是应该是存在堆空间中的。而对于String s = new String("haha") ,它的JVM指令:

 


0:   new             "16; //class String   
3:   dup   
4:   ldc             "18; //String haha   
6:   invokespecial   "20; //Method java/lang/String."":(Ljava/lang/String;)V   
9:   astore_1   
10:  return 

  new指令格式:new indexbyte1,indexbyte2

  new指令过程:

  要执行new指令,Jvm通过计算(indextype1<<8)|indextype2生成一个指向常量池的无符号16位索引。 然后JVM根据计算出的索引查找JVM常量池入口。该索引所指向的常量池入口必须为CONSTANT_Class_info。如果该入口尚不存在,那么 JVM将解析这个常量池入口,该入口类型必须是类。JVM从堆中为新对象映像分配足够大的空间,并将对象的实例变量设为默认值。最后JVM将指向新对象的 引用objectref压入操作数栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值