Java里size方法和length有什么区别_Java集合与数组对比说明

调用 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 接口实现类(ArrayListHashSetLinkedList 等)都必须提供的方法;Map(如 HashMap)也提供 size(),表示键值对数量。

  • "hello".length() → 返回 5(字符串字符数)
  • new ArrayList().size() → 返回 0(当前元素个数)
  • new HashMap().size() → 返回 0(当前 key-value 对数)

底层其实都靠数组?那 size() 性能如何?

大多数集合(如 ArrayList)内部确实用数组存储,size() 方法只是返回一个维护好的计数器字段(如 ArrayList 中的 size 成员变量),不是遍历计算,所以是 O(1) 时间复杂度——和访问数组 length 一样快。

  • 别担心性能,放心调用 size()
  • 但注意:size() 返回的是“当前元素个数”,不是容量(capacity)。比如 new ArrayList(100) 刚创建时 size()0,而内部数组长度可能是 10100(取决于实现)
  • 数组的 length 永远等于其分配的总槽位数,不管里面是不是 null
String[] arr = new String[5];
System.out.println(arr.length); // 输出 5 —— 即使全是 null

List list = new ArrayList<>();
list.add("x");
System.out.println(list.size()); // 输出 1 —— 只算已添加的元素

最常被忽略的一点:泛型擦除后,list.size() 仍是安全的运行时调用;而 arr.length 是编译期就确定的固定值——前者反映逻辑大小,后者反映物理空间。别用 size() 去判断数组,也别用 length 去查集合,Java 不会帮你自动转换。