java传参,传的既不是引用也不是内容
经典案例
public class JavaTest {
public static void main(String[] args) {
String mes = "Hello";
transf(mes);
System.out.println(mes);
}
private static void transf(String mes){
mes = mes +"world";//这里就相当于new 一个新的String
}
}
输出结果:
Hello
这是为什么呢?
- 在main方法中,mes = "Hello"在栈中存入一个引用,堆中开辟一个内存
- 当调用transf(mes)方法时候,mes会复制一个引用的副本传进方法内
- 在方法内部,对 mes = mes +"world"则改变了mes副本的引用地址,所以内部mes是改变了的
- 但当main函数中 transf(mes),mes出栈的时候,mes仍是原有的引用,并没有改变,所以输出的还是原有的值: Hello
equals&==
- 对象的 : == :判断的是对象的引用是够相等,即存在栈中的引用位置
- Object :equals :最底层的equals实现是直接判断引用是否相等
- String:==:判断的是对象的引用是够相等,即存在栈中的引用位置
- String :equals :重写了Object的equals方法,判断内容是否相等
- 8大基本类型 :equals :都重写了Object的equals方法,判断内容是否相等
- 自定义对象:equals :未重写equals方法的,都是判断引用相等,不能用==
(java基本类型 才有操作符重载)
例如:byte、long,int,double等,还比如Integer,String,这些都重写了Object的equals方法,判断内容是否相等。
当重写Object的equals方法时,也需要重写hashcode方法,以防内容相等,引用不同时候,hashcode不同的情况。