Java集合Collection与Map那点事

文章目录一 什么是集合二 Collection体系集合三 List接口与实现类3.1 List子接口3.2 List实现类3.2.1 ArrayList(重点)3.2.2 Vector3.2.3 LinkedList3.3 不同实现方法四 Set接口与实现类4.1 Set子接口4.2 Set实现类4.2.1 HashSet(重点)4.2.2 LinkedHashSet4.2.3 TreeSet五 Map接口与实现类5.1 Map结构5.2 Map父接口(map意为映射)5.3 Map集合的实现类5.3.1
摘要由CSDN通过智能技术生成

一 什么是集合

  • 概念: 对象的容器,存储对象的对象,可代替数组
  • 特点: 容器的工具类,定义了对多个对象进行操作的常用方法
  • 位置: java.util.*;

二 Collection体系集合

collection2

其中:

  • 外框为虚线的表示接口,边框为实线的表示类;
  • 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类。

为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍。

从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是:

  • List:使用最多的有序集合,提供方便的新增、修改、删除的操作;
  • Set:集合不允许有重复的元素,在许多需要保证元素唯一性的场景中使用。

Collection父接口

  • 特点: 代表一组任意类型的对象,无序、无下标
  • 方法:
    • boolean add(Object obj) //添加一个对象
    • boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合
    • void clear() //清空此集合中的所有对象
    • boolean contains(Object o) //检查此集合中是否包含o对象
    • boolean equals(Object o) //比较此集合是否与指定对象相等
    • boolean idEmpty() //判断此集合是否为空
    • boolean remove(Object o) //在此集合中移除o对象
    • int size() //返回此集合中的元素个数
    • Object[] toArray() //将此集合转换成数组

三 List接口与实现类

3.1 List子接口

  • 特点: 有序、有下标、元素可以重复
  • 方法:
    • void add(int index, Object o) //在index位置插入对象o
    • boolean addAll(int index, Collection c) //将一个集合中的元素添加到集合中的index位置
    • Object get(int index) //返回集合中指定位置的元素
    • List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元素

3.2 List实现类

3.2.1 ArrayList(重点)
  • 数组结构实现,查询快、增删慢
  • JDK1.2版本,运行效率快、线程不安全
  • ArrayList 是最常见的非线程安全的有序集合,因为内部是数组存储的,所以随机访问效率很高,但非尾部的插入和删除性能较低,如果在中间插入元素,之后的所有元素都要后移。ArrayList 的使用与 Vector 类似。
  • arrayList 初始化空数组,add 初始化10长度的数组,超过10,1.5倍扩容
3.2.2 Vector
  • 数组结构实现,查询快、增删慢

  • JDK1.0版本,运行效率慢、线程安全

  • Vector 是 Java 早期提供的线程安全的有序集合,如果不需要线程安全,不建议使用此集合,毕竟同步是有线程开销的。

    使用示例代码:

    Vector vector = new Vector();
    vector.add("dog");
    vector.add("cat");
    vector.remove("cat");
    System.out.println(vector);
    

    程序执行结果:[dog]

3.2.3 LinkedList
  • 链表结构实现,增删快,查询慢

  • LinkedList 是使用双向链表数据结构实现的,因此增加和删除效率比较高,而随机访问效率较差。

  • 通常对于栈的操作会选取此数据结构,addLast先入后出,具体了解线性表数据结构。

    LinkedList 除了包含以上两个类的操作方法之外,还新增了几个操作方法,如 offer() 、peek() 等,具体详情,请参考以下代码:

    LinkedList linkedList = new LinkedList();
    // 添加元素
    // add和addLast是尾部添加
    linkedList.add("first");
    linkedList.add("second");
    linkedList.add("third");
    linkedList.addLast("fouth");
    
     // push和addFirst是头部添加
    linkedList.addFirst("zero");
    linkedList.push("temp");
    // 获取第一个元素
    System.out.println(linkedList.peek());
    // 获取第一个元素,并删除此元素
    System.out.println(linkedList.poll());
    System.out.println(linkedList);
    
    

    程序的执行结果:

    Connected to the target VM, address: '127.0.0.1:1026', transport: 'socket'
    temp
    zero
    first
    second
    third
    fouth
    Disconnected from the target VM, address: '127.0.0.1:1026', transport: 'socket'
    
    

3.3 不同实现方法

List接口实现类的不同实现方法


四 Set接口与实现类

4.1 Set子接口

  • 特点: 无序、无下标、元素不可重复
  • 方法: 全部继承自Collection中的方法

4.2 Set实现类

4.2.1 HashSet(重点)
  • 基于HashCode实现元素不重复

  • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入

  • HashSet 是一个没有重复元素的集合。虽然它是 Set 集合的子类,实际却为 HashMap 的实例,相关源码如下:

    public HashSet() {
         
        map = new HashMap<>();
    }
    

    因此 HashSet 是无序集合,没有办法保证元素的顺序性。

    HashSet 默认容量为 16,每次扩充 0.75 倍,相关源码如下:

    public HashSet(Collection<? extends E> c) {
         
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    

    HashSet 的使用与 Vector 类似。

4.2.2 LinkedHashSet
  • 链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序

  • LinkedHashSet 是按照元素的 hashCode 值来决定元素的存储位置,但同时又使用链表来维护元素的次序,这样使得它看起来像是按照插入顺序保存的。

    LinkedHashSet 的使用与 Vector 类似。

4.2.3 TreeSet
  • 基于排列顺序实现元素不重复

  • 实现了SortedSet接口,对集合元素自动排序

  • 元素对象的类型必须实现Comparable接口,指定排序规则

  • 通过CompareTo方法确定是否为重复元素

  • TreeSet 集合实现了自动排序,也就是说 TreeSet 会把你插入数据进行自动排序。

    示例代码如下:

    TreeSet treeSet = new TreeSet();
    treeSet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值