java jvm-"=="和equal,堆和栈的区别和联系
java中的”==”和equal都是用于俩个变量的比较
java中的 “==”:用于比较俩个变量的引用地址
java中的”equal”:用于比较俩个变量的内容
java堆和栈都是内存
java的堆:用于存放具体对象的实例和数组,java基础类型的字面值等
java的栈:用于存放java堆中对象实例,数组,基础数据类型的引用变量等
例如 : int a = 3
3是基础数据类型字面值,存放于堆中,a是基础数据类型的引用变量,存放于栈中。堆中的基础数据类型可以数据可以用于共享。
例如: int a = 3 ; int b = 3 ;
当执行a = 3时,会在堆中查找是否有3的字面值,如果没有则创建,然后在栈中,a引用3。当执行b = 3时,在堆中发现了3的字面值,所有就直接去引用,不需要再创建,所以:
System.out.println(a == b); //true 地址相同
对于用new创建的对象,都会直接在堆中直接创建对象,然后栈中的变量直接引用
例如:Integer aa = new Integer(3) ;Integer bb = new Integer(3);
执行这俩个都会直接在堆中创建对象,然后aa,bb变量引用,没有共享对象实例Integer3,所以:
System.out.println(a == b); //false 地址不同
System.out.println(a.equals(b)); //true内容相同
如果不是new,即使是封装类型,也可以在堆中共享数据,例如
String c = "abc";
String d = "abc";
System.out.println(c == d); //true地址相同
System.out.println(c.equal(d)); //true 内容相同
String cc = new String("def");
String dd = new String("def");
System.out.println(cc == dd); //false地址不同
System.out.println(cc.equal(dd)); //true 内容相同
还没有评论,来说两句吧...