Java集合框架

集合概述

集合是Java中提供的一种容器,可以用来存储多个容器。
数组和集合都是容器,两者之间的区别:

  • 数组的长度是固定的,集合的长度是可变的。
  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象,而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

集合框架

自己总结了集合的主要框架,并整理了框架结构,如下图所示:
在这里插入图片描述

集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合
java.util.Map

  • Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接
    口,分别是 java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元素可重
    复。 Set 的特点是元素无序,而且不可重复。 List 接口的主要实现类有 java.util.ArrayList
    和 java.util.LinkedList , Set 接口的主要实现类有 java.util.HashSet 和
    java.util.TreeSet 。
  • Collection 常用功能
    • Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,
      这些方法可用于操作所有的单列集合。方法如下
    • public boolean add(E e) : 把给定的对象添加到当前集合中 。
    • public void clear() :清空集合中所有的元素。
    • public boolean remove(E e) : 把给定的对象在当前集合中删除。
    • public boolean contains(E e) : 判断当前集合中是否包含给定的对象。
    • public boolean isEmpty() : 判断当前集合是否为空。
    • public int size() : 返回集合中元素的个数。
    • public Object[] toArray() : 把集合中的元素,存储到数组中。

List集合

我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢?
接下来,我们一起学习Collection中的常用几个子类( java.util.List 集合、 java.util.Set 集
合)。

List接口介绍

java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了
List 接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行
存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有
序,即元素的存入顺序和取出顺序一致。

List 集合特点

  • 元素的存取有序。
  • 自带索引,通过索引可以精确的操作集合中的元素。
  • 集合中可以有重复的元素,通过元素的equals方法,来比较是否是重复的元素。

List接口中常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元
素索引来操作集合的特有方法,如下:

  • public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上.
  • public E get(int index) :返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新
    前的元素。

ArrayList集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。

LinkedList集合

java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList是一个双向链表
LinkedList是List的子类,List中的方法LinkedList都是可以使用

实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可:

  • public void addFirst(E e) :将指定元素插入此列表的开头。
  • public void addLast(E e) :将指定元素添加到此列表的结尾。
  • public E getFirst() :返回此列表的第一个元素。
  • public E getLast() :返回此列表的最后一个元素。
  • public E removeFirst() :移除并返回此列表的第一个元素。
  • public E removeLast() :移除并返回此列表的最后一个元素。
  • public E pop() :从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e) :将元素推入此列表所表示的堆栈。
  • public boolean isEmpty() :如果列表不包含元素,则返回true。

Iterator迭代器

Iterator接口

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口
java.util.Iterator 。 Iterator 接口也是Java集合中的一员,但它与 Collection 、 Map 接口有所
不同, Collection 接口与 Map 接口主要用于存储元素,而 Iterator 主要用于迭代访问(即遍历)Collection 中的元素,因此 Iterator 对象也被称为迭代器。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方
法:

  • public Iterator iterator() : 获取集合对应的迭代器,用来遍历集合中的元素的。
  • Iterator接口的常用方法如下:
    • public E next() :返回迭代的下一个元素。
    • public boolean hasNext() :如果仍有元素可以迭代,则返回 true。

Set接口

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。与 List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

HashSet集合介绍

java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的
(即存取顺序不一致)。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。

HashSet集合存储数据的结构(哈希表)

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。

Map 接口

Map接口定义方式: public interface Map<K,V>
Map接口的常用方法如下:

  • void clear() 普通 清空 Map 集合中的内容
  • boolean containsKey(Object key) 判断集合中是否存在指定的 key
  • boolean containsValue(Object value) 判断集合中是否存在指定的 value
  • Set<Map.Entry<K,V>> entrySet() 将 Map 接口变为 Set 集合
  • V get(Object key) 根据 key 找到其对应的 value
  • boolean isEmpty() 判断是否为空
  • Set keySet() 将全部的 key 变为 Set 集合
  • Collection values() 将全部的 value 变为 Collection 集合
  • V put(K key,V value) 向集合中增加内容
  • void putAll(Map<? extends K,? extends V> m) 增加一组集合
  • V remove(Object key) 根据 key 删除内容

HashMap

HashMap 是 Map 的子类, 此类的定义如下:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

Hashtable

Hashtable 是一个最早的 key => value 的操作类, 本身是在 JDK 1.0 的时候推出的。 其基本操作与 HashMap 是类似的。

关于 Map 集合的输出

在 Collection 接口中, 可以使用 iterator()方法为 Iterator 接口实例化, 并进行输出操作, 但是在 Map 接口中并没有此方法的定义, 所以 Map 接口本身是不能直接使用 Iterator 进行输出的。因为 Map 接口中存放的每一个内容都是一对值, 而使用 Iterator 接口输出的时候, 每次取出的都实际上是一个完整的对象。 如果此时非要使用 Iterator 进行输出的话, 则可以按照如下的步骤进行:

  • 使用 Map 接口中的 entrySet()方法将 Map 接口的全部内容变为 Set 集合。
  • 可以使用 Set 接口中定义的 iterator()方法为 Iterator 接口进行实例化。
  • 之后使用 Iterator 接口进行迭代输出, 每一次的迭代都可以取得一个 Map.Entry 的实例。
  • 通过 Map.Entry 进行 key 和 value 的分离。
package org.listdemo.mapoutdemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapOutDemo01 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("ZS", "张三");
map.put("LS", "李四");
map.put("WW", "王五");
map.put("ZL", "赵六");
map.put("SQ", "孙七");
Set<Map.Entry<String, String>> set = map.entrySet();// 变为Set实例
Iterator<Map.Entry<String, String>> iter = set.iterator();
while (iter.hasNext()) {
Map.Entry<String, String> me = iter.next();
System.out.println(me.getKey() + " --> " + me.getValue());
         }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值