首页 > 其他分享 >Array List与顺序表

Array List与顺序表

时间:2024-09-06 11:52:42浏览次数:7  
标签:顺序 线性表 int ArrayList elementData List private minCapacity Array

学习目标

  1. 线性表
  2. 顺序表与链表的简单了解
  3. ArrayList的介绍
  4. ArrayList的扩容机制

 

  1. 线性表

线性表(linear list): 是由n且具有相同的特性数据元素的有限列表, 线性表在实际运用中常见的数据结构, 常见的线性表: 栈 , 堆 , 队列 , 顺序表 , 链表…

链表:在逻辑上是连续的数据结构, 但在物理结构上不一定是连续的, 用顺序表和链表实现线性表时可以明显观察出区别.

2,顺序表

顺序表是在物理上是用一段连续的物理内存保存数据元素的线性结构, 一般情况下使用数组储存. 在数组上完成增删改查.

链表是在逻辑上保存数据元素的线性结构, 每个数据元素可能分布在内存的各个地方 ,主要通过next找到下个元素数据.

3 ArrayList简介

在集合框架中 ArrayList是一个普通类, 实现了List接口

【说明】

1. ArrayList是以泛型方式实现的,使用时必须要先实例化

2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问

3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的

4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可

选择Vector或者

6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表\

  3.1 ArrayList的构造方法

3.2ArrayList 的常见操作

ArrayList提供的方法有诸多,但我们只需掌握常见方法即可

4 . ArrayLists的扩容机制

       此处的下面代码能否执行?为什么?

ArrayList是一个动态类型的顺序表, 在插入数据时会检查数组大小, 当数组满时会进行自动扩容

ArrayList的部分源码

Object[] elementData;   // 存放元素的空间

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};  // 默认空间

private static final int DEFAULT_CAPACITY = 10;  // 默认容量大小

 

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!

    elementData[size++] = e;
    return true;
}
 

private void ensureCapacityInternal(int minCapacity) {
 ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
 

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
   }
    return minCapacity;
}
 

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
 
    // overflow-conscious code

    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
 

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private void grow(int minCapacity) {
    // 获取旧空间大小

    int oldCapacity = elementData.length;
    
    // 预计按照1.5倍方式扩容

    int newCapacity = oldCapacity + (oldCapacity >> 1);
    
    // 如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容

    if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
    if(newCapacity - MAX_AEEAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
//调用copyOf扩容
    elementData = Arrays.copyOf(elementData , newCapacity);
    }
private static int hugeCapacity(int minCapacity){
// 如果minCapacity小于0 ,抛出OutOfMemoryError异常
    if(minCapacity < 0)
        throw new OutOfMemoryError();
    retur (minCapacity > MAX_AEEAY_SIZE)? lnterger.MAX_VALUE:MAX_ARRAY_SIZE;
}
}

总 结 :

1. 检 测 是 否 真 正 需 要 扩 容 , 如 果 是 调 用 g r o w 准 备 扩 容

2. 预 估 需 要 库 容 的 大 小 初 步 预 估 按 照 1.5 倍 大 小 扩 容 如 果 用 户 所 需扩容的 大 小 超 过 预 估 1.5 倍 大 小 , 则 按 照 用 户 所 需 大 小 扩 容 , 真 正 扩 容 之 前 检 测 是 否 能 扩 容 成 功 , 防 止 太 大 导 致 扩 容 失 败

3. 使 用 c o p y O f进 行 扩 容

标签:顺序,线性表,int,ArrayList,elementData,List,private,minCapacity,Array
From: https://blog.csdn.net/h3286918168/article/details/141905465

相关文章

  • Java静态代码块、构造代码块执行顺序问题
    packagecom.zxl.staticdemo;publicclassBlockTest{static{System.out.println("BlockTest静态代码块执行");}{System.out.println("BlockTest构造代码块执行");}publicBlockTest(){System.out.......
  • ArrayList和LinkedList的区别
    >List子体系特点:A:有序的(存储和读取的顺序是一致的)B:有整数索引C:允许重复的 <!--more-->**List的特有功能**````voidadd(intindex,Eelement):将元素添加到index索引位置上Eget(intindex):根据index索引获取元素Eremove(intindex):根据index索引删除元素Es......
  • G2. Yunli's Subarray Queries (hard version)
    G2.Yunli'sSubarrayQueries(hardversion)Thisisthehardversionoftheproblem.Inthisversion,itisguaranteedthat$r\geql+k-1$forallqueries.Foranarbitraryarray$b$,Yunlicanperformthefollowingoperationanynumberoftimes:S......
  • CodeForces 2009G Yunli's Subarray Queries 题解
    云璃!高质量Div.4,吊打某些Div.2Only/Edu/Div.3。本题是下面四道题目的有机结合,优雅且经典。LuoguP4168[Violet]蒲公英|LuoguP1997faebdc的烦恼|LuoguP3203[HNOI2010]弹飞绵羊|LuoguP3246[HNOI2016]序列建议先完成这四题。(必须指出:用蒲公英的分块方......
  • WPF ListBox ListBoxItem Selected background style
    <Windowx:Class="WpfApp340.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • 【Day06-集合-Collection&List&Set】
    集合        集合框架概述        Java集合框架(JavaCollectionFramework,JCF)是Java编程语言的一部分,它提供了一种存储和操作一组对象的方式。这个框架的设计目标是提供一组标准的数据结构来帮助开发者更有效地管理数据。        接口与实现接口......
  • Java 对象list 根据时间createTime 过滤
    可以使用Java8的流(Stream)来实现这个需求。假设有一个包含createTime字段的对象列表,代码示例如下:importjava.util.Comparator;importjava.util.List;importjava.util.Optional;publicclassExample{publicstaticvoidmain(String[]args){//假设Li......
  • floyd算法,三重循环的顺序问题,不要写错了
     最外层的循环应该是,中间节点的变量从1~n:1for(k=1;k<=n;k++)2for(i=1;i<=n;i++)3for(j=1;j<=n;j++)4dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);  正确代码1#include<bits/stdc++.h>2usingname......
  • xtensa架构--指令汇总(加载指令/存储指令/跳转和调用指令/条件分支指/移动指令令/算术
    目录一xtensa架构指令汇总二  加载指令1. l32i 指令示例2. l8i 指令示例3. l16i 指令示例4. ld 指令示例5总结三存储指令3.1 存储指令概述3.2存储指令详述S8I(RR8):8位存储(8位偏移)S16I(RR8):16位存储(8位移位偏移)S32I(RR8):32位存储(8位......
  • Java顺序表和链表万字详解
    1.线性表的概念线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,......