值传递和引用传递
1)若想搞清楚java中的值传递和引用传递,首先要搞清楚java中两种数据类型:基本类型和引用类型。java中基本类型只有八种,如下所示:
其余的都是引用类型(就是使用new运算符创建的对象类型),例如String,Integer、数组等。
2)这两种类型的变量的存储位置也不同。基本类型是存储在栈上,属于线程局部的,只供本线程访问。而引用类型是存储在堆上,可以供进程的所有线程访问。从栈里面申请内存,简单快速,但是容量有限。堆是所有线程共有的,从堆里面申请内存要进行相关的加锁操作,因此申请堆内存的复杂度和时间开销比栈要大很多。
3)这两种类型存储的值意义不同。基本类型变量存储的值就是变量的实际值(字面值,一个字符,数值或者布尔值),而引用类型存储的值是指向对象的地址值。
int val;//基本类型声明时,即分配内存空间(存放数据)。 val=10; Date date;//引用类型声明时,只是给引用类型变量date分配了内存空间。 date=new Data();//使用new操作符创建对象实例时,才创建对象的内存空间。在这里,将对象内存空间的地址复制给date date2=date;//只是将对象地址赋给了date2,并没有复制对象。指向同一个对象
总之,java中值传递方式就是值传递,只是基本类型变量传递的是字面值,而引用类型传递的是指向对象的地址值,归根到底都是值。
4)以一个实例说明值传递和引用传递:
1 public class TestMain { 2 public static void main(String[] args) { 3 String a = "a"; 4 String b = "b"; 5 operator(a, b); 6 StringBuilder x = new StringBuilder("x"); 7 StringBuilder y = new StringBuilder("y"); 8 System.out.println(a + "," + b); 9 System.out.println(x + "," + y); 10 } 11 12 public static void operator(String a, String b) { 13 a += b; 14 System.out.println("new a:"+a); 15 b = a; 16 17 } 18 19 public static void operator(StringBuilder a, StringBuilder b) { 20 a.append(b); 21 b = a; 22 } 23 }
结果如下:
5)关于"=="和equals
6)最后,总之,引用类型存储的是对象的地址