IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 常见集合: ArrayList、Vector、LinkList、HashMap -> 正文阅读

[数据结构与算法]常见集合: ArrayList、Vector、LinkList、HashMap

一、ArrayList

  1. 动态扩充数组
  2. 实现原理:采用动态对象数组,默认构造数组创建了一个空数组(默认大小为0
  3. 第一次添加元素,扩容为10,之后的扩充算法:新容量 = 老容量 + 老容量的一半 (1.5倍老容量)
  4. 动态数组不适合删除、插入(移位)
  5. 最好存储相同类型的元素,以免类型转换麻烦
  6. 动态扩充次数过多或影响性能,所以建议在创建ArrayList时给定初始容量
  7. 线程不安全,适合单线程
  8. 可以有空元素

二、Vector

  1. 实现原理:采用动态对象数组,默认构造数组创建了一个空数组(默认大小为10
  2. 扩容算法:如果没有自己设置增量(为0),则 新容量 = 老容量 + 老容量(2倍老容量);
    增量大于0时,新容量 = 老容量 + 增量
  3. 动态数组不适合删除、插入(移位)
  4. 动态扩充次数过多或影响性能,所以建议在创建Vector时给定初始容量
  5. 加了synchronize 线程安全,可以在多线程下使用,但是效率低
  6. 也可以放null元素

三、LinkList

  1. 实现原理:采用双向链表结构
  2. 适合插入、删除操作,性能高

四、Connection接口

Connection接口:用于存储单个对象的集合


五、List接口

1、有序
2、允许多个null元素
3、具体实现类: ArrayList、Vector、LinkList


实际开发中如何选择?

  1. 安全性? Vector ps:也可以用ArrayList的安全工具类CopyOnWriteArrayList
  2. 频繁插入、删除? LinkList
  3. 存储后遍历? ArrayList

六、HashMap

  1. 实现原理:哈希表(数组+链表+红黑树)
  2. 把对象存储到哈希表中:如何存储(put)?
	public V put(K key, V value) {
	        return putVal(hash(key), key, value, false, true);
	    }

key和value是存储在HashMap里面一个静态类Node里面的

	static class Node<K,V> implements Map.Entry<K,V> {
	        final int hash;
	        final K key;
	        V value;
	        Node<K,V> next;
			//构造方法(省略)...
	}

过程:

  1. 把key对象通过hash()方法计算哈希值,
    hash(key) = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 计算hashCode值再与右移16位后的值异或 ps:基本上还是原来的自己,因为右移16位极小
  2. 然后用这个哈希值对数组长度(默认16)取余数 来决定该key对象在数组中的存储位置
  3. 当这个位置已经有多个对象是,以链表结构存储,(jdk1.8后)再当链表长度大于8时,链表将转化为红黑树

目的:取值更快(通过计算key来确定存放的地方); 存储数据量越大,性能表现越明显

  1. 数组扩充原理: 数组容量超过75%后,数组需要扩充:resize()
    当前数组容量左移一位<<2 (也就是原来的两倍)
    注意:然后哈希表要重新散列(重新计算每个对象的存储位置)

    缺点:扩充次数过多会影响性能(每次扩容后全部对象都要重新排位)
    在开发中要尽量减少扩充次数

  2. 线程不安全


  1. DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    默认初始容量大小
  2. MAXIMUM_CAPACITY = 1 << 30;
    最大容量值
  3. DEFAULT_LOAD_FACTOR = 0.75f;
    加载因子(负载因子) :数组当中75%的空间如果都被存了值,那这个数组空间就达到上限了,需要重新散列(创建)
    更高的值会降低空间开销,但是增加查找成本(get、put)
  4. TREEIFY_THRESHOLD = 8;
    当桶内链表节点数量大于8的时候,链表转化为红黑树
  5. UNTREEIFY_THRESHOLD = 6;
    当桶内链表节点数量小于6的时候,采用链表存储。 (红黑树转化为链表)
  6. MIN_TREEIFY_CAPACITY = 64;
    桶中结构转化为红黑树对应的数组的最小大小,如果当前容量小于它,就不会将链表转化为红黑树,而是用resize()代替
    桶中bin 被树化时,最小的hash表容量,默认为 64 。当散列表容量小于该阈值,即使桶中bin的数量超过了 treeify_threshold ,也不会进行树化,只会进行扩容操作。
    为了避免进行扩容、树形化选择的冲突,它至少是 treeify_threshold 的4倍。
    ps: 也就是说 链表想要树化,哈希表中的容量要大于它(64),否则,桶内元素太多时,会直接扩容,而不是树形化
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:27:44  更:2021-08-25 12:28:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:43:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码