首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【java】关于equals跟==的一些探究

2013-09-07 
【java】关于equals和的一些探究突然想到了一个问题,equals和的区别,写了些测试代码,如下:java虚拟机里

【java】关于equals和==的一些探究

突然想到了一个问题,equals和==的区别,写了些测试代码,如下:

java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是String str = "abc",虚拟机认为“abc”是常量,放在常量区。下次你再定义String otherStr = “abc", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”abc“,所以不管是equal还是==,都相等,因为值和地址都相等。 另外还有一个区域叫堆,如果String str = new String("abc"), 虚拟机会创建对象放到堆里,再String otherStr = new String("abc"),会在堆里放两个对象。所以==就是false,因为两个对象地址不同。

上面提到了几个名词,虚拟机、常量区、堆,下面回顾一些基本概念


1.虚拟机

Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。
Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。

2.栈
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。
⑴局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。
⑵运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。

3.JVM碎片回收堆
Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。


貌似能达到略懂,这些概念需要被熟知


dml@2013.9.5

热点排行