【集合】1.集合体系
1. 体系介绍
集合是分单列集合(Collection)和双列集合(Map)两大类


2. Collection接口
2.1 接口介绍
- Collection的实现类可以存放多个元素,每个元素的类型是Object
- 有些Collection的实现类可以(List)存放重复元素,有些不可以(Set)
- 有些Collection的实现类是有序的(List),有些不是有序(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现
2.2 常用方法
- boolean add(E e)
- 添加单个元素
- boolean addAll(Collection<? extends E> c)
- 添加多个元素
- boolean remove(Object o)
- 删除指定元素
- boolean removeAll(Collection<?> c)
- 删除多个元素
- boolean contains(Object o)
- 查看元素是否存在
- boolean containsAll(Collection<?> c)
- 查找多个元素是否都存在
- int size()
- 获取元素个数
- boolean isEmpty()
- 判断是否为空
- void clear()
- 清空集合
2.3 Collection遍历方式
2.3.1 Iterator迭代器
2.3.1.1 介绍
- Iterator对象称为迭代器,主要用于遍历Collection集合中的元素。
- 所有实现了Collection接口的结合类都有一个来自Iterator接口的iterator()方法,用以返回一个实现了Iterator接口的迭代器对象。
- Iterator仅用于遍历结合,Iterator本身并不存放对象。
2.3.1.2 接口方法
- boolean hasNext()
- 检测集合中是否还有元素
- E next()
- 返回迭代器的下一个元素,并更新迭代器的状态
- void remove()
- 将迭代器返回的元素删除
注意:在调用next()方法之前必须调用hasNext()进行检测。若不调用并且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
2.3.1.3 使用案例
@Test
public void testIterator() {
Collection coll = new ArrayList();
coll.add(1);
coll.add(2);
// 得到集合的迭代器
Iterator iterator = coll.iterator();
// 判断是否还有下一个元素
while (iterator.hasNext()) {
// 返回当前元素并游标下移
System.out.println(iterator.next());
}
}
2.3.2 增强for循环
2.3.2.1 介绍
增强for循环可以替代iterator迭代器。增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组。
2.3.2.2 基本语法
for (元素类型 元素名 : 集合名或数组名) {
访问元素
}
2.3.2.3 使用案例
@Test
public void testFor() {
Collection coll = new ArrayList();
coll.add(1);
coll.add(2);
for (Object o : coll) {
System.out.println(o);
}
}
3. Map接口
3.1 接口介绍
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。
- Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中。
- Map中的key不允许重复,value可以重复。
- Map的key可以为null,value也可以为null,但key为null只能有一个,value为null可以有多个。
- 常用String类作为Map的key。
- key和value之间存在单向一对一关系,即通过指定的key获取对应的value。
3.2 常用方法
- V put(K key, V value)
- 添加或替换
- V remove(Object o)
- 根据键删除映射关系
- V get(Object o)
- 根据键获取值
- int size()
- 获取元素个数
- boolean isEmpty()
- 判断个数是否为0
- void clear()
- 清空map集合
- boolean containsKey(Object key)
- 查找键是否存在
3.3 Map遍历方式
3.3.1 KeySet键集合
public void testKeySet(Map map) {
Set keySet = map.keySet();
for (Object key : keySet) {
System.out.println(key + "=" + map.get(key));
}
}
3.3.2 Values值集合
public void testValues(Map map) {
Collection values = map.values();
for (Object value : values) {
System.out.println(value);
}
}
3.3.3 EntrySet键值对集合
public void testEntrySet(Map map) {
Set entrySet = map.entrySet();
for (Object o : entrySet) {
Map.Entry entry = (Map.Entry)o;
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
3.4 Map子类介绍
3.4.1 HashMap
- HashMap是Map接口使用频率最高的实现类。
- HashMap是以key-val对的方式来存储数据(HashMap$Node类型)
- key不可以重复,但是值可以重复,允许使用null键和null值。
- 如果添加相同的key,则会覆盖原来的key-val,等同于修改。
- 不保证映射的顺序,底层是以hash表的方式存储的。
- HashMap没有实现线程同步,因此是线程不安全的,方法没有做同步互斥操作,没有synchronized。
3.4.2 Hashtable
- 存放的元素时键值对:K-V
- Hashtable的键和值都不能为null,否则会抛出NullPointerException。
- Hashtable的使用方法基本上和HashMap一样。
- Hashtable是线程安全的(synchronized)。
3.4.3 Properties
- Properties类继承于Hashtable类。
- 使用方法和Hashtable类似。
- Properties还可以用于从xxx.properties文件中加载数据到Properties类对象,进行读取和修改。
- 具体使用方法可查看【IO编程】9.Properties类。
3.4.5 HashMap和Hashtable对比
| 版本 | 线程安全(同步) | 效率 | 允许null键null值 | |
|---|---|---|---|---|
| HashMap | 1.2 | 不安全 | 高 | 可以 |
| Hashtable | 1.0 | 安全 | 较低 | 不可以 |
浙公网安备 33010602011771号