调用 list.length 会报错,因为 List 是对象,没有 length 属性;数组才有 length 字段,而 List 使用 size() 方法获取元素个数,二者类型不同、不可互换。

size() 是集合的方法,length 是数组的属性,二者不能混用——写错会直接编译失败。
为什么调用 list.length 会报错?
因为 List(如 ArrayList)是对象,没有 length 这个属性;而数组(如 String[])是 Java 的原生类型,length 是其唯一公开的、只读的字段。
-
String[] arr = {"a", "b"};→ 正确:arr.length(返回2) -
List→ 错误:list = Arrays.asList("a", "b"); list.length(编译报错:cannot find symbol) - 正确写法只有:
list.size()
size() 和 length() 容易混淆?
是的,但它们根本不在同一维度:length() 是 String 类的方法,和集合无关;size() 是所有 Collection 接口实现类(ArrayList、HashSet、LinkedList 等)都必须提供的方法;Map(如 HashMap)也提供 size(),表示键值对数量。
-
"hello".length()→ 返回5(字符串字符数) -
new ArrayList().size()→ 返回0(当前元素个数) -
new HashMap().size()→ 返回0(当前 key-value 对数)
底层其实都靠数组?那 size() 性能如何?
大多数集合(如 ArrayList)内部确实用数组存储,size() 方法只是返回一个维护好的计数器字段(如 ArrayList 中的 size 成员变量),不是遍历计算,所以是 O(1) 时间复杂度——和访问数组 length 一样快。
立即学习“Java免费学习笔记(深入)”;
- 别担心性能,放心调用
size() - 但注意:
size()返回的是“当前元素个数”,不是容量(capacity)。比如new ArrayList(100)刚创建时size()是0,而内部数组长度可能是10或100(取决于实现) - 数组的
length永远等于其分配的总槽位数,不管里面是不是null
String[] arr = new String[5]; System.out.println(arr.length); // 输出 5 —— 即使全是 null Listlist = new ArrayList<>(); list.add("x"); System.out.println(list.size()); // 输出 1 —— 只算已添加的元素
最常被忽略的一点:泛型擦除后,list.size() 仍是安全的运行时调用;而 arr.length 是编译期就确定的固定值——前者反映逻辑大小,后者反映物理空间。别用 size() 去判断数组,也别用 length 去查集合,Java 不会帮你自动转换。










