首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 基礎:深度解析引用類型與原始類型的區別

     編輯:Java 相關知識

兩大類型體系

Java 提供兩種根本不同的類型:

  • 原始類型:boolean, byte, char, short, int, long, float, double —— 直接存儲值。
  • 引用類型:類、接口、數組、枚舉 —— 存儲對象在堆內存中的地址(引用)。

每個原始類型都有對應的封裝類:Boolean, Byte, Character, Short, Integer, Long, Float, Double。

內存模型差異

特性原始類型引用類型
存儲內容數值本身對象引用(地址)
內存位置棧幀局部變量表引用在棧,對象在堆
默認值(實例變量)0, 0.0, false, '\u0000'null
可調用方法否是
賦值語義值拷貝引用拷貝(指向同一對象)

關鍵示例:賦值與方法傳參

原始類型:值傳遞

int a = 5;
int b = a; // 拷貝值
b = 10;
System.out.println(a); // 5,未受影響

引用類型:引用傳遞

Point p1 = new Point(0, 0);
Point p2 = p1; // 拷貝引用,指向同一對象
p2.setLocation(5, 5);
System.out.println(p1); // java.awt.Point[x=5,y=5] —— p1 也被修改!

方法參數傳遞

public void modifyPrimitive(int x) { x = 20; }
public void modifyObject(Point p) { p.setLocation(10, 10); }

int val = 5;
Point pt = new Point(0,0);
modifyPrimitive(val); // val 仍為 5
modifyObject(pt);     // pt 變為 (10,10)

集合陷阱:存儲的是引用

List list = new ArrayList<>();
StringBuffer sb = new StringBuffer("A");
list.add(sb);
sb.append("B");
list.add(sb); // 列表中兩個元素指向同一對象
// 輸出:[AB, AB] 而非 [A, AB]

結論:集合、Map 存儲的均為對象引用,修改原對象會影響集合內所有引用該對象的位置。

封裝類最佳實踐

  • 優先使用原始類型:性能更好,無對象創建開銷。
  • 需對象時用封裝類:泛型、集合、可為 null 的場景。
  • 避免 new Integer(5):使用 Integer.valueOf(5) 利用緩存(-128~127)。
  • Boolean 只用 Boolean.TRUE/FALSE 或 valueOf():杜絕 new Boolean()。

自動裝箱/拆箱陷阱

Integer a = 1000, b = 1000;
System.out.println(a == b); // false,超出緩存範圍創建新對象

Integer c = 100, d = 100;
System.out.println(c == d); // true,命中緩存

// 循環中裝箱產生大量臨時對象
Long sum = 0L;
for (long i = 0; i < 100000; i++) sum += i; // 每次 += 觸發裝箱/拆箱
// 應改用 long sum = 0L;

總結

理解引用與原始類型的語義差異,是編寫正確、高效 Java 代碼的基石。牢記:原始類型存值、引用類型存地址;賦值傳參均為拷貝,但拷貝的內容不同。合理選擇類型,善用封裝類緩存,避免不必要的對象創建與拆箱裝箱開銷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved