Java基础-----集合类(一)

发布时间:2024年01月03日

请添加图片描述

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;
    }

}
文章来源:https://blog.csdn.net/qq_41994691/article/details/135168280
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。