JAVA集合框架

java集合框架(Java collection Framework),又被称为容器(container),是定义在java.util包下的一组接口(interface)和其实现类(classes),作用是存储数据。
其主要表现为将多个元素element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。

类和接口总览

java 集成类似spss的统计工具 java数据统计框架_数据结构


集合框架要设计成需要满足以下几个目标:

  • 该框架必须是高性能的。基本集合(动态数组、链表、树、哈希表)的实现也必须是高效的。
  • 该框架允许不同类型的集合,以类似的方式工作,,具有高度的互操作性。
  • 对一个集合的扩展和适应都必须是简单的。
    因此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,例如:LinkedList、HashSet、TreeSet、HashMap等。
    通过集合框架图可知,集合框架都包含接口、实现类和算法 。
    接口: 是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象。接口允许我们操作集合时不必关注具体实现,从而达到“多态”。在面向对象编程中,接口通常用来形成规范。
    实现(类): 实际是接口的具体实现。从本质上讲,它们是可重复利用的数据结构,例如:ArrayList、LinkedList、HashMap、HashSet。
    算法: 是实现集合接口的对象里的方法执行的一些有用的计算。例如:搜索和排序,这些算法被称为多态,那是因为相同的方法可以再相似的接口上有着不同的实现。
    除了集合,该框架也定义了几个Map接口和类。Map里存储的是键值对,尽管Map不是集合,但是它们完全整合在集合中。
    java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。
集合的特点

集合主要有以下两个特点:

  • 对象封装数据,对象多了也需要存储,集合用于存储对象。
  • 对于对象个数确定的可以使用数组存储,对于对象个数不确定的可以使用集合存储,因为集合是可变长度的。
集合和数组的区别
  • 数组的长度是固定的;集合的长度是可变的;
  • 数据可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型;
  • 数组中存储的元素必须是同一个数据类型;集合中存储的对象可以是不同数据类型的。

数据结构: 就是集合中存储数据的方式。
对于集合容器,有很多种,因为每一个的容器的自身特点不同,其原理在于每一个容器内部的数据结构不同。

使用集合框架的好处
  1. 容量自增长;
  2. 提供了高性能的数据结构和算法,使编码更轻松,提高了程序的速度和质量;
  3. 允许不同API之间相互操作,API之间可以来回传递集合;
  4. 可以更方便的扩展和修改集合,提高了代码的复用性和操作性;
  5. 通过使用JDK自带的集合类,可以降低代码的维护和学习新API的成本。

集合接口

java 集成类似spss的统计工具 java数据统计框架_java 集成类似spss的统计工具_02


Set和List的区别

*Set接口里存储的是无序的、不重复的数据。List接口实例存储的是有序的、可以重复的元素。

  • Set检索效率低下,删除和插入效率高,且插入和删除不会引起元素位置改变。<实现类有HashSet、TreeSet>
  • List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。<实现类有LinkedList,ArrayList,Vector,Stack>

集合实现类(集合类)

LinkedList
该类实现了List接口,允许有null(空)元素,类似于一个双向循环链表。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。LinkedList 查找效率低。
ArrayList
该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
Vector
也类似于一个数组。
Stack
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

List<Integer> list1 = new LinkedList<>();
List<Integer> list2 = new ArrayList<>();

HashSet
该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
TreeSet
该类实现了Set接口,可以实现排序等功能。
HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。该类实现了Map接口,根据键的HashCode值存储数据(哈希桶),具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
TreeMap
继承了AbstractMap,并且使用一颗树(红黑树)。
HashTable
也是基于数组+链表形成的,数组是HashMap的主体,链表主要是为了解决哈希冲突而存在的。

哪些集合类是线程安全的
  • HashTable:全部方法都是基于synchronized加锁实现的,虽然实现了线程安全,但是效率会比较低。
  • Vector:比ArrayList多了一个同步机制,保证了线程安全,但是效率较低,不建议使用。
  • Stack:堆栈类,所有元素都是先进后出。
  • concurrentHashMap:不属于map集合类,但是是HashMap线程安全的一种,支持很多场景下的并发操作。