文章目录
- 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;
}
}