594 字
2 分钟
Java数组与集合详解
数组和集合是Java里打交道最多的东西了,刚学的时候觉得数组够用就行,后来发现ArrayList和HashMap才是真香。不过面试的时候面试官总喜欢问底层实现,搞得我不得不把源码翻出来啃。这篇文章就是我当时啃完之后的笔记整理。
Java数组与集合详解
数组
数组是一个固定大小的容器,存储相同类型的元素。不过日常开发中用数组的地方真不多,大部分时候都用ArrayList代替了——数组不能动态扩容这点太不友好了。
声明和初始化
// 静态初始化int[] numbers = {1, 2, 3, 4, 5};String[] names = {"张三", "李四", "王五"};
// 动态初始化int[] numbers = new int[5];String[] names = new String[3];数组的局限性
- 固定大小,不能动态扩容
- 只能存相同类型
- 没有内置的添加、删除方法
- 要扩容得手动创建新数组+复制元素
集合框架
为了克服数组的局限性,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(); // 1HashMap 常用操作
Map<String, Integer> scores = new HashMap<>();scores.put("张三", 95);scores.get("张三"); // 95scores.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推荐用entrySetfor (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]);常见陷阱
Arrays.asList()返回的是固定大小的列表——不支持add和remove,会抛异常- 用可变对象做HashMap的key——改了对象的属性后就再也get不到了。这个坑我踩过,debug了半天才反应过来
- 遍历时修改集合——会抛
ConcurrentModificationException - HashSet/HashMap的元素需要正确实现equals和hashCode
💡 实战贴士: 初始化集合时如果能预估大小,尽量指定初始容量。比如知道要存100个元素,
new ArrayList<>(100)比默认容量省了一次扩容开销。HashMap的初始容量也要注意,负载因子0.75,所以new HashMap<>(100)实际能存75个元素就要扩容了。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
Java集合框架详解
Java Java集合框架的源码翻来覆去看了好几遍,每次看都有新收获。从ArrayList到ConcurrentHashMap,每个集合背后都有精妙的设计思想。
2
Java运算符与表达式详解
Java ++i和i++的区别是多少Java新手的噩梦?还有位运算虽然平时用得少,但在权限系统和性能优化场景下简直是神器。
3
Java基础入门:变量与数据类型详解
Java 变量和数据类型是Java入门的第一个坎,当年搞混int和Integer的时候debug了一下午。这篇文章把基本类型和引用类型的区别掰开揉碎了讲清楚。
4
Java序列化与反序列化详解
Java serialVersionUID不写会怎样?transient关键字有什么用?序列化这些看似简单的细节,搞不好就是线上事故的导火索。
5
Java注解详解
Java 刚学Java时觉得注解不就是几个@符号嘛,后来用Spring Boot才发现注解能玩出这么多花样——从编译检查到运行时注入,注解远不止看起来那么简单。






