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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构学习笔记4--ArrayList(此博客编码实现ArrayList构造器未完成后续会继续更新) -> 正文阅读

[数据结构与算法]数据结构学习笔记4--ArrayList(此博客编码实现ArrayList构造器未完成后续会继续更新)

如有错误之处,请指出,谢谢!

ArrayList

通过一个集合变量,来存储数据

可以屏蔽掉底层存储的复杂度

实际存储选择使用数组进行

可以存储任意类型

Java中使用泛型<E>来解决这个问题

也可以采用只存储int

需求分析

需要的数据量级不同

实际存储的容量交由用户决定,或者自己固定分配某个合理的值

ArrayList编写

package list;
//存储任意类型 通过泛型解决
//存储数据大小交由用户指定,或者自己指定一个合适的大小
public class ArrayList <E>{
	private E[] elementsData;//实际存储元素的容器
	private static final int INIT_CAPACITY=10;//指定默认情况下数组的初始长度为10
	private int size;//维护当前数组中的待添加的索引位置,维护当前数组的元素个数
	/*
	 * 空构造器 创建一个指定长度的数组对象
	 * */
	public ArrayList() {
		this(INIT_CAPACITY);
	}
	/*
	 * 带参构造器 创建用户指定长度的数组对象
	 * @param capacity 用户指定数组长度
	 * */
	public ArrayList(int capacity) {
		this.elementsData = (E[]) new Object[capacity];
	}
		
	/*
	 * 添加元素E到当前的集合中指定位置
	 * @param
	 * */
	
	public void add(E e,int index) {//时间复杂度O(n)
		//判定元素的合法性
		checkIndex(index);
		//循环挪动元素
		for(int i=size;i>index;i--) {
			elementsData[i]=elementsData[i-1];
			//添加元素到index
			}
		elementsData[index]=e;
		//维护size
		size++;
		
	}
	
	/*
	 * 判定index的合法性
	 * @param Index
	 * */
	
	private void checkIndex(int index) {
		if(index<0||index>size) {
			throw new IllegalArgumentException("index out of bounds index:"+index);
		}
		
	}

	/*
	 * 添加首元素
	 * @param e
	 * */
	
	public void addFirst(E e) {//时间复杂度O(n)
		add(e,0);
	}
	
	/*
	 * 添加元素E到当前的集合中的末尾
	 * @param
	 * */
	public void add(E e) {//时间复杂度O(1)
		elementsData[size] =e;//将元素e添加到size指向的索引位置
		size++;//维护size
	}
	
	/*
	 * 添加元素E到当前的集合中的末尾
	 * @param
	 * */
	public void addLast(E e) {//时间复杂度O(1)
		elementsData[size] =e;//将元素e添加到size指向的索引位置
		size++;//维护size
	}
	
	/*
	 * 查看当前集合是否为空
	 * @return
	 * */
	public boolean isEmpty() {//时间复杂度O(1)
		return size ==0;
	}
	/*
	 * 查看当前集合中的元素个数
	 * @return
	 * */
	public int getSize() {//时间复杂度O(1)
		return this.size;
	}
	public String toString() {//时间复杂度O(n)
		StringBuilder retStr = new StringBuilder();
		retStr.append("size:"+size+"[");
		for(int i=0;i<size;++i) {
			retStr.append(elementsData[i]);
			if(i!=size-1)
				retStr.append(",");
		}
		retStr.append("]");
		return retStr.toString();
	}

}

?? ?public void add(E e) {//时间复杂度O(1)
?? ?public void addLast(E e) {//时间复杂度O(1)

? ???public boolean isEmpty() {//时间复杂度O(1)
?? ?public int getSize() {//时间复杂度O(1)
?? ?public String toString() {//时间复杂度O(n)

测试用例

package list;

public class ArrayListTest {
	public static void main(String[] args) {
		ArrayList<Integer> lists =new ArrayList<>();
		System.out.println(lists.isEmpty());
		System.out.println(lists.getSize());
		for(int i=1;i<11;i++) {
			lists.add(i);
			System.out.println(lists);
		}
		/*
		 * true
           0
           size:1[1]
           size:2[1,2]
           size:3[1,2,3]
           size:4[1,2,3,4]
           size:5[1,2,3,4,5]
           size:6[1,2,3,4,5,6]
           size:7[1,2,3,4,5,6,7]
           size:8[1,2,3,4,5,6,7,8]
           size:9[1,2,3,4,5,6,7,8,9]
           size:10[1,2,3,4,5,6,7,8,9,10]/
		 */
	}

}

指定位置上添加元素

判定元素的合法性:

不能添加超过size元素,防止数组中出现内部碎片

		
	/*
	 * 添加元素E到当前的集合中指定位置
	 * @param
	 * */
	
	public void add(E e,int index) {//时间复杂度O(n)
		//判定元素的合法性
		checkIndex(index);
		//循环挪动元素
		for(int i=size;i>index;i--) {
			elementsData[i]=elementsData[i-1];
			//添加元素到index
			}
		elementsData[index]=e;
		//维护size
		size++;
		
	}
	
	/*
	 * 判定index的合法性
	 * @param Index
	 * */
	
	private void checkIndex(int index) {
		if(index<0||index>size) {
			throw new IllegalArgumentException("index out of bounds index:"+index);
		}
		
	}

	/*
	 * 添加首元素
	 * @param e
	 * */
	
	public void addFirst(E e) {//时间复杂度O(n)
		add(e,0);
	}

?? ?public void add(E e,int index) {//时间复杂度O(n)
?? ?public void addFirst(E e) {//时间复杂度O(n)

测试用例

for(int i=1;i<7;i++) {
			lists.add(i);
		}
lists.addFirst(11);
lists.add(13, 1);
System.out.println(lists);
//size:8[11,13,1,2,3,4,5,6]
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:49:54  更:2022-01-25 10:51:37 
 
开发: 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/26 19:43:16-

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