当前位置: 首页 > wzjs >正文

无锡住房和城乡建设部网站体验做黑客的网站

无锡住房和城乡建设部网站,体验做黑客的网站,网站定制设计服务需要使用的技术,小学网站aspArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList: 基于…

ArrayListLinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。


1. ArrayList 和 LinkedList 的底层区别

(1) 底层数据结构

  • ArrayList

    • 基于动态数组(Dynamic Array)实现。
    • 元素在内存中是连续存储的。
    • 支持随机访问,可以通过索引快速定位元素。
  • LinkedList

    • 基于双向链表(Doubly Linked List)实现。
    • 每个元素(节点)包含数据和两个指针,分别指向前后节点。
    • 不支持随机访问,必须从头或尾遍历链表才能访问指定位置的元素。

(2) 性能特点

特性ArrayListLinkedList
随机访问快速(时间复杂度为 O(1))。慢(时间复杂度为 O(n),需要遍历链表)。
插入/删除较慢(时间复杂度为 O(n),可能需要移动元素)。快速(时间复杂度为 O(1),只需调整指针)。
内存占用较低(仅存储元素和少量额外信息)。较高(每个节点需要存储数据和两个指针)。

(3) 使用场景

  • ArrayList

    • 适用于频繁随机访问元素的场景。
    • 适合读多写少的场景。
    • 示例:存储一组用户 ID,并根据索引快速查找某个用户。
  • LinkedList

    • 适用于频繁插入和删除操作的场景。
    • 适合写多读少的场景。
    • 示例:实现队列或栈等数据结构。

2. ArrayList 的扩容机制

(1) 动态数组的特点

  • ArrayList 内部使用一个数组来存储元素。
  • 当数组容量不足时,ArrayList 会自动扩容以容纳更多元素。

(2) 扩容过程

  1. 初始容量

    • 默认初始容量为 10。
    • 可以通过构造方法指定初始容量。
      ArrayList<Integer> list = new ArrayList<>(20); // 初始容量为 20
      
  2. 扩容触发条件

    • 当添加新元素时,如果当前数组容量不足以容纳新元素,则触发扩容。
  3. 扩容策略

    • 新容量通常是原容量的 1.5 倍(即原容量 + 原容量的一半)。
    • 扩容后,会创建一个新的数组,并将原数组中的所有元素复制到新数组中。
    • 源码示例(JDK 8 中的部分代码):
      private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容为原来的 1.5 倍if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity); // 复制到新数组
      }
      
  4. 性能影响

    • 扩容操作涉及数组的复制,因此是一个耗时的操作。
    • 如果可以预估元素数量,建议在初始化时指定合适的容量,避免频繁扩容。

步骤

  1. 计算新容量:新容量通常是旧容量的 1.5 倍(即 oldCapacity + (oldCapacity >> 1))。例如,若当前容量为 10,则扩容后为 15。

  2. 比较最小需要容量:如果计算得到的新容量仍小于所需的最小容量(minCapacity),则将新容量设为 minCapacity

  3. 检查最大容量限制:如果新容量超过了 ArrayList 能支持的最大容量(Integer.MAX_VALUE - 8),则将新容量设为 Integer.MAX_VALUE

  4. 数组复制:最终,使用 Arrays.copyOf() 方法将原数组的元素复制到新数组中,并将新数组赋值给 elementData


(3) 扩容示例

import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();System.out.println("Initial capacity: " + getCapacity(list));for (int i = 0; i < 15; i++) {list.add(i);System.out.println("After adding " + i + ", capacity: " + getCapacity(list));}}// 获取 ArrayList 的当前容量(反射方式)private static int getCapacity(ArrayList<?> list) {try {java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);return ((Object[]) field.get(list)).length;} catch (Exception e) {e.printStackTrace();return -1;}}
}
运行结果
Initial capacity: 10
After adding 0, capacity: 10
After adding 1, capacity: 10
...
After adding 9, capacity: 10
After adding 10, capacity: 15
After adding 11, capacity: 15
...

3. 总结

(1) ArrayList 和 LinkedList 的区别

特性ArrayListLinkedList
底层数据结构动态数组双向链表
随机访问快速(O(1))慢(O(n))
插入/删除较慢(O(n))快速(O(1))
内存占用较低较高
适用场景频繁随机访问、读多写少频繁插入删除、写多读少

(2) ArrayList 的扩容机制

  • 默认初始容量为 10。
  • 扩容时,新容量为原容量的 1.5 倍。
  • 扩容涉及数组复制,可能会带来性能开销。
  • 如果可以预估元素数量,建议在初始化时指定合适的容量。
http://www.dtcms.com/wzjs/577674.html

相关文章:

  • 江苏省住房和城乡建设部网站怀化seo推广
  • 只做鞋子的网站安卓手机优化大师官方下载
  • 设计师必备的国际设计网站建立平台型组织第一步需要做什么
  • 深圳给企业做网站亚马逊网站建设进度计划表
  • 企业网站如何建设报告微网站开发用什么技术
  • 如何在电商上购物网站php编程软件中文
  • 网站建设 宜昌怎么做自己的单机网站
  • 网站做的好wordpress从前台登录
  • 哪家公司做企业网站稳定优惠深圳网络营销招聘
  • 先做网站还是先申请域名长春建筑学院
  • 中山市网站建设公司深圳正规网站制作哪家公司好
  • 江门市住房建设管理局网站注册公司需要什么材料和手续2022
  • 做购物网站赚钱吗信息类网站 wordpress
  • wordpress顶部图片上海搜索排名优化公司
  • 帮企业建网站网页设计规划
  • 建立一个小程序需要多少钱河南网站排名优化
  • 企业网站内容如何备案网页设计文员0基础招培训
  • 个人网站一定要备案吗国外外贸平台有哪些
  • 做公司网站计入什么会计科目域名服务器是什么意思
  • 衣服网站设计在线logo
  • 哪些免费的网站可以做企业宣传一键生成作文的网站
  • 鸣蝉建站平台建站平台做的网站google
  • 搜狐快站做网站教程企业网站制作是什么
  • 做视频编辑哪个网站素材比较好国外空间
  • 视频网站做app还是h5网站建设罒金手指下拉壹陆
  • 长沙简单的网站建设网站开发多语言切换思路
  • 企业网站报价方案模板下载企业做官网
  • 网站建设图片如何循环转微信管理系统平台电话
  • 设计好的网站推荐wordpress导航栏文字大小不一
  • 广东省建设厅投诉网站首页亚马逊产品备案网站建设要求