一、对照表
| 场景 | 写法 | 类型 |
|---|---|---|
| 数组 | arr.length |
**属性(没有括号)** |
| String 字符串 | str.length() |
**方法(有括号)** |
| 集合(List / Set / Queue) | list.size() |
**方法(有括号)** |
| Map(键值对) | map.size() |
**方法(有括号)** |
二、详解
1.length ------ 数组专用
// 多维数组
int[][] matrix = new int[3][4];
matrix.length; // 3(外层数组长度)
matrix[0].length; // 4(内层第一个数组长度)
为什么没有括号?
-
数组是 Java 中的特殊对象
-
length是数组对象的一个 final 成员变量(属性) -
数组一旦创建,长度不可变,所以直接作为属性暴露
// 多维数组
int[][] matrix = new int[3][4];
matrix.length; // 3(外层数组长度)
matrix[0].length; // 4(内层第一个数组长度)
2 .length() ------ String 专用
String str = "hello";
System.out.println(str.length()); // 5
为什么有括号?
String是一个类length()是String类定义的 实例方法- 内部实际是返回
char[] value的长度,但封装成了方法
!注意空指针问题:
String s = null;
s.length(); // NullPointerException
3 .size() ------ 集合框架专用
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list.size()); // 2
Set<Integer> set = new HashSet<>();
set.size(); // 0
Map<String, Integer> map = new HashMap<>();
map.size(); // 0
为什么用 size() 而不是 length()?
- 集合框架(
Collection接口)统一设计用size() - 表示"当前包含的元素个数"
- 集合大小是动态变化的,用方法更合理
三、常见易错点
错误写法
int[] arr = {1, 2, 3};
arr.length(); // 编译错误!数组没有 length() 方法
String s = "abc";
s.length; // 编译错误!String 没有 length 属性
List<String> list = new ArrayList<>();
list.length; // 编译错误!集合没有 length 属性
list.length(); // 编译错误!集合没有 length() 方法
字符串 vs 数组的坑
String[] strs = {"a", "b", "c"};
strs.length; // 3(数组长度)
strs[0].length(); // 1(第一个字符串的长度)