在java中,内存有一个这样的分配.
栈: 里面存放的都是一些基本数据类型
堆: 里面存放的是一个引用数据类型,new出来的东西都会存到这里面.
方法区: 一个类的基本信息会存放到里面,还有字符串常量会存放在里面.
看下图
由于都是基本数据类型,所以"=="相对于基本数据类型而言返回是true.但是引用数据类型就不一样.
这里返回的就是false,具体理由我用图来讲解.
只要new出来一个对象,那么尽管他们的内容是一样的,但是他们的地址指向不一样,"=="比较的是地址.所以上图的两个worker返回的false.
接下来讲解一下String类内存分配了
关于上图s1,s2,s3,s4的内存分配给大家画个图,就知道谁和谁相等了.
由图可知s1=s2!=s3!=s4;
再给大家看一个例子
这里的str3和str4是不相等的,原因就是当两个字符串在进行相加的时候会在底层进行一个操作,这个操作就是实例化,具体的逻辑可以不需要知道,只需要知道实例化了,也就是new了,那么就是在堆里面开辟一个空间,然后指针指向它.所以上图的str3和str4不相等.
如果一个字符串被final修饰了又不一样了.
在这里s3和s4又是相等的了,因为在进行"+"操作时两边的都是一个常量,已知的常量,而不是一个变量,所以底层就不会触发new那些操作,也就不会在堆里面开辟空间来存放,所以两者是相等的.
关于equals讲解.其实equals比较的也是指针,所以和"=="有共同点,但是equals是object类的方法,所以可以被重载,在String类中已经被重载,在String类中比较的是里面存放的内容,而不是指针指向.