1. 程式人生 > >Java中地址的理解

Java中地址的理解

以前不是很懂就寫下了這篇文章

今天學習Python時才發現,賦值引用中出現的問題就是Java中的淺拷貝和深拷貝問題

找到一篇講解很全面的文章

---------------------------原文分隔符------------------------------------



java中沒有指標,但卻有地址和引用的概念。在這個地方栽了不少次。

先上一個小例子

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class Helloworld {
	static class hello{
		public int x;
	}
	 public static void main(String[] args) {
		 Queue<hello> a =new LinkedList<>();
		 hello n = new hello();
		 n.x=100;
		 a.add(n);					//新增n
		 hello c = new hello();
		 c=n;					
		 a.add(c);					//新增c
		 c.x=0;						//修改c
		 a.add(n);					//再新增n
		 System.out.println(a.size()+"\n");

		 Iterator<hello> it =a.iterator();
		 while(it.hasNext()) {
			 System.out.println(it.next().x);
		 }
	 }
}
3

0
0
0

從上面的小例子可以看出來

1.在c加入佇列後,改變c的值,佇列裡的值也跟著改變了。

2.把n賦值給c後,更改c的值,n的值也改變了。

理解:

1.java裡是有類似指標的概念的,佇列其實不是真實存在,而是用連結串列把佇列裡的資料鏈接起來,更改原始資料實際就改變了佇列裡的資料。

2.java裡如果把一個物件完整的賦值給另一物件,實際上他們會使用同一塊地址。

上個圖理解一下


如果近對物件中某一屬性更改,而不是整個物件賦值,那麼就不會發生引用

上程式碼

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class Helloworld {
	static class hello{
		public int x;
	}
	 public static void main(String[] args) {
		 Queue<hello> a =new LinkedList<>();
		 hello n = new hello();
		 n.x=100;
		 a.add(n);					//新增n
		 hello c = new hello();
		 c.x=n.x;					//僅對物件更改。
a.add(c); //新增c c.x=0; //修改c a.add(n); //再新增n System.out.println(a.size()+"\n"); Iterator<hello> it =a.iterator(); while(it.hasNext()) { System.out.println(it.next().x); } } }
3

100
0
100