一、概述

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体系结构图

未完待续。。。

Java学习之==>集合体系(待续。。)的更多相关文章

  1. java学习笔记 --- 集合

    1.定义:集合是一种容器,专门用来存储对象 数组和集合的区别?   A:长度区别  数组的长度固定 集合长度可变 B:内容不同  数组存储的是同一种类型的元素  而集合可以存储不同类型的元素  C:元 ...

  2. Java学习之集合(Collection接口)

    集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储 集合特点: 1.用于存储对象的容器 2.集合长度可变 3.不可以存储基本数据类型 集合体系的顶层C ...

  3. java学习笔记—集合之Map集合

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Times } p.p2 { margin: 0.0p ...

  4. Java学习:集合双列Map

    数据结构 数据结构: 数据结构_栈:先进后出 入口和出口在同一侧 数据结构_队列:先进先出 入口和出口在集合的两侧 数据结构_数组: 查询快:数组的地址是连续的,我们通过数组的首地址可以找到数组,通过 ...

  5. Java学习之==>异常体系

    一.定义 程序运行时总是会遇到各种各样的问题,Java中的异常体系就是针对这些问题提出的统一的处理方案.在Java中,将这些各种各样的问题进行归类后,统一称为异常. 二.分类 我们先来看看下面这个图: ...

  6. 0015 Java学习笔记-集合-TreeMap集合

    主要的方法 构造方法: TreeMap(); TreeMap(Comparator<?super K> comparator); TreeMap(Map<? extends K,? ...

  7. 0014 Java学习笔记-集合-HashMap集合

    主要的方法 + 构造方法: * HashMap(); - 默认大小16,负载因子0.75 * HashMap(int initialCapacity); * HashMap(int initialCa ...

  8. Java学习日记 集合

    一.接口Map<K,V>1.V put(K key, V value)2.int size()3.public class HashMap<K, V> implements M ...

  9. Java学习笔记--集合元素的比较Comparable,Comparator

    原文见: http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个 ...

随机推荐

  1. 高性能mysql 第11章 可扩展的mysql

    可扩展性的定义:当增加资源以获得执行更多的工作系统能获得划算的同等提升. 向上扩展(垂直扩展):提升服务器的硬件性能. 向外扩展(水平扩展):一般都是复制,拆分,数据分片(sharding). 复制: ...

  2. Python3数据结构汇总

    字符 列表 元组 集合 字典 能否被索引或切片 能 能 能 否 否 元素能否被编辑 否 能 否 能 能 增 1.list.append(x):把一个元素添加到列表的结尾: 2.list.insert( ...

  3. 【SQL-不重复插入】一条语句实现,插入不重复的记录到数据库

    Insert新纪录时,先查询SQL数据库中是否存在相同记录,如果存在,则不插入.  if not exists(select count(*) from [Admin] where Name='adm ...

  4. 'EF.Utility.CS.ttinclude' returned a null or empty string.

    需要安装https://www.microsoft.com/en-us/download/details.aspx?id=40762

  5. Python 模块Ⅲ

    globals() 和 locals() 函数 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字. 如果在函数内部调用 locals(),返回的 ...

  6. Qt修改图片的背景色及设置背景色为透明的方法

    先上干货. Qt下修改图片背景色的方法: 方法一: QPixmap CKnitWidget::ChangeImageColor(QPixmap sourcePixmap, QColor origCol ...

  7. Java多线程和并发(一),进程与线程的区别

    目录 1.进程和线程的由来 2.进程和线程的定义 3.进程和线程的区别 一.进程和线程的区别 1.进程和线程的由来 2.进程和线程的定义 进程是资源分配的最小单位,线程是CPU调度的最小单位 3.进程 ...

  8. 51 Nod 1066 Bash游戏

    1066 Bash游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到 ...

  9. RMQ的ST算法

    ·RMQ的ST算法    状态设计:        F[i, j]表示从第i个数起连续2^j个数中的最大值    状态转移方程(二进制思想):        F[i, j]=max(F[i,j-1], ...

  10. 谷歌浏览器安装 socketLog

    第一步(本地浏览器安装调试扩展) 下载扩展包并解压 链接:https://pan.baidu.com/s/14df0ewl_3wjRHc8H1jsrWQ提取码:yyu1 打开谷歌浏览器,地址栏输入 c ...