文章目录
- 1.集合类简介
- 2. 自定义集合类
1.集合类简介
集合和数组一样,都是用来存储多个数据的结构,也可以称作容器。
数组长度是不可变化的,一旦在初始化数组时指定了数组长度,这个长度就不可变。如果需要处理数量变化的数据,数组就无法实现;而且数组也没有办法保存有映射关系的数据(例如:语文-90分,数学-80分)。
为了保存数量不确定的数据,以及具有映射关系的数据,提供了集合类。
集合类主要负责保存、盛装 其他数据。
所有的集合类都在java.util包下,提供了一个表示和操作对象集合的统一架构,包含了大量的接口和类,并且包含了这些接口和实现类的操作算法和数据结构。
集合和数组处理的区别:
- 数组的长度不可变,集合类的长度可变
- 数组提供的方法有限,对于添加、删除、插入数据操作非常不方便,并且效率不高。
- 数组中存储数据的特点是:有序、可重复的,对于无序、不可重复的需求,不能满足。
- 数组中可以存储基本数据类型。也可以存储引用类型。在集合中只能保存引用类型(保存的是对象的引用地址)
在集合和数组中所指的存储,指在内存层面的存储,不涉及到持久化数据。(持久化数据指的是永久保存的数据,这种数据一般保存在磁盘上或者数据库中)
数组 | 集合 |
---|---|
长度不可变 | 长度可变 |
提供的方法有限,对于添加、删除、插入数据操作不方便 | 操作数据方便 |
存储的数据是有序、可重复 | 存储的数据无序、不可重复 |
可以存储基本数据类型,也可以存储引用类型 | 只能存储引用类型 |
2. 自定义集合类
public class MyArray {private Object[] elementData;//用来存储数据的数组private int size;//数组的实际长度(实际元素的个数)private static final int DEFAULT_CAPACITY=10;//默认初始空间private static final Object[] EMPTY_ELEMENTDATA={};//构造函数public MyArray(){elementData=new Object[DEFAULT_CAPACITY];}/*** 如果我不需要那么大的空间,可以用下面这个方法* 在创建数组空间时,要先对initialCapacity进行判断* 如果initialCapacity>0,那么就创建大小为initialCapacity新的空间* 如果initialCapacity=0,那么就创建大小为空的新的空间* 如果以上条件都不满足,就抛出参数异常*/public MyArray(int initialcapacity){if (initialcapacity>0){elementData=new Object[initialcapacity];}else if (initialcapacity==0){elementData=EMPTY_ELEMENTDATA;}else {throw new IllegalArgumentException("数组初始参数异常"+initialcapacity);}}//获取集合的实际大小public int size(){return size;}//向集合中添加数据public boolean add(Object obj){add(obj,elementData,size);return true;}//在索引位置插入数据public void add(int index,Object obj){if (index>size || index<0){throw new IndexOutOfBoundsException("索引下标越界:"+index);}if (size==elementData.length){elementData=grow();}System.arraycopy(elementData,index,elementData,index+1,size-index);elementData[index]=obj;size++;}/*** 添加元素类* @param obj 要添加的元素* @param elementData 数组* @param s 数组的现有长度*/public void add(Object obj,Object[] elementData,int s){if (s==elementData.length){elementData=grow();}elementData[s]=obj;size=s+1;}//扩容public Object[] grow(){return elementData= Arrays.copyOf(elementData,elementData.length+(elementData.length>>1));}//获取元素public Object get(int index){if (index<elementData.length){return elementData[index];}else {throw new IndexOutOfBoundsException("索引长度异常");}}//清除集合中的所有元素public void clear(){/*int to=size;size=0;for (int i=0;i<size;i++){elementData[i]=null;}*/for (int to=size, i=size=0;i<to;i++){elementData[i]=null;}}//删除索引位置的数据,并返回删除掉的元素值public Object remove(int index){if (index>size || index<0){throw new IndexOutOfBoundsException("索引下标越界:"+index);}Object obj=elementData[index];size--;if (size>index){System.arraycopy(elementData,index+1,elementData,index,size-index);}elementData[size]=null;return obj;}}