mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
594 字
2 分钟
Java数组与集合详解
2026-02-04

数组和集合是Java里打交道最多的东西了,刚学的时候觉得数组够用就行,后来发现ArrayList和HashMap才是真香。不过面试的时候面试官总喜欢问底层实现,搞得我不得不把源码翻出来啃。这篇文章就是我当时啃完之后的笔记整理。

Java数组与集合详解#

数组#

数组是一个固定大小的容器,存储相同类型的元素。不过日常开发中用数组的地方真不多,大部分时候都用ArrayList代替了——数组不能动态扩容这点太不友好了。

声明和初始化#

// 静态初始化
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"张三", "李四", "王五"};
// 动态初始化
int[] numbers = new int[5];
String[] names = new String[3];

数组的局限性#

  1. 固定大小,不能动态扩容
  2. 只能存相同类型
  3. 没有内置的添加、删除方法
  4. 要扩容得手动创建新数组+复制元素

集合框架#

为了克服数组的局限性,Java提供了集合框架。核心接口:

  • Collection:所有集合的根接口
    • List:有序,允许重复
    • Set:无序,不允许重复
    • Queue:队列,FIFO
  • Map:键值对,不继承Collection

常用实现类#

List

  • ArrayList:基于动态数组,查询快,增删慢
  • LinkedList:基于双向链表,增删快,查询慢

Set

  • HashSet:基于哈希表,无序
  • LinkedHashSet:保持插入顺序
  • TreeSet:排序(红黑树)

Map

  • HashMap:基于哈希表,无序
  • LinkedHashMap:保持插入顺序
  • TreeMap:排序

ArrayList 常用操作#

List<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.get(0); // 张三
names.remove(1); // 删除李四
names.size(); // 1

HashMap 常用操作#

Map<String, Integer> scores = new HashMap<>();
scores.put("张三", 95);
scores.get("张三"); // 95
scores.remove("李四");
// 遍历
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}

集合的遍历方式#

// for-each(最常用)
for (String name : names) { ... }
// 迭代器(需要删除元素时用)
Iterator<String> it = names.iterator();
while (it.hasNext()) {
if (it.next().equals("张三")) {
it.remove();
}
}
// 遍历Map推荐用entrySet
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// ...
}

数组与集合的转换#

// 数组转集合
List<String> list = Arrays.asList(array);
Set<String> set = new HashSet<>(Arrays.asList(array));
// 集合转数组
String[] array = list.toArray(new String[0]);

常见陷阱#

  1. Arrays.asList()返回的是固定大小的列表——不支持add和remove,会抛异常
  2. 用可变对象做HashMap的key——改了对象的属性后就再也get不到了。这个坑我踩过,debug了半天才反应过来
  3. 遍历时修改集合——会抛 ConcurrentModificationException
  4. HashSet/HashMap的元素需要正确实现equals和hashCode

💡 实战贴士: 初始化集合时如果能预估大小,尽量指定初始容量。比如知道要存100个元素,new ArrayList<>(100) 比默认容量省了一次扩容开销。HashMap的初始容量也要注意,负载因子0.75,所以 new HashMap<>(100) 实际能存75个元素就要扩容了。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时

目录