自己封装一个ArrayList

本文介绍了一个基础的自封装ArrayList类,适用于Java初学者。通过实现添加、删除、修改和获取元素等功能,展示了数组扩容和基本操作的实现原理。

本次练习旨在自己封装一个简单的ArrayList并不是重新复刻java中的ArrayList类,有不足之处还请各位多指点,用的都是比较基础的知识比较适合初学者。

/**
 * 
 * @author Hercules
 * 
 * @version 创建时间:2020年1月7日 下午5:11:30
 * 
 *          类说明
 * 
 */
public class MyArrayLists<T> {

	private Object[] datas; // 用来存放数据

	private int size = 0; // 描述集合长度

	public MyArrayLists(int size) {
		if (size > 0) {
			datas = new Object[size];
		} else {
			System.out.println("集合长度不能为负数");//我还没有学到异常部分,所以这里暂且如此处理
		}
	}
	
	public MyArrayLists() {
		this(10);
	}

	/*
	 * 添加注释到集合中去
	 */
	public void add(T t) {
        //首先判断数组中是否已经装满
		//如果已经装满则需要扩容数组
		if(isFull()) {
			grow();
		}
		datas[size++] = t;  /*这里首先不要忘记扩容,其次这里只能用“size++”而不能用“++size”,
		因为这里后++是先用变量的原始值进行赋值以及运算等,而后再+1,而前++则是先将变量+1,而后
		在用+1后的值进行赋值和计算等*/
	}
	
	public void remove(int i) {
		if(i>=0 && i<size) {
			for(;i<size;i++) {
				datas[i] = datas[i+1];
			}
			size--;                  //这里千万不要忘记最后数组的实际元素个数要减1;
		}
	}
	
	//扩容
	public void grow() {
		Object [] newDatas = new Object[(int)(size*1.5)];
		//将原来数组的数据装入新的数组
		for(int i = 0;i<datas.length;i++) {
			newDatas[i] = datas[i];
		}
		datas = newDatas;//将新的数组赋值给datas
	}
	
	//判断数组是否已经满了返回bool
	public boolean isFull() {
		return size >= datas.length;
	}
	
	//修改数据操作
	public void set (int index,T t) {
		if(index >= 0 && index < size ) {
			datas[index] = t;
		}
	}
	
	//获取数据操作
	public T get (int index) {
		if(index >= 0 && index <size) {
	       return (T) datas[index];
		}
		return null;
	}
	
	//获取集合长度
	
	public int getLength() {
		return size;
	}
}

这就是一个自己封装的ArrayList类,可能有很多大神会觉得很low,不过既然是从基础开始,那就一点一点慢慢来。
我们来写一个测试类来看一下

/** 

* @author Hercules

* @version 创建时间:2020年1月7日 下午6:33:23 

* 测试类

*/
public class Test {
  public static void main(String [] args) {
	  MyArrayLists<String> list = new MyArrayLists<String>();
	  list.add("a");
	  list.add("a1");
	  list.add("a2");
	  list.add("a3");
	  list.add("a4");
	  
	  for(int i = 0; i < list.getLength();i++) {
		  System.out.println(list.get(i));
	  }
  }
}

输出结果如下:
在这里插入图片描述

我们再在上述代码的for循环上面添加修改操作

//修改
list.set(2, "b");

在这里插入图片描述
可以看到第三个元素变为了b,没错java的数组下标是从0开始的。

而后们再编写代码将这个元素删除
在这里插入图片描述
可以看到这时候元素就只剩下了,这几个,剩下的功能就不一一演示了

<think>我们正在比较JSONArray和ArrayList。首先,JSONArray是一种用于表示JSON格式中的数组结构的数据类型,而ArrayList是Java集合框架中的一个动态数组实现。接下来,我们将从多个维度比较它们的异同,并讨论使用场景。 相同点: 1. 两者都可以存储多个元素,并且允许元素重复。 2. 两者都支持按索引访问元素(尽管JSONArray在内部可能使用类似ArrayList的结构,但具体实现取决于库)。 不同点: 1. **来源和用途**: - JSONArray:通常用于表示JSON数据中的数组结构,是JSON规范的一部分。它主要用于数据的序列化和反序列化,例如在网络传输或存储时使用。在Java中,我们通常使用第三方库(如fastjson、org.json等)提供的JSONArray类。 - ArrayList:是Java集合框架的一部分,位于java.util包中。它是一个动态数组,用于在内存中存储和管理对象集合。 2. **类型安全**: - JSONArray:由于JSON是弱类型的,JSONArray可以存储任意类型的元素(包括混合类型),但在Java中,JSONArray通常以Object的形式存储元素,因此取出元素时需要动转换类型。 - ArrayList:在Java中,ArrayList是泛型类,可以指定元素类型(如ArrayList<String>),从而提供编译时类型检查,取出元素时不需要强制转换(如果指定了类型)。 3. **方法功能**: - JSONArray:提供的方法主要围绕JSON的生成和解析,例如将JSONArray转换为字符串(toString)、解析JSON字符串等。方法相对较少,专注于JSON操作。 - ArrayList:提供了丰富的集合操作方法,如添加、删除、遍历、子列表、排序等,是功能完整的集合类。 4. **序列化支持**: - JSONArray:本身就是为了序列化和反序列化而设计的,可以方便地将对象转换为JSON字符串,也可以从JSON字符串还原。 - ArrayList:虽然也可以被序列化(实现Serializable接口),但它的主要目的不是用于数据交换格式,而是内存中的数据结构。 5. **线程安全**: - JSONArray:通常不是线程安全的(除非特定实现说明)。 - ArrayList:不是线程安全的,但可以使用Collections.synchronizedList来包装。 使用场景: - **JSONArray**: - 当你需要处理JSON数据时,例如解析从网络接收的JSON数据,或者构建JSON数据用于发送。 - 在不同系统之间交换数据(如前后端交互)时,使用JSONArray作为中间表示。 - 在需要与JSON格式紧密交互的场景,比如配置文件、API响应等。 - **ArrayList**: - 在Java程序内部,需要动态数组来管理对象集合时。 - 当需要频繁访问元素(随机访问)时,因为ArrayList基于数组实现,所以通过索引访问很快。 - 当需要使用丰富的集合操作(如排序、过滤、遍历等)时。 总结: 虽然两者在结构上都是动态数组,但设计目的不同。JSONArray主要用于数据的序列化和反序列化(特别是在JSON格式中),而ArrayList是用于程序内部数据管理的通用集合。在需要处理JSON数据时,我们通常使用JSONArray;而在程序内部处理数据集合时,使用ArrayList(或其他集合类)更为合适。 注意:在有些情况下,我们可能会将ArrayList转换为JSONArray(例如将数据发送给前端),或者将JSONArray转换为ArrayList(例如解析JSON数据后,为了方便操作而转换)。这可以通过遍历元素逐个转换,或者使用第三方库的工具方法。 引用说明: 根据提供的引用,我们注意到: 引用[1]提到:json对象和json数组是json的两种表示结构。在JavaScript中,json对象和数组指满足json格式的JavaScript对象和数组。在Java中,json对象和数组是第三方工具包封装的JSONObject、JSONArray类。 引用[4]提到:ArrayList采用数组形式保存对象,访问速度更快。这印证了ArrayList基于数组实现的特性。 因此,我们可以这样引用: - JSONArray是第三方库按照JSON规范封装的类,用于处理JSON格式的数组[^1]。 - ArrayList是基于数组实现的动态数组,访问速度快[^4]。 最后,生成相关问题: 1. 如何将ArrayList转换为JSONArray? 2. 在Java中,如何安全地处理JSONArray中的混合类型数据? 3. ArrayList和LinkedList有什么区别?在什么情况下选择LinkedList? 4. 除了JSONArray,还有哪些常见的JSON处理库?它们有何特点? 5. 如何保证ArrayList的线程安全?</think>### JSONArray 与 ArrayList 的对比分析 #### 一、核心差异 | **维度** | **JSONArray** | **ArrayList** | |------------------|-------------------------------------------|-------------------------------------------| | **本质** | JSON 格式的数组结构(数据交换格式) | Java 集合框架的动态数组实现(内存数据结构) | | **类型安全** | ❌ 存储任意类型(Object),需动类型转换 | ✅ 泛型支持(如 `ArrayList<String>`) | | **来源** | 第三方 JSON 库(如 fastjson、org.json) | Java 标准库(`java.util` 包) | | **序列化能力** | ✅ 原生支持 JSON 序列化/反序列化 | ❌ 需额外工具(如 Jackson/Gson) | | **线程安全** | ❌ 通常非线程安全 | ❌ 非线程安全(需 `Collections.synchronizedList`) | | **内存结构** | 可能基于链表或哈希表(库实现相关) | 基于连续数组[^4] | #### 二、使用场景对比 1. **JSONArray 适用场景**: - **数据交换**:解析 API 响应(如 `[{"id":1}, {"id":2}]`) - **跨语言传输**:作为 JSON 字符串在 Java/Python/JS 间传递 - **临时数据处理**:快速解析非结构化 JSON 数据[^2] ```java // fastjson 示例:JSON 字符串 → JSONArray JSONArray arr = JSON.parseArray("[1, \"text\", true]"); ``` 2. **ArrayList 适用场景**: - **内存数据管理**:存储同类型对象集合(如 `List<User> users`) - **高频随机访问**:需按索引快速读取(数组结构 O(1) 访问)[^4] - **复杂数据操作**:排序、过滤、子列表等集合操作 ```java // ArrayList 类型安全示例 ArrayList<Integer> list = new ArrayList<>(); list.add(42); // 编译时类型检查 ``` #### 三、关键相同点 1. **动态扩容**:均支持动态添加/删除元素 2. **索引访问**:提供 `get(index)` 和 `set(index, value)` 方法 3. **迭代能力**:支持 for-each 循环和迭代器遍历 #### 四、典型差异示例 ```java // JSONArray 混合类型存储(无编译时检查) JSONArray jsonArr = new JSONArray(); jsonArr.add(1); jsonArr.add("text"); // 允许不同类型 // ArrayList 类型安全(泛型约束) ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("safe"); // arrayList.add(1); // 编译报错! ``` #### 五、选择建议 | **场景** | **推荐选择** | **原因** | |-----------------------------|------------|---------------------------------------------| | 解析/生成 JSON 数据 | JSONArray | 原生支持 JSON 标准,无需额外转换 | | 内存中操作同类型对象集合 | ArrayList | 类型安全、性能优化、丰富集合 API[^3] | | 高并发环境 | 均需封装 | 两者均非线程安全,需用 `Collections.synchronizedList` | | 需要频繁插入删除 | 均非最优 | 考虑 `LinkedList` 更合适[^4] | > **关键结论**: > JSONArray 是**数据交换的载体**(文本→内存对象),ArrayList 是**内存操作的容器**。在 JSON 解析场景中,常将 JSONArray 转换为 ArrayList 以获得类型安全和操作便利[^1][^2]。 --- ### 相关问题 1. JSONArray 如何转换为类型安全的 ArrayList? 2. 在 Spring Boot 中如何优化 JSONArray 的解析性能? 3. ArrayList 与 LinkedList 在内存占用和操作效率上有何差异?[^4] 4. Fastjson 的 JSONArray 在反序列化时存在哪些安全风险?[^2] 5. 如何为 JSONArray 实现类似 ArrayList 的泛型类型检查? > 引用说明: > [^1]: JSONArray 是第三方库基于 JSON 规范封装的类,主要解决数据交换的结构问题。 > [^2]: Fastjson 等库的 JSONArray 实现需注意反序列化安全。 > [^3]: ArrayList 作为 List 接口的实现,提供丰富的集合操作方法。 > [^4]: ArrayList 基于数组实现,随机访问快但插入删除成本较高。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值