這是 Java 面試高頻考點,也是新手易混淆的基礎知識。本質上反映了三種不同數據結構的長度獲取方式。
| API | 類型 | 適用對象 | 本質 | 示例 |
|---|---|---|---|---|
length | 屬性 (field) | 數組 | JVM 內部記錄的數組長度,O(1) 直接讀取 | int[] arr = new int[3]; arr.length // 3 |
length() | 方法 (method) | String、StringBuilder、StringBuffer、CharSequence 實現類 | 字符序列邏輯長度(字符數),O(1) 返回內部 count 字段 | "Hello".length() // 5 |
size() | 方法 (method) | Collection、Map、List、Set 等集合框架類 | 容器中元素個數,通常 O(1) 返回內部 size 字段 | new ArrayList<>().size() // 0 |
// 1. 數組 - 屬性
int[] arr = {1, 2, 3};
int lenArr = arr.length; // 3
// 2. 字符串 - 方法
String str = "Hello World Java";
int lenStr = str.length(); // 16 (含空格)
// 3. 集合 - 方法
Collection<String> col = new ArrayList<>();
col.add("Hello"); col.add("World"); col.add("Java");
int sizeCol = col.size(); // 3
// Map 同理
Map<String, Integer> map = new HashMap<>();
map.put("a", 1); map.put("b", 2);
int mapSize = map.size(); // 2
length 直接讀取對象頭字段,無方法調用開銷。private final char[] value (JDK 8) 或 byte[] value (JDK 9+),length() 返回 value.length (JDK 8) 或根據編碼計算字符數 (JDK 9+ compact strings)。AbstractCollection 定義 size() 為抽象方法,各實現類 (ArrayList, HashMap 等) 維護 size 字段,增刪操作同步更新,size() 直接返回。arr.length():數組無方法,編譯報錯str.length:String 無公共 length 屬性,編譯報錯list.length 或 map.length():集合框架統一用 size()length():實現 CharSequence 接口記住口訣:數組看屬性,字符串看方法,集合看 size(),一行代碼寫對不出錯。