JAVA集合框架

  • JAVA集合框架概述
  • Collection接口
    • List接口的主要实现类
    • Set接口的主要实现类
  • Map接口
  • Iterator 与 ListIterator
  • Collection 和 Collections区别

JAVA集合框架概述

JAVA集合框架可以分为两类:Collection接口的实现类和Map接口的实现类 ,可以进一步分为List,Set和Map三类。

Collection接口


Collection 接口允许元素重复,主要子接口为List接口与Set接口。Collection中比较常用的方法有:add()(将参数元素添加到集合中),addAll()(将参数中的集合中的所有元素添加到集合中),contains()(返回该集合中是否包含参数元素),toArray()(将该集合生成一个数组返回)。

List接口的主要实现类

List接口的元素有序(放进去什么顺序拿出来就是什么顺序),允许元素重复,可以通过索引来访问对应位置的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

  1. ArrayList类
    ArrayList底层数据结构是线性表。每一个ArrayList都有一个初始容量(10)。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出(已使用到达75%)时,就会进行扩容操作。如果我们知道存储元素需要的大概容量,可以先指定一个初始容量值,有利于减少它的扩容操作。
    ArrayList的主要方法有:size()、isEmpty()、get()、set()、iterator() 和 listIterator()。由于ArrayList是由线性表实现的,所以它适合频繁的随机访问操作,不适合频繁的增删操作。同时ArrayList是非同步的,若用于多线程需要手动加锁,还有一种解决方法是使用工具类Collections构造一个同步的List:List list = Collections.synchronizedList(new ArrayList(MyList));但是这个方法还是会比直接用Vector慢,因为它实际是对ArrayList强行封装了synchronized,所以速度要慢一点。
  2. LinkedList类
    LinkedList与ArrayList不同的地方在于ArrayList的底层结构一个线性表,而LinkedList是一个双向链表,因此LinkedList不能随机访问,也就不适合频繁的查询操作,但是增删元素效率很高,它除了有ArrayList的基本操作方法外还有get(),remove(),insert()等方法。与ArrayList一样,LinkedList也是非同步的。使用多线程的时候也需要手动加锁。
  3. Vector类
    Vector类与ArrayList类相似,底层结构也是线性表,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
  4. Stack类
    Stack类继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。包括:push(),pop(),peek()(返回栈顶元素),empty()(返回堆栈是否为空),search()(返回一个元素在堆栈中的位置)。

Set接口的主要实现类

Set接口是不允许元素重复无序的。它允许且仅允许一个null值的存在。Set接口有三个具体实现类,分别是散列集HashSet、链式散列集LinkedHashSet和树形集TreeSet。

1.HashSet

HashSet 是不允许元素重复的集合。它是由HashMap实现的,数据结构与HashMap一样(后面有说明),不保证元素的顺序,而且HashSet能且仅能存入一个null值。HashSet是非同步的,HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能
HashSet的实现大致为:通过一个HashMap存储元素,元素是存放在HashMap的Key中,而Value统一使用一个Object对象。如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。在对象中用作equals比较标准的属性,都应该用来计算 hashCode的值
2.LinkedHashSet
LinkedHashSet继承自HashSet,其底层是基于LinkedHashMap来实现的,有序,非同步。LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用双向链表维护元素的顺序。保存了元素的插入顺序,所以遍历时候,LinkedHashSet将会以元素的添加顺序遍历元素。
3.TreeSet
TreeSet是一个有序集合,是基于TreeMap实现的,非线程安全。TreeSet可以确保集合元素处于排序状态。TreeSet有两种排序方式,自然排序和定制排序,默认的是自然排序。若想要使用自定义的比较器,则需要使用带比较器的构造函数。TreeSet集合是通过compare或者comparaeTo函数来判断元素是否相等,判断为与即合理元素重复的元素,不会被加入到集合中。

Map接口

Map是由键值对组成的集合。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,但是value值可以相同。
1.HashMap
底层数据结构为线性表+链表,查找对象时通过哈希函数计算其位置,实现了快速查询与增删,内部定义了一个hash表数组,元素通过哈希函数将元素的哈希地址转换成数组中存放的位置,如果有计算的Hash值相同,则使用链表的形式将所有相同哈希地址的元素串起来,JDK1.8之前它是一个单链表结构,但是JDK1.8之后当hash值相同的元素大于8个时候,存储结构会变成红黑树来存储,方便查找(如图)。

2.LinkedHashMap
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选LinkedHashMap。它允许使用null值和null键。
LinkedHashMap与HashMap的不同之处在于,它维护着一个连接所有元素的双向链表。它定义了遍历顺序,该遍历顺序可以是插入顺序或者是访问顺序。即:按插入顺序的链表,和按(调用get方法)访问顺序的链表。默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。此实现不是同步的。由于LinkedHashMap需要维护元素的插入顺序,因此性能低于HashMap的性能,但因为它以链表来维护内部顺序,所以在遍历方面较HashMap有优势。
3.TreeMap
TreeMap 是一个有序的集合,非同步基于红黑树实现,每一个key-value节点作为红黑树的一个节点。TreeMap存储时会根据key进行排序,其中排序方式分为两种,一种是自然排序,一种是定制排序,由构造方法觉得。
自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。
定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口。如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0
4.HashTable
HashTable是继承了Dictionary类,是线程安全的,它的key、value都不可为null
(Dictionary是一个抽象类,它直接继承于Object类,没有实现任何接口。Dictionary类是JDK 1.0的引入的。虽然Dictionary也支持遍历的基本操作,但它的API函数比Map少;而且Dictionary是通过Enumeration(枚举类)去遍历,Map则是通过Iterator去遍历。 然而由于Hashtable也实现了Map接口,所以,它即支持Enumeration遍历,也支持Iterator遍历。AbstractMap也是一个抽象类,它实现了Map接口的绝大部分API函数;为Map的具体实现类提供了极大的便利。它是JDK 1.2新增的类。)

5.Properties
Properties用于配置文件操作,使用频率比较高;键和值都是字符串;

Iterator 与 ListIterator

1.Iterator
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator的主要方法有: hasNext(),next(), remove()。Iterator只能单向移动(向后遍历),Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。
2.ListIterator
ListIterator是一个功能更加强大的迭代器, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator.
ListIterator可以双向移动(向前/向后遍历),也产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.使用set()方法可以替换它访问过的最后一个元素.可以使用add()方法(set与add都是Iterator中所没有的)在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素,ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

Collection 和 Collections区别

1.java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。
2.java.util.Collections 是一个工具类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

JAVA集合框架概述相关推荐

  1. Java集合框架概述及Collection接口方法讲解

    Java集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用Array存储对象方面具有一些弊 端,而Java 集合就像一种容 ...

  2. Java集合框架——概述

    集合概述 集合(collection)--有时也被称作容器, 用来把具有相同性质的一类东西,汇聚成一个整体.Collections被广泛应用于存储,获取及操作数据. 集合框架 集合框架(Collect ...

  3. Java集合框架-概述

    Java集合框架的由来: 其实在Java2(jdk1.2)之前,Java是没有完整的集合框架的.它只有一些简单的可以自扩展的容器类,比如Vector,Stack,Hashtable等. 为什么存在容器 ...

  4. Java集合框架概述(四)——Map体系集合与底层实现原理

    一.Map父接口 1.概要 方法 描述 public interface Map<K,V> 将键映射到值的对象. 一个映射不能包含重复的键; 每个键可以映射到最多一个值.  将键映射到值的 ...

  5. java 集合框架(一)

    Java 集合框架概述 Java集合的概念 Java集合类:是一个工具类,就像容器,存储任意数量的具有共同属性的对象. Java集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量 ...

  6. Java集合框架:HashMap

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. 第十五期:详解Java集合框架,让你全面掌握!

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  8. Java 集合框架 详解

    一.Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中).所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.例如 Collec ...

  9. Java集合(一)集合框架概述

    文章目录 一.集合框架 1.1 常用的集合 1.2 线程安全的集合 1.3 "fail-fast"机制 1.3.1 "fail-fast"机制是什么 1.3.2 ...

  10. JAVA基础---集合(一)--集合框架概述

    为什么用集合如何合理用集合,以及如何实现的和他们的实现原理,如果搞清了对于之后学习其他知识和开发是很有大帮助性的. 什么是集合框架? 集合框架是表示和操作集合的统一体系结构.所有集合框架都包含以下内容 ...

最新文章

  1. JAVA C++ 左花括号{该另起一行写还是写在行尾的思考
  2. 云级Key-value数据库大比较
  3. rpm mysql java 驱动_Linux下安装MySQL(rpm方式)
  4. cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务
  5. 研究Java 9 Money and Currency API(JSR 354)
  6. Python all函数 - Python零基础入门教程
  7. java 线程 主进程_java 多线程通用方法
  8. C++ 函数默认参数和占位参数
  9. 超级计算机开采金矿,科学家发现地球内部有超60万亿吨金矿,为什么没人敢开采?...
  10. HDU-2050-折线分割平面
  11. 2021-06-16单例模式详解
  12. c语言输入若干学生成绩 计算平均,从键盘输入若干名学生的成绩,当输入-1时结束,统计出及格人数...
  13. 笔记本的无线网卡驱动服务器,无线网卡驱动,详细教您怎么笔记本无线网卡驱动...
  14. python翻页爬取豆瓣影评_Python3爬取豆瓣电影
  15. 特斯拉阀:被遗忘的天才之阀
  16. 腾讯android一键root工具,腾讯一键Root工具
  17. 只有韦小宝最适合当产品经理
  18. Java将一张图片放在另一张图片上(位置可选)
  19. python绘制三维地形_三维数字场地模型(上篇):Civil3D 地形的生成
  20. AssetsManager下载类

热门文章

  1. 实用小程序,快速求A类不确定度(物理实验),保留六位
  2. 基于RV1126平台imx291分析 --- media部件连接 二
  3. C++与Python混合编程
  4. Excel导出xml
  5. MySql的完整卸载(总共四个步骤)
  6. pycharm汉化版安装
  7. 南阳理工acm 139我排第几个
  8. 语义替换脚本——论文降重GUI
  9. cmd运行sql文件
  10. FPGA与数字信号处理