《Java集合框架JCF(Java collection framework)》

一、什么是集合?

首先,我们先来大概了解一下集合,集合英文单词collection,在java属于集合框架的顶层接口,就像是容器,能储存任意数量的具有共同属性的对象。

java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。

1.集合与数组的区别

二、Java集合框架图解

“集合框架”其实就是由一组用来操作对象的接口组成,不同接口描述一组不同数据类型,容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。**接口:**是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。

精华版

集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
实现类:8个实现类(实线表示),对接口的具体实现。

在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。

接下来我就简单整理一下Java集合框架。

1.接口

1.1 Collection 接口

Collection接口 是Set接口 和 List接口 的父类接口

Collection接口描述:

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于Collection的子接口(如List和Set)。

Collection接口特点:Collection 接口存储一组不唯一,无序的对象。

  • 元素可以重复;
  • 元素无序

1.2 List 接口

List接口继承自Collection接口,同时也继承了Collection接口的全部方法;

List接口描述:

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List(列表)接口中的特点:不唯一,有序(插入顺序)的对象。

  • 元素有顺序(放进去是什么顺序,输出就是什么顺序)
  • 允许有重复的元素
  • 有下标,可以通过索引访问List对象容器中的元素
  • List的实现类通常支持null元素

1.3 set 接口

Set接口继承自Collection接口,同时也继承了Collection接口的全部方法;
Set接口描述:
Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。

Set (集)接口特点:唯一,无序的对象

  • 元素是无序的;(无序指的是存入元素的先后顺序与输出的先后顺序不一致)
  • 无下标,不能通过下标获值,不能用一般的for循环遍历,要使用foreach增强for循环遍历,或迭代器;
  • 集合中的元素是唯一的,不能重复的;
  • 必须重写equals()方法和hashCode()方法

<List接口和Set接口区别?>

1.List接口中:元素是有序的,可以重复的。Set接口中,元素是无序的,不可以重复的;

2.List检索(查找、修改)效率高,删除和插入效率低,会引起元素位置变化。Set检索效率低,删除和插入效率高,插入和删除不会引起元素位置变化;

3.List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。

1.4 Map 接口

Map接口描述:

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

map<键,值>键-值对

键无序,且不能重复;

值可以重复;只能通过键来取值;

map中有一个Entry的内部接口,其实就是保存的键和值在一起的内容,整个一起的内容放到了Set集合中。

Set<Map.Entry<String,Student>> it = entry.iterator();while(it.hasNext()){Map.Entry<String,Student> ss = it.next();system.out.println();
}

2. 实现类

是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、TreeSet、HashSet、HashMap。

2.1 ArrayList 动态数组列表

ArrayList<E> list = new ArrayList<E>();

ArrayList 底层基于数组的实现;

特点:

1.元素有序;

2.元素可以重复;

3.元素中可以有null元素;

4.非线性安全的;

优点:查找、修改效率高;

缺点:插入、删除效率低;

与数组的区别就是:没有确定的大小,长度可以按需求增加,底层默认赋初始值为10。

该类实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。

2.1.1 ArrayList常用方法

2.2LinkedList 链表

LinkedList<E> list = new LinkedList<E>();

基于底层双向循环链表实现的。

特点:

1.元素有顺序;

2.允许有重复的元素;

3.允许有null(空)元素;

4.非线性安全的;

优点:插入、删除效率高;

缺点:查找、修改效率低。

第一个和最后一个元素是重要的,它有个虚拟的假下标,通过第一个依次找到下一个。

链表(LinkedList)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表。

该类实现了List接口,主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。例如:

List list=Collections.synchronizedList(newLinkedList(...));

2.2.1 LinkedList常用方法

2.3 Vector 向量

该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。不常使用了。

特点:

1.线性安全的;

<ArrayList 和 LinkedList使用场景?>

以下情况使用 ArrayList :

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。
  • 优点:查找、修改效率高;

以下情况使用 LinkedList :

  • 你需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
  • 优点:插入、删除效率高;

<ArrayList 和 Vector区别?>

相同点:

ArrayList 和 Vector 都是基于数组的实现;

区别:

ArrayList 线程不安全的,效率高,在算法上做了改进;

Vector 线程安全的,目前已经不怎么使用了。

在一些底层方法上ArrayList更加优化。

2.4 HashSet

HashSet是由哈希表来实现的

HashSet类描述:

该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。

HashSet特点:

1.元素没有顺序,即不会记录插入的顺序。用foreach增强for循环或迭代Iterator遍历;

2.不允许重复(比较的是哈希码);

3.允许包含null元素,但最多只能一个;

4.非线程安全的;

HashSet:内部的数据结构是哈希表,是线程不安全的。

HashSet中元素是唯一的:通过对象的hashCode()和equals()方法来完成对象的唯一性判断。

如果对象的哈希值不同,则不用判断equals方法,就直接存到HashSet中;

如果对象的哈希值相同,需要用equals方法进行比较,结果为true,则视为相同,不存,结果为false,视为不同,进行存储。

注意:如果元素要存储到HashCode中,必须覆盖hashCode方法和equals方法。

2.5 TrreSet

TreeSet 是依靠TreeMap来实现的

TreeSet类描述:

该类实现了Set接口,可以实现排序等功能。排序分为:自然排序和自定义排序。

TreeSet的特点:

1.元素是有序的(支持自然排序和自定义排序);

2.元素不允许重复;

3.非线程安全的;

TreeSet 中判断元素唯一性的方法,根据比较方法的返回值是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。

TreeSet 对元素排序的方式:

默认的都是自然排序(升序排列),使用自然排序时只能在集合中加入同类型的对象,并且这些对象的类要实现Comparable接口。

元素自身具备比较功能,及自然排序,需要实现Comparable接口,并重写compareTo方法:

x.compareTo(y)–>

如果返回值为0,则表示x和y相等;

如果返回值大于0,则表示x大于y;

如果返回值小于0,则表示x小于y。

元素自身不具备比较功能,及自定义排序,则需要实现Comparator接口,并重写其compare方法:

compare(Object o1,Object o2)–>

如果o1等于o2,则返回0;

如果o1小于o2,则返回-1;

如果o1大于o2,则返回1。

注意:LinkedHashSet是一种有序的Set集合,及其元素的存入和输出的顺序是相同的。

<HashSet 和 TrssSet区别?>

一、实现方式

HashSet是基于哈希表实现的;

TreeSet是基于二差树实现的;

二、元素是否有序

HashSet中元素是无序的;

TreeSet中元素是自动排好序的;

三、是否可以放入null值

HashSet可以放,但只能放一个;

TreeSet不允许放。

<Comparable和Comparator区别?>

Comparable是排序接口相当于内部比较器。是java.lang包下的,要实现compareTo方法。主要直接用于javabean的类直观实现,

实现Comparable接口的类的对象可以用作有序映射(如TreeMap)中的键或有序集合(TreeSet)中的元素,而不需要指定比较器,接口中通过重写compareTo方法比较集合中元素的大小,从而进行升序排列。

x.compareTo(y)–>

如果返回值为0,则表示x和y相等;

如果返回值大于0,则表示x大于y;

如果返回值小于0,则表示x小于y。

Comparator是比较器接口,相当与外部比较器。是java.util包下,要实现compare方法。

我们需要控制某个类的顺序,而该类本身不支持排序(即没有实现comparable接口),那么我们可以通过实现comparator类来新建一个比较器,并重写其compare方法:

compare(Object o1,Object o2)–>

如果o1等于o2,则返回0;

如果o1小于o2,则返回-1;

如果o1大于o2,则返回1。

2.6HashMap

HashMap 是基于哈希算法的Map接口实现的。

特点:

1.元素唯一的,必须重新hashCode方法和equals方法;

2.元素没有顺序;

3.非线性安全的;

4.适用于插入、删除、定位元素;

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。

HashMap总结:无序,不可重复。

为什么是无序的?因为不一定挂到哪一个单向链表上的,因此加入顺序和取出也不一样。

怎么保持不可重复?使用equals方法来保证HashMap集合key不可重复,如key重复了,value就会覆盖。存放在HashMap集合key部分的元素,其实就是存放在HashSet集合中,则HashSet集合也需要重写equals和hashCode方法。hashmap集合的默认初始化容量为16,默认加载因子为0.75,也就是说这个默认加载因子是当hashMap集合底层数组的容量达到75%时,数组就开始扩容。hashmap集合初始化容量是2的陪数,为了达到散列均匀,提高hashmap集合的存取效率

2.6.1 HashMap常用方法

2.7 TreeMap

TerrMap基于红黑树算法的Map接口实现。

键存放的顺序:自然排序和自定义排序。

特点:

1.元素是有序的;

2.非线程安全的;

3.适用于按自然排序和自定义排序;

<HashMap 和 TreeMap 区别?>

如果不需要排序首选HashMap。

想要通过键来获取值用HashMap

3.工具类

3.1 Collections

Collections类 用于操作集合的工具类;提供了静态方法,对集合元素进行查找、排序、修改等操作

3.1.1 常用方法

3.2 Array

Arrays 类是用于操作数组的工具类;

提供了静态方法。

3.2.1 常用方法

<Collection 和 Collections区别?>

Collection 属于集合框架的顶层接口;

Collections 属于集合框架中的一个工具类。

三、泛型

Java里的泛型就是Object

定义类和接口时指定数据类型

避免发生ClassCastException异常

任何字母大写都行 一般用E或 T

四、Iterator 迭代器

遍历数组和集合框架可以采用for循环或者增强for,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或 ListIterator接口。

调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。

调用 it.hasNext() 用于检测集合中是否还有元素。

调用 it.remove() 将迭代器返回的元素删除。

迭代器,使你能够通过循环来得到或删除集合的元素。ListIterator 继承了 Iterator,以允许双向遍历列表和修改元素。

//通过iterator()方法获取迭代器对象Iterator<Student> it = stus.iterator();//迭代器对象循环判断有没有下一个while(it.hasNext()) {//获取下一个泛型对象Student s = it.next();System.out.println(s);

未完待续。。。。。。

《Java集合框架JCF》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows
  2. oracle的系统和对象权限 与 Oracle 查看用户权限
  3. C#中base64编码与解码
  4. AVC sequence header AAC sequence header
  5. codeforces #274 C. Riding in a Lift dp+前缀和优化
  6. 工作95视频上传逻辑
  7. WINCE6补丁安装
  8. 世界上有条件JavaScript是什么?
  9. 公司服务器文档管理制度,文件服务器管理制度
  10. 虚拟机里ubuntu扩容主分区/dev/sda1
  11. 汇编语言32位加减乘除运算题
  12. 不要安排看代码的工作
  13. Python图像增强之直方图均衡化(全局直方图均衡、局部直方图均衡)
  14. 英语 1038个词根 后缀217个!
  15. 【MySQL从删库到跑路】-1-安装MySQL-5.7
  16. C语言——有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中。
  17. Fluent验证案例05:管道中的泊肃叶流动
  18. (一)JMeter性能测试,完整入门篇:性能测试操作步骤
  19. A20.从零开始前后端react+flask - 查找数据
  20. 能代替苹果pencil的手写笔有吗?比较好用的ipad手写笔推荐

热门文章

  1. 一个成年人一天需要睡多久?
  2. 2019计划-专注有价值的事情
  3. 如何保证Redis和数据库的一致性
  4. Android: AAPT: error: duplicate attribute.
  5. APPCODE key
  6. C语言励志编程,C语言,在线等,超急 励志警句30条,要短一点,千万不要长!!超急!!!...
  7. http GET 请求 URL 总结
  8. 航拍中国最长内流河塔里木河千里冰封景观
  9. 欧拉公式:世界上最完美的公式(上帝公式) 复变函数 、平面几何 、拓扑学、 初等数论、 物理学
  10. Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)