ArrayList的一些方法

ArrayList,善于随机访问元素,但插入和删除元素较慢。且ArrayList不是线程安全的,一般在单线程中使用

 

一:三种构造方法

  1. 可以构造一个默认初始容量为10的空列表
  2. 构造一个指定初始容量的空列表
  3. 构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的​​​​​​
//1-----------------------
public ArrayList() {
        this(10);
        //调用ArrayList(10) 默认初始化一个大小为10的object数组。
    }

//2-------------------------
public ArrayList(int initialCapacity) {    
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
         //如果用户初始化大小小于0抛异常,否则新建一个用户初始值大小的object数组。                                      
        this.elementData = new Object[initialCapacity];
    } 

//3--------------------------
public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // 当c.toArray返回的不是object类型的数组时,进行下面转化。
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

 

 

二:存储数据

检查指定位置是否大于等于列表长度,如果大于则抛出异常

public void rangeCheck(int index) {
		if(index<0||index>=size) {
			try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	

set(替换指定位置上的元素,并且返回替换之前的指定位置的元素 
其中rangeCheck(index)方法是检查指定位置是否大于等于列表长度,如果大于则抛出异常)

public Object set(int index,Object obj) {
		//替换指定位置上的元素,并且返回替换之前的指定位置的元素
		rangeCheck(index);//检查指定位置是否大于等于列表长度
		Object oldvalue= elementDate[index];
		elementDate[index]=obj;
		return oldvalue;
		
	}

add(01)

public void add(Object obj) {
		//数组的扩容和数组的拷贝
		
		if(size==elementDate.length) {
			Object[] newArray=new Object[size*2+1];
			System.arraycopy(elementDate, 0, newArray, 0, elementDate.length);
			
			Object[] newnewArray = null;
			elementDate=newnewArray;
		}
		elementDate[size++]=obj;
	}

add(02){System.arraycop()方法:将指定位置以及后续的元素向后移动一位。}

 

public void add(int index,Object obj) {
		//将元素插入到列表中指定的位置 
		//如果当前位置有元素,则向后移动当前位置的元素以及所有后续的元素(将其索引加+1) 
		rangeCheck(index);
		System.arraycopy(elementDate, index, elementDate, index+1, size-index);
		elementDate[index]=obj;
		size++;
		

remove(int index)

remove(Object o)

第一种:删除指定位置的元素

public void remove(int index) {
		rangeCheck(index);
		//删除指定对象的元素
		int numMoved=size-index-1;
		if(numMoved>0) 
			System.arraycopy(elementDate, index+1, elementDate, index, numMoved);
		elementDate[--size]=null;
		
	}

第二种:移除此列表首次出现的指定元素(如果存在),ArrayList可以存放重复的元素。

public void remove(Object obj) {
		//删除重复的数组
		for(int i=0;i<size;i++) {
			if(get(i).equals(obj)) {  //注意:底层调用的是equals方法 不是==
				remove(i);
			}
		}
	}

查找

正向查找

// 正向查找,返回元素的索引值
    public int indexOf(Object o) {
     
		if (o == null) {
            for (int i = 0; i < size; i++)
            if (elementDate[i]==null)
                return i;
            } else {
                for (int i = 0; i < size; i++)
                if (o.equals(elementDate[i]))
                    return i;
            }
            return -1;
        }

反向查找

// 反向查找,返回元素的索引值
        public int lastIndexOf1(Object o) {
        if (o == null) {
            for (int i = size-1; i >= 0; i--)
            if (elementDate[i]==null)
                return i;
        } else {
            for (int i = size-1; i >= 0; i--)
            if (o.equals(elementDate[i]))
                return i;
        }
        return -1;
    }
// 反向查找(从数组末尾向开始查找),返回元素(o)的索引值
    public int lastIndexOf(Object o) {
        if (o == null) {
            for (int i = size-1; i >= 0; i--)
            if (elementDate[i]==null)
                return i;
        } else {
            for (int i = size-1; i >= 0; i--)
            if (o.equals(elementDate[i]))
                return i;
        }
        return -1;
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值