匿名对象、栈空间和堆空间,String的两种实例化方式的比较,"=="和"equals()"的区别

匿名对象
匿名对象一般只用一次,不需要对象变量,格式如下:
New Class().getParameter();
匿名对象没有对象名,一般作为其他类实例化的参数传递,由于其实质是对象的实例,而非指向对象实例的地址,所以它是在堆内存中开辟
空间,而非栈内存。

栈内存和堆内存的区别。
我想通过String的两种实例化方式来讲解这个会比较容易明白。


String str1="hello";
String str2="hello";
str1==str2为真

这里的str1和str2指向的是同一个地址,那么这个地址在哪里呢?首先要明白一个字符串就是一个String类型的匿名对象,而在java中会提供
一个字符串池来保存全部的内容,我们称之为共享设计,即乳沟新的实例化对象在池中已经定义了,那么就不需要重新定义,直接在池中取
出来用就是了,所以str1和str2指向的是字符串池中的同一个地址,这是字符串采用直接赋值的方式。

那么另一种采用构造方法来新建一个对象的方式:

String str3=new String("hello");
String str4=new String("hello");

而这里的str3和str4则是新建了一个对象,因为这里使用了new关键字,所以它们是在堆内存中开辟了不同的空间,所以

(str3==str4)==false

因为这里的str3和str4指向的不同的两个地址。那么有些人会遇到这样的情况,就是有时候用"=="和"equals()"具有相同的效果,这里我们只要记住"=="进行的是地址比较,而"equals()"进行的是值比较,而它们具有相同效果则是因为采用的是直接赋值方式,比如上面的str1==str2和str1.equals(str2)都为真,虽然它们都为真,但是我们需要注意的是这连个表达式比较的方式是不一样的,一个比较的是地址,一个比较的是值
所以,堆内存存储的实际上是实例化对象,而栈内存中存储的是指向堆内存空间的地址。java中的引用传递就是把堆内存空间的使用权交给
多个栈内存空间。

原文地址:https://www.cnblogs.com/CodeMeteor/p/3663154.html