Java总结进阶之路 (基础三)数组集合

文章目录

    • @[TOC](文章目录)
  • 数组
    • 什么是数组
    • 数组的定义:
    • 数组的创建
    • 数组的初始化
    • 数组中的常见问题
    • 二维数组介绍
  • 集合框架
    • conllection
      • List集合
        • ArrayList
        • LinkedList集合
        • Vector集合
        • CopyOnWriteArraylist集合
      • Set集合
        • HashSet集合
        • ThreeSet集合
        • Queue集合
    • Map
      • LinkedHashMap 集合
      • Hashtable集合
      • TreeMap集合
      • ConcurrentHashMap集合
  • 总结

提示:java总结学习之路


提示:以下是本篇文章正文内容,下面案例可供参考

数组

什么是数组

  • 数组就是将数据组装起来,不管里边有多少个都称为数组 即array 每一个组里边的数据类型都是相同的

数组的定义:

  • 数据类型 [] 数组名 也可以 数据类型 数组名[]
  • 二维数组 数据类型[][] 数组名 / 数据类型 数组名 [][]
  • 二维数组在往上有更多的维度

数组的创建

  • 数组类型[] 数组名 = new 数组类型[]{元素1,元素2, …n个};
  • 数组类型[] 数组名 = {元素1,元素2, …n个};
  • 数组类型[] 数组名 = new 数组类型[10]; 需要给数组的长度

数组的初始化

  • 动态初始化:在创建数组时,直接指定数组中的长度/个数
    • 列子: int [] arrays=new int[10]
  • 静态初始化:在创建数组的时候不指定他的的长度,而是直接根据数组中的内容进行指定
    • 列子: int [] arrays={1,2,3,4,5}
  • 注意事项
    • 静态初始化内存放的数据类型必须跟[]前数据类型一样
    • 静态初始化,没指定长度,但是他会根据里边的元素个数指定长度

数组中的常见问题

  • 索引越界异常:ArrayIndexOutOfBoundsException:当访问了数组中不存在的索引,就会引发索引越界异常。
  • 空指针异常:NullPointerException:当引用数据类型的变量被赋值为 null 之后,就代表跟堆内存的连接被切断了,如果这时候还想去访问堆内存的数据,就会出现空指针异常。

二维数组介绍

  • 二维数组是一种容器,该容器是用来存放一维数组
  • 二维数组的初始化:
    • int [] [] aays=new int[5][5] 表示:该二维数组可以存放5个一维数组,每一个一维数组可以存放5个元素

集合框架

  • 数据思维思维导图
    Java总结进阶之路 (基础三)数组集合_第1张图片

  • Conllection集合

    • 集合的概念:放的是动态对象数组,集合框架用来存储喝操作不同类型的数组

conllection

List集合

ArrayList
  • 底层原理:基于数组实现
  • 扩容机制:默认大小是10也可以手动指定,超出容量时扩容50%,10->15,可以使用System.arraycopy()将数组赋值到新的数组上边
  • 优缺点:
    • 查询效率高,因为可以根据下表子啊O(1)复杂度查找数据
    • 插入删除效率低,不管插入还是删除都需要更新索引
  • ArrayLIst 是可以动态是数组,也就是数组的复杂版本,可以动态的添加或者删除
  • ArrayList的长度是可变的
  • ArrayList属于线程不安全,也不考虑线程同步,ArrayList擅长于随机访问.
LinkedList集合
  • 底层机制:LinkedList集合是基于双向链表进行实现的
  • 优缺点:插入和删除效率搞因为只需要改变节点的指向即可,查询的效率会变低,因为每次都会从头到尾的查询
  • LinkedList属于线程不安全 也不考虑线程同步
Vector集合
  • 底层机制:基于数组进行实现的
  • 扩充机制 是每次扩充的两倍 10 -20
  • 优缺点:
    • 由于底层结构是一块连续的空间,所以可以支持下标’‘[]’'随机访问的形式。
    • cpu高速缓存命中率高尾插尾删除效率高,相比list
    • 越靠近头部位置插入效率越低
CopyOnWriteArraylist集合
  • 底层机制:线程对其操作时赋值一个副本 对副本及逆行操作
  • 优缺点:
    • 线程安全 并且性能最优
    • 读写分离 性能高 读写操作针对不同的容器 便利是修改 不会抛出异常
    • 比较占内存,读写不是一个容器无法保证数据读取的实时性

Set集合

HashSet集合
  • 底层原理: 基于HashMap实现 HashSet的元素就是HashMap的key value是静态对象
  • HashSet:是非线程安全,这就意味这如果多个线程同时访问一个hashset实例并且至少有一个线程修改了集合,那么必须通过外部同步来确保对集合访问是安全的,在多线程环江下 可以考虑使用 Collections.synchronizedSet方法,该方法返回的是一个线程安全的set包装器
  • HashSet属于无序集合,他的元素不以特定的顺序存储 如果需要特定的顺序可以考虑使用LinkedHashSet进行实现 他会保留插入的顺序
  • HashSet优缺点:
    • 不包含重复的元素,他是不允许有重复的元素的
    • 快速查找,HashSet是基于哈希表进行实现的 查找 插入和删除操作的时间复杂度是常数级别的具有高效的性能
    • 不适合基本数据类型
    • 迭代效率比有序集合要慢一点
  • HashSet是基于HashMap实现的 在内部它是由一个HashMap支持的 存储的元素也是以键值对的方式进行存储
ThreeSet集合
  • 实现机制:它基于红黑树实现的有序集合,通过红黑树来进行存储元素,保持元素的自然顺序
  • ThreeSet的优缺点
    • 有序性:threeset是保持元素的有序性,可以根据元素的自然顺序并提供的比较器来进行排序
  • 高效的查找 插入 和删除 :底层使用的是红黑树,基本的操作时间复杂度是O(log n)
    • Treeset实现了NavigableSet接口,提供了一些有用的导航方法,获取小于或者等于给定元素的最大元素
    • 内存消耗的比较搞,与哈希集合进行相比,红黑树的实现需要更多的内存空间
    • 不是线程安全,在多线程的环境下 如果有一个线程修改了集合 而其他的线程需要同时访问这个集合,那么就得需要外部同步操作来确保操作的安全性
Queue集合
  • ArrayDeque:可以用来做栈也可以做队列 双端队列
  • priorityQueue:常用于实现堆数据结构
    • 底层原理:二叉树 实现的形式是数组

Map

LinkedHashMap 集合

  • 实现机制:他继承于HashMap类 与HashMap类不同的是 LinkedHashMap是通过双向链表来维护键值对的插入顺序或者是按照访问顺序
  • 优缺点
    • 与普通的hashMap进行想不,LinkedHashMap需要额外的链表结构,在内存上的消耗相对较高、
  • 不属于线程安全

Hashtable集合

  • 实现方式:Hashtable使用一个数组作为哈希表,通过哈希函数将键映射到数组的索引,解决冲突的方式是链地址法,在哈希表的每个位置维护一个链表,将具有相同哈希值的键值存储在一个链表上
  • 优缺点:
    • 线程安全,所有的操作基本上都是同步的,在多线程的环境中可以安全的使用,使用了synchronized互斥锁,全局锁,所以性能与吞吐量较低
    • 稳定性比较号,是一个稳定和可靠的集合类
    • 迭代器不支持修改,在迭代过程中如果要尝试修改Hashtable的结构则会抛出异常
    • Hashtable在性能上相对比较差尤其是高并发的情况下
  • 快速失败机制:在迭代过程中如果要尝试修改Hashtable的结构则会抛出异常,因为迭代器会维护一个modCount变量 集合被修改时modCount变量会被修改 每次hasNext()和next()都是会先去查看modCount是否会改变 如果没有改变则继续执行,改变就抛异常

TreeMap集合

  • 底层原理:红黑树 根据key进行排序
    • 红黑树是一种平衡二叉搜索树 它具有根节点都是黑色的 每个节点要么都是红色要么都是黑色
  • 优缺点:
    • 有序性,TreeMap保持了键的有序性
    • 高效的查找 插入 删除,底层使用了红黑树
    • 实现了NavigableSet接口,提供了一些有用的导航方法,获取小于或者等于给定元素的最大元素
    • 与哈希表进行相比 红黑树需要更多的内存空间 所以他的内存消耗相对要高
    • 不属于线程安全

ConcurrentHashMap集合

  • 底层结构
    • jdk1.7:segment数组+HashEntry数组,先通过hash定位到HashEntry在hash定位到具体的位置
    • jdk1.8:使用的是红黑树跟Node 抛弃了segment并且将HashEntry改成了Node
  • 优缺点:
    • 线程安全:他是通过分割桶(buckets)和使用synchronized关键字来实现高效的并发访问
    • 支持高并发的读写操作,比传统的HashMpa有着更好的性能,允许多个读操作并发进行,不会阻塞,而写的操作指挥锁定特定的桶,并不是整个集合,从而提高了并发性能
    • 初始的容量的限制,过小的容量会导致桶的竞争增加,太大的容量会导致浪费内存
    • 迭代器弱的一致性,迭代器可能不会捕捉到最新的修改,在迭代的过程中其他线程可能对映射进行修改
  • 安全性
    • jdk1.7:ReentrantLock+volatile
      • ReentrantLock只锁住一个segment
      • volatile修饰HashEntry保证可见性和有序性
      • 尝试获取锁失败会自旋,知道获取成功,如果是一直获取不到则会进入阻塞 保证能够获取成功
    • jdk1.8:synchronized+cas+volatile
      • volatile保证了get时的可见性
      • cas用于对hash桶第一个元素进行赋值
      • synchronized 分段锁锁住整个hash桶 而不是这个map

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(Java系列回顾笔记,java,python,开发语言)