【集合】1.集合体系

1. 体系介绍

集合是分单列集合(Collection)双列集合(Map)两大类

collection

map

2. Collection接口

2.1 接口介绍

  1. Collection的实现类可以存放多个元素,每个元素的类型是Object
  2. 有些Collection的实现类可以(List)存放重复元素,有些不可以(Set)
  3. 有些Collection的实现类是有序的(List),有些不是有序(Set)
  4. 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 介绍
  1. Iterator对象称为迭代器,主要用于遍历Collection集合中的元素。
  2. 所有实现了Collection接口的结合类都有一个来自Iterator接口的iterator()方法,用以返回一个实现了Iterator接口的迭代器对象。
  3. 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 接口介绍

  1. Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。
  2. Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中。
  3. Map中的key不允许重复,value可以重复。
  4. Map的key可以为null,value也可以为null,但key为null只能有一个,value为null可以有多个。
  5. 常用String类作为Map的key。
  6. 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

  1. HashMap是Map接口使用频率最高的实现类。
  2. HashMap是以key-val对的方式来存储数据(HashMap$Node类型)
  3. key不可以重复,但是值可以重复,允许使用null键和null值。
  4. 如果添加相同的key,则会覆盖原来的key-val,等同于修改。
  5. 不保证映射的顺序,底层是以hash表的方式存储的。
  6. HashMap没有实现线程同步,因此是线程不安全的,方法没有做同步互斥操作,没有synchronized。

3.4.2 Hashtable

  1. 存放的元素时键值对:K-V
  2. Hashtable的键和值都不能为null,否则会抛出NullPointerException。
  3. Hashtable的使用方法基本上和HashMap一样。
  4. Hashtable是线程安全的(synchronized)。

3.4.3 Properties

  1. Properties类继承于Hashtable类。
  2. 使用方法和Hashtable类似。
  3. Properties还可以用于从xxx.properties文件中加载数据到Properties类对象,进行读取和修改。
  4. 具体使用方法可查看【IO编程】9.Properties类

3.4.5 HashMap和Hashtable对比

版本 线程安全(同步) 效率 允许null键null值
HashMap 1.2 不安全 可以
Hashtable 1.0 安全 较低 不可以
posted @ 2021-08-08 16:04  haojinglei  阅读(320)  评论(0)    收藏  举报