从Java的堆栈到Equals和==的比较

  • 时间:
  • 浏览:0
  • 来源:大发3D_大发3D官方

能非要用: 

认识Java中堆和栈

比较类顶端的数值是否是相等时,用equals()法律依据 ;当测试一个 包装类的引用是否是指向同一个 对象时,用==,下面用例子说明顶端的理论。 

 有一种 的形式来创建,第有一种 是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个 新的对象。 而第二种是先在栈中创建一个 对String类的对象引用变量str,有些 查找栈中含没有存放"abc",可能没有,则将"abc"存倒入栈,并令str指 向”abc”,可能可能有”abc” 则直接令str指向“abc”。 

3. 字符串缓冲池

************************************************************************************************************************************************************

假设朋友一并定义:

String重写的equals法律依据 保留了Object比较一个 对象内容地址是否是相等。在此基础上增加了一个 比较String的值是否是相等。这是哪些地方意思呢。 可能equals括号里的对象都不 String类型的,没有比较他和原对象的内存地址是否是相等。可能instanceofString 没有先把这种 对象转为String,再把它的值变为char数组,也只要下面的value,可能朋友的char数组长度相等再对这种 数组的char进行一个 个遍历比较是否是一样。可能都一样就equals为true,有些 为false。

Java中Equals和==的区别

************************************************************************************************************************************************************

栈与堆都不 Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,进程员非要直接地设置栈或堆。

Java的堆是一个 运行时数据区,类的对象从中分配空间。哪些地方地方对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不还上能 进程代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是能非要动态地分配内存大小,生存期只要必却说告诉编译器,可能它是在运行时动态分配内存的,Java的垃圾埋点器会自动收走哪些地方地方不再使用的数据。但缺点是,可能要在运行时动态分配内存,存取速率较慢。

栈的优势是,存取速率比堆要快,仅次于寄存器,栈数据能非要共享。但缺点是,占据 栈中的数据大小与生存期还上能 是选用的,欠缺灵活性。栈中主要存放有些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。栈三个 有点要的特殊性,只要占据 栈中的数据能非要共享。

查看源码发表小结:

 要注意这种 数据的共享与一个 对象的引用一并指向一个 对象的这种 共享是不同的,可能这种 状态a的修改并后会影响到b, 它是由编译器完成的,它促使节省空间。而一个 对象引用变量修改了这种 对象的实物状态,会影响到原本对象引用变量。 

4.再次更改进程:

编译器先外理int a = 3;首先它会在栈中创建一个 变量为a的引用,有些 查找栈中是否是有3这种 值,可能没找到,就将3存倒入来,有些 将a指向3。接着外理int b = 3;在创建完b的引用变量后,可能在栈中可能有3这种 值,便将b直接指向3。原本,就出现了a与b一并均指向3的状态。这时,可能再令a=4;没有编译器会重新搜索栈中是否是有4值,可能没有,则将4存倒入来,并令a指向4;可能可能有了,则直接将a指向这种 地址。有些 a值的改变后会影响到b的值。 

String str1 =new String ("abc"); 

java中的数据类型,可分为两类: 

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 

  朋友之间的比较,应用双等号(==),比较的是朋友的值。 

2.复合数据类型(类) 

  当朋友用(==)进行比较的却说,比较的是朋友在内存中的存放地址,好多好多 ,除非是同一个 new出来的对象,朋友的比较后的结果为true,有些 比较后结果为false。 JAVA当中所有的类都不 继承于Object这种 基类的,在Object中的基类中定义了一个 equals的法律依据 ,这种 法律依据 的初始行为是比较对象的内存地 址,但在有些类库当中这种 法律依据 被覆盖掉了,如String,Integer,Date在哪些地方地方类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

  对于复合数据类型之间进行equals比较,在没有覆写equals法律依据 的状态下,朋友之间的比较还是基于朋友在内存中的存放位置的地址值的,可能Object的equals法律依据 也是用双等号(==)进行比较的,好多好多 比较后的结果跟双等号(==)的结果相同。