zoukankan      html  css  js  c++  java
  • Java学习之==>集合体系(待续。。)

    一、概述

    Java的集合体系,本质上是一个陈放数据的容器,像之前学过的数组也是陈放数据的容器,但在 Java 中数组的长度是固定的,使用起来没那么方便。集合提供了更加强大的功能,使用起来也更方便和快捷。集合体系中提供的方法的底层源代码采用的也是优秀的高效率算法,其他数据容器能操作的,集合都能操作,而且代码更加简洁,思路更加清晰,运行的效率更加高。因此,完全掌握完集合。编程的技能会进一步提高。

    二、集合体系

    集合作为一个容器,可以存储多个元素,但是由于数据结构的不同,Java 提供了多种集合类,将集合类中共性的功能不断向上抽取,最终形成了集合体系结构。

    Java中集合体系的关系图:

    Collection:

    Map:

    • List、Set、Map 都是接口,List 和 Set 继承自 Collection 接口,Map 为独立接口;
    • AbstractCollection 作为 AbstractList、HashSet、TreeSet 的父类,实现自 Collection;
    • Set下有 HashSet、TreeSet、LinkedHashSet,LinkedHashSet 继承自 HashSet,实现自 Set,HashSet、TreeSet继承自 AbstractCollection 实现自Set;
    • List下有ArrayList、LinkedList、Vector,这三者继承自 AbstractList,而 AbstractList 继承自 AbstractCollection,实现自 List;
    • Map下有 AbstractMap、HashMap、TreeMap、LinkedHashMap;

    三、Collection体系

    1、Collection

    • 常见的方法有:add()、clear()、contains()、remove()等方法;
    • 从 Iterable 接口继承了 iterator() 和 splititerator() 方法;
    • 重要实现接口为 List、Set 和 Queue;

    2、List

    存储特点:

    • 有序;
    • 可重复;

    重要实现类:

    • ArrayList
    • LinkedList 

    3、LinkedList

    数据结构:

    • List是描述有序集合;
    • LinkedList是内部使用链表来实现的有序集合;

    体系机构图:

    4、ArrayList

    数据结构

    • List是描述有序集合;
    • ArrayList是内部使用数组实现的有序集合;

    体系结构图

    ArrayList VS LinkedList

    • 使用完全一致,因为实现自相同的接口List;
    • 场景略有区别(这一点不准确):?
      • ArrayList适合随机地操作(get,set)列表每个元素(数组的特性)的场景?;
      • LinkedList适合插入和删除比较频繁的场景?;

    ArrayList VS Vector

    • 内部实现基本一致,略微差异不过是个人的一些写法问题;
    • Vector是线程安全的,ArrayList是非线程安全的,在无线程安全需要的情况下,使用ArrayList;
    • 注: 一般列表的操作,多数是在线程内操作,因此涉及多线程的场景不是很多;

    ArrayList 与 LinkedList 性能测试

    我们先来写下面一段测试代码:

    /**
     * 自测下ArrayList与LinkedList在本地的机器上的性能
     *
     * 主要是验证 LinkedList是不是所有数据都是删除和修改最快
     *
     */
    public class Topic1 {
    
      public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
    
    
        long start = System.currentTimeMillis();
        for (int i=0;i<=10000;i++){
          list1.add(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("arraylist time:" + (end - start));
    
        List<Integer> list2 = new LinkedList<>();
    
        long start1 = System.currentTimeMillis();
        for (int i=0;i<=10000;i++){
          list2.add(i);
        }
        long end1 = System.currentTimeMillis();
        System.out.println("linkedList time:" + (end1 - start1));
    
      }
    测试代码

    我们分别测试往 ArrayList 和 LinkedList 中添加 1万、10万、80万、100万条数据,查看其执行时间,运行结果如下:

    到80万条数据时,ArrayList 用时已经比 LinkedList 少,只不过这时时间还比较接近。

    以上结果分别代表1万、10万、80万、100万条数据的测试结果,到100万条数据时,ArrayList 所用时间远远少于 LinkedList。

    所以,我们说LinkedList适合插入和删除比较频繁的场景是不准确的,和数据量的大小有关。

    四、Set

    存储特点:

    • 无序;
    • 不可重复;

    重要实现类:

    • HashSet;
    • LinkedHashSet;

    1、HashSet

    数据结构:

    • 散列集;

    体系结构图:

    2、LinkedHashSet

    数据结构:

    • 散列集;

    体系结构图:

    五、Map

    重要实现类

    • HashMap;
    • LinkedHashMap;
    • TreeMap;

    Map体系结构图

    未完待续。。。

  • 相关阅读:
    scratch第四集——过河孙小弟
    scratch第二集——scratch中的知识帧动画怎么用?
    scratch第九集——雷霆打怪大作战
    scratch第三集——scratch列表方法
    scratch第一集——飞机大作战
    position
    BOM与DOM
    grid布局
    登录界面
    用js输出同样字符出现的次数
  • 原文地址:https://www.cnblogs.com/L-Test/p/11477478.html
Copyright © 2011-2022 走看看