集合 学习


数组长度必须开始就指定,切增加和删除很麻烦,而 集合可以动态保存任意多个对象,增删很容易。

1. 整体框架体系

Java 的集合类主要分为以下两大类:
在这里插入图片描述

在这里插入图片描述

2. Collection

有的可以重复,有的不可以;还有的是有序的(List), 有些是无序的(Set)

2.1 Collection 遍历元素方式

2.1.1 使用 Iterator(迭代器)

注意: Iterator 仅用于遍历集合,本身不存放对象

Iterator iterator = coll.iterator; // 得到一个集合的迭代器
// hasNext(): 判断是否还有下一个元素。一开始是指向第一个元素之前的
while (iterator.hasNext()) {
	// next()作用: 1. 下移 2. 将下移以后集合位置上的元素返回
	System.out.println(iterator.next());
}

2.1.2 for 循环增强

for (Object object: coll) {
	System.out.println(object);
}

2.2 List 接口

特点:

  1. 有序,可重复
  2. 每个元素都有对应的索引,支持索引
  3. 可以根据序号存取容器中对应的元素
  4. 常用实现类:ArrayList, LinkedList, Vector

2.2.1 遍历方式

除了通用的两种方式以外,还可以用 普通 for 循环

for (int i = 0; i < list.size(); i++) {
	Object object list.get(i);
	System.out.println(object);
}

2.2.2 ArrayList, Vector 和 LinkedList

ArrayList, Vector

  1. ArrayList 可以加入多个 null
  2. 是由数组来实现数据存储的
  3. 基本等于 Vector,区别是 ArrayList 线程不安全,Vector线程安全(多线程,需要线程同步安全时建议使用)
    在这里插入图片描述

LinkedList

  1. LinkedList 底层实现了双向链表和双端队列
  2. 可以添加任意元素包括 null
  3. 线程不安全,没有实现同步

ArrayList,LinkedList 对比
在这里插入图片描述

  • 选择
    • ArrayList:改查更多
    • LinkedList:增删更多
    • 一般来说查询较多,也就是使用 ArrayList 更多,也有一起用的

2.3 Set

2.3.1 遍历方式

同 Collection 的那两种

2.3.2 HashSet

  1. HashSet 实际上是 HashMap
  2. 可以存放最多一个 null
  3. 无序且不能重复
    实现方式:
    在这里插入图片描述
    扩容细节:
    在这里插入图片描述

3. Map

3.1 Map 特点

  1. Map 与 Collection 并列存在,用于保存具有映射关系的数据:Key-Value
  2. Map 中的 Key 和 value 可以是任何引用类型的数据,会被封装到 HashMap$Node 对象中
  3. Map 中的 key 不允许重复, value 可以重复
  4. key 为 null的只能有一个,value不限制。key 通常是 String
  5. 可以通过 key 找到 value
  6. 在这里插入图片描述

3.2 Map 遍历元素方式

3.2.1 利用 Key 值

Set Keyset = map.keySet(); // 取出所有的 Key
// 1. 增强 for
for (Object key : Keyset) {
	System.out.println(key + "-" + map.get(key));
}
// 2. 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
	Object key = iterator.next();
	System.out.println(key + "-" + map.get(key));
}

3.2.2 利用 value (此时只有 value 值)

Collection values = map.values(); // 取出所有 value 放入集合
// 1. 增强 for
for (Object value : values) {
	System.out.println(value);
}
// 2. 迭代器
Iterator iterator = values.iterator();
while (iterator.hasNext()) {
	Object value = iterator.next();
	System.out.println(value);
}

3.2.3 通过 EntrySet 来获取 k-v

Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>>
//1. 增强 for
for (Object entry : entrySet) {
Map.Entry m = (Map.Entry) entry; // 将 entry 转成 Map.Entry
System.out.println(m.getKey() + "-" + m.getValue());
}
//2. 迭代器
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()) {
	Object entry = iterator.next();
	Map.Entry m = (Map.Entry) entry;
	System.out.println(m.getKey() + "-" + m.getValue());
}

3.3 HashMap 和 HashTable

HashMap 线程不安全, HashTable 线程安全
在这里插入图片描述
Properties 类:可以用于从 xxx.properties 文件中,加载数据到 Properties 类对象,并进行读取和修改

4. 总结

选择什么集合实现类:

  1. 先判断存储的类型是 一组对象 还是 一组键值对
  2. 一组对象[单列]:Collection 接口
    • 允许重复:List
      • 增删多:LinkedList
      • 改查多:ArrayList
    • 不允许重复:Set
      • 无序:HashSet
      • 排序:TreeSet
      • 插入和取出顺序一致:LinkedHashSet
  3. 一组键值对[双列]:Map
    • 键无序:HashMap
    • 键排序:TreeMap
    • 插入和取出顺序一致:LinkedHashMap
    • 读取文件:Properties
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值