欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ArrayList集合相关方法使用

程序员文章站 2022-09-28 22:59:09
ArrayList相关方法简述List概念1.1 ArrayList常见方法1.1.1 构造器1.1.2 add 方法1.1.3 get和set方法1.1.4 contains 方法1.1.5 remove方法1.1.6 toArray方法1.1.7 asList方法List概念存储的元素有序、可重复,可以理解为存储对象的数组,是Connection的子接口,与数组相比,长度是可变的,可以动态的对集合中的数据进行增加或减少。有两个比较常见的实现类ArrayList与LinkedList,两个实现类的方法...

List概念

存储的元素有序、可重复,可以理解为存储对象的数组,是Connection的子接口,与数组相比,长度是可变的,可以动态的对集合中的数据进行增加或减少。有两个比较常见的实现类ArrayList与LinkedList,两个实现类的方法大致相同,但对数据处理的性能上却有一定的差异。

这里我就说一下ArrayList相关方法的使用,不喜勿喷…

1.1 ArrayList常见方法

1.1.1 构造器

方法名称 方法使用说明
ArrayList() 构造一个初始容量为10的空列表
ArrayList(Collection<? extends E> c) 构造一个包含指定集合的元素的列表,它们在集合的迭代器返回的顺序中返回。
ArrayList(int initialCapacity) 用指定的初始容量构造一个空列表。
  • 问题一:为什么通过ArrayList() 创建的列表初始容量为10?
    源码解析
     /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
通过构造器的源码注释可以说名:构造一个初始容量为10的空列表

问题二:通过第二个构造器创建集合时会有什么坑点?

当传入的是由一个数组转变过来的集合时会出现UnsupportedOperationException(当不支持请求的操作时,抛出该异常),需要通过new Array()构造器再次操作,传入操作后的集合就可以解决该异常问题。

案例演示

//1.构造一个初始容量为十的空列表。
//private static final int DEFAULT_CAPACITY = 10;//源码容量私有化
List list_1=new ArrayList();
System.out.println("无参构造器构建list:"+list_1);
//2.构造一个包含指定集合的元素的列表
List<Integer> list_2=new ArrayList<>();
System.out.println("包含指定集合的元素的列表list的size:"+list_2.size());
//3.构造具有指定初始容量的空列表
List<Integer> list_3=new ArrayList<>(3);
System.out.println("指定初始容量的空列表list:"+list_3);

1.1.2 add 方法

  • 方法介绍
方法名称 方法描述
public boolean add(E e) 将指定的元素添加到当前列表的尾部
public void add(int index,E element) 在当前列表的指定位置添加指定元素
public boolean addAll(Collection<? extends E> c) 将指定的列表添加到此列表的尾部
public boolean addAll( int index,Collection<? extends E e> c ) 在当前列表的指定位置添加指定的列表
  • 案例演示
       //1、构建初始容量为10的空列表
       List<String> list  = new ArrayList<>();
        //2、测试add(E e)方法:将元素添加到当前列表的尾部
       list.add("彭于晏");
       list.add("高圆圆");
       //测试add(int index,E elemtn) 当前表指定位置添加指定元素,
       //原来该位置的元素向后移一位
       list.add(1,"薛之谦");
       //3、测试addAll(Collection<? extends E > c) 
       //将指定的列表添加到此列表的尾部
       List<String> myList = new ArrayList<>();
       myList.add("马云最帅");
       myList.add("聪明绝顶");
       list.addAll(myList);
       //addAll( int index,Collection<? extends E e> c )与add(int index,E elemtn) 同理
       System.out.println("当前列表list中的元素:" + list);

1.1.3 get和set方法

  • 方法介绍
方法名称 方法描述
public E get(int index) 返回此列表指定索引处的元素
public E set(int index ,E element) 用指定的元素替换此列表中指定位置的元素
  • 案例演示
List<String> list=new ArrayList<>();
//1.测试set方法
// IndexOutOfBoundsException -( index < 0 || index >= size()
//list.set(0,"高圆圆");
list.add("高圆圆");
String s1=list.set(0,"佟丽娅");
System.out.println(s1);
//2.测试get方法
String s2=list.get(0);
System.out.println(s2);

注意:
1. 当在使用set方法是索引的范围不能大于等于size(),否则会出现ArrayIndexOutOfBoundsException(用非法索引访问数组时抛出的异常)

     /**
     * Checks if the given index is in range.  If not, throws an appropriate
     * runtime exception.  This method does *not* check if the index is
     * negative: It is always used immediately prior to an array access,
     * which throws an ArrayIndexOutOfBoundsException if index is negative.
     */
    private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

因此,操作的索引应该小于size()大小

  • 当需要对操作后的元素进行再次利用时,可以使用set方法进行回收。原因,使用set方法后的返回值为当前位置的元素。

1.1.4 contains 方法

  • 方法介绍
方法名称 方法描述
public boolean contains(Object o) 如果此列表包含指定的元素,则返回true
public boolean containsAll(Collection<?> C) 如果此列表包含指定的列表,则返回true
  • 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
//在当前列表尾部添加指定元素
list.add("罗永浩");
list.add("彭于晏");
list.add("郑伊健");
//判断当前元素是否存在与列表中
boolean flag=list.contains("星哥");
System.out.println(flag);
List<String> mylist=new ArrayList<>();
mylist.add("苏焱");
//判断当前列表中是否包含指定列表元素
boolean myflag=list.containsAll(mylist);
System.out.println(myflag);

注意:

  • contains方法判断元素是否存在是根据元素的equals方法进行比较,若元素中没有重写equals方法,那么contains将比较对象。此处我没有重写equals方法的原因是,元素为String类型,String类中已经重写了equals方法。在使用contains方法时关注equals重写问题
    String类中重写了equals方法的源码解析
  public boolean equals(Object anObject) {
       if (this == anObject) {
           return true;
       }
       if (anObject instanceof String) {
           String anotherString = (String)anObject;
           int n = value.length;
           if (n == anotherString.value.length) {
               char v1[] = value;
               char v2[] = anotherString.value;
               int i = 0;
               while (n-- != 0) {
                   if (v1[i] != v2[i])
                       return false;
                   i++;
               }
               return true;
           }
       }
       return false;
   }

1.1.5 remove方法

  • 方法介绍
方法名称 方法描述
public E remove(int index ) 删除该列表中指定位置的元素
public boolean remove(Object o) 删除该列表中指定的元素
public boolean removeAll(Collection<?> c) 从此列表中删除指定集合包含的所有元素
public boolean retainAll()collection<?> c 除了集合c中的元素全部删除
  • 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
list.add("罗永浩");
list.add("彭于晏");
list.add("郑伊健");
//测试public E remove(int index)
String s1=list.remove(1);
System.out.println("删除的元素为:"+s1+"\n删除后集合list:"+list);
//测试public boolean remove(Object o)
boolean flag_1=list.remove("郑伊健");
System.out.println("删除结果为:"+flag_1+"\n删除后集合list:"+list);
//测试public boolean removeAll(Collection<?> c)
List<String> mylist=new ArrayList<>();
mylist.add("李佳琪");
mylist.add("攀哥");
mylist.add("罗永浩");
boolean flag_2=mylist.removeAll(list);
System.out.println("删除结果为:"+flag_2+"\n删除后集合list:"+mylist);
//测试public boolean retainAll(Collection<?> c)
mylist.add("罗永浩");
boolean flag_3=mylist.retainAll(list);
System.out.println("删除结果为:"+flag_3+"\n删除后集合list:"+mylist);

总结:若要对集合操作但是又要将移除的元素进行再次操作时,可以使用set方法和remove方法

1.1.6 toArray方法

  • 作用:将集合转换为数组
  • 方法介绍
方法名称 方法描述
public Object[] toArray() 当回一个包含当前列表所有元素的数组
public T[] toArray(T[] a) 当回一个包含当前列表所有元素的数组,指定类型
  • 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
//在当前列表的尾部添加元素
list.add("张无忌");
list.add("令狐冲");
list.add("段誉");
//测试public Object[] toArray()
Object[] o1=list.toArray();
//测试public <T> T[] toArray(T[] a);
String[] s1=list.toArray(new String[]{});
System.out.println(Arrays.toString(s1));

1.1.7 asList方法

  • 方法介绍
方法名称 方法描述
public static List asList(T… a) 返回由指定数组支持的一个固定大小的列表
  • 案例演示
   	 	//构建初始容量为10的空列表
   		List<String> list=new ArrayList<>();
   		//在当前列表的尾部添加元素
   		list.add("张无忌");
   		list.add("令狐冲");
   		list.add("段誉");
       //集合变数组(toArray()方法)
       String[] names = list.toArray(new String[]{});
       System.out.println("集合转数组:" + Arrays.toString(names));
       //数组转为集合:Arrays.asList)
       List<String> list_6 = Arrays.asList(names);
       System.out.println("数组转为集合:" + list_6);
       //需求:将当前元素列表添加数据、删除数据
       //此处使用new Array()操作,是为了解决前面说的UnsupportedOperationException异常
       List<String> list_new = new ArrayList<>(list_6);
       list_new.add("山山");//会出现UnsupportedOperationException,解决方案已给(上一行代码)
       System.out.println("list_new:" + list_new);

谢谢大家阅读,我会继续努力提高我的相关技术…

本文地址:https://blog.csdn.net/weixin_47891374/article/details/111786537