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

Java length 與 length() 深度解析:陣列 vs 字串 vs 集合

     編輯:Java 相關知識

核心問題

不借助 IDE 自動完成,你能準確說出如何獲取:

  1. 陣列長度?
  2. 字串長度?
  3. 集合大小?

正確答案:

int[] arr = new int[3];
System.out.println(arr.length);    // 陣列:屬性 length

String str = "abc";
System.out.println(str.length());  // 字串:方法 length()

List list = new ArrayList<>();
System.out.println(list.size());   // 集合:方法 size()

為什麼陣列用 length 屬性?

陣列本質

  • 陣列是容器物件,建立時長度固定不可變。
  • 長度是陣列的最終實例欄位(隱含 final),屬於物件固有屬性。
  • JVM 規範定義:陣列類型隱含 public final int length 欄位。

兩種建立方式

// 1. 陣列建立表達式:指定長度
int[] arr1 = new int[5];           // 長度 5
int[][] matrix = new int[3][];     // 長度 3 (二維陣列是陣列的陣列)

// 2. 陣列初始化器:由元素數量決定長度
int[] arr2 = {1, 2, 3};            // 長度 3
String[] names = {"Alice", "Bob"}; // 長度 2

為什麼沒有 Array 類?

  • 陣列是 JVM 內建類型,非普通類,無 Array.java 原始碼。
  • 若有 Array 類,仍需內部陣列儲存元素,層層包裝無意義。
  • 運行期可獲取陣列 Class 物件:int[].class、arr.getClass() → class [I (int 陣列簽名)。

為什麼字串用 length() 方法?

字串內部結構

  • String 內部封裝 char[] value (JDK 8) 或 byte[] value + coder (JDK 9+ 緊湊字串)。
  • 長度非固定屬性,而是由底層陣列長度衍生的邏輯值。
  • 封裝性:隱藏內部實現(char[]/byte[]、coder、offset 等),提供統一介面。

char[] ≠ String

  • C 語言:char str[6] = "hello"; 字元陣列即字串。
  • Java:char[] 是字元序列,String 是不可變字串物件,兩者轉換需顯式建構:
char[] chars = {'a', 'b', 'c'};
String s1 = new String(chars);           // 建構子
String s2 = String.valueOf(chars);       // 靜態工廠
String s3 = String.copyValueOf(chars);   // 複製
// 錯誤:chars.toString() 返回類似 "[C@1b6d3586",非字串內容

集合統一用 size() 方法

設計原因:集合大小動態變化,需方法封裝邏輯(如延遲計算、同步控制、視圖映射等)。

常見面試陷阱題

  1. String.length() vs String.getBytes().length:
    
    String s = "中文";
    s.length();           // 2 (字元數/代碼點數)
    s.getBytes().length;  // 6 (UTF-8 編碼位元組數)
    s.getBytes("GBK").length; // 4 (GBK 編碼位元組數)
    
  2. 陣列 length 邊界:
    
    int[][] matrix = new int[3][4];
    matrix.length;        // 3 (外層陣列長度)
    matrix[0].length;     // 4 (內層陣列長度)
    matrix[1].length;     // 4 (各行長度可不同!)
    
  3. 空陣列 vs null:
    
    int[] empty = new int[0];
    empty.length; // 0
    
    int[] nil = null;
    nil.length;   // NullPointerException
    

總結對比表

介面/類方法含義
Collectionsize()元素個數
Listsize()元素個數
Setsize()元素個數
Mapsize()鍵值對個數
Queuesize()元素個數
類型獲取方式本質可變性備註
陣列.lengthfinal 實例欄位建立後固定JVM 內建,無類定義
String.length()實例方法不可變封裝底層陣列/位元組
Collection/Map.size()介面方法動態變化統一介面契約

記憶口訣

陣列屬性 length,字串方法 length(),集合統一 size()。
陣列固定看屬性,字串封裝看方法,集合動態看介面。

掌握這三者的設計哲學差異,不僅能避免低級錯誤,更能深入理解 Java 類型系統的封裝與抽象藝術。

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