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

顺序表总结

                                                                                            

                                   📑打牌 : da pai ge的个人主页
                                   🌤️个人专栏 : da pai ge的博客专栏
                                  ☁️宝剑锋从磨砺出,梅花香自苦寒来

目录

🌤️arraylist的简单实现

🌤️arraylist的构造

 📑ArrayList常见操作

☁️ArrayList的遍历

☁️ ArrayList的扩容机制


🌤️arraylist的简单实现

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
// ...
// 默认容量是10
private static final int DEFAULT_CAPACITY = 10;
//...
// 数组:用来存储元素
transient Object[] elementData; // non-private to simplify nested class access
// 有效元素个数
private int size;
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}

🌤️arraylist的构造

2

 📑ArrayList常见操作

ArrayList 虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,自行查看 ArrayList 的帮助

☁️ArrayList的遍历

ArrayList 可以使用三方方式遍历: for 循环 + 下标、 foreach 、使用迭代器
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍历
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();
Iterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}

☁️ ArrayList的扩容机制

下面代码有缺陷吗?为什么?
ArrayList 是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。以下是 ArrayList 源码中扩容方式:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
}
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 m
1. 检测是否真正需要扩容,如果是调用 grow 准备扩容
2. 预估需要库容的大小
初步预估按照 1.5 倍大小扩容
如果用户所需大小超过预估 1.5 倍大小,则按照用户所需大小扩容
真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
3. 使用 copyOf 进行扩容
http://www.lryc.cn/news/246496.html

相关文章:

  • flutter 文本不随系统设置而改变大小[最全的整理]
  • python -opencv 图像锐化
  • 数字电源为什么一般用DSP控制,而不能用普通的单片机?
  • 个人投资白银收益怎么样?
  • 代码随想录算法训练营 ---第四十五天
  • 【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)
  • STL常用算法-C++
  • 一、Lua基础
  • vue3 webSocket 封装及使用
  • 记录vscode常用插件集合(extensions)
  • 正则表达式详解
  • 【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • expect脚本在自动化部署中的具体应用案例
  • 【Java+SQL Server】前后端连接小白教程
  • Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持
  • Web语言基础课程期末代做
  • Scanner常用知识点
  • uniapp页面使用多个echarts出现数据渲染错乱问题解决
  • PHP连接数据库 错误抑制 三元运算符 学习资料
  • 5G智慧工地整体解决方案:文件全文115页,附下载
  • 数据结构 / 内存的动态申请和释放
  • Android手电筒、闪光灯、torch、flash
  • C语言--每日选择题--Day26
  • [ACTF2020 新生赛]BackupFile
  • WPF面试题:WPF绘图技术介绍
  • 三、Lua变量
  • C#每天复习一个重要小知识day4:枚举的概念/申明/使用
  • C++:对象模型和this指针
  • 碳酸氢锂/硫酸锂溶液纯化除钙镁解决方案
  • 消失的数字,旋转数组(leetcode 一题多解)