ArrayList集合相关方法使用

此文转载自:https://blog.csdn.net/weixin_47891374/article/details/111786537

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+"
删除后集合list:"+list);
//测试public boolean remove(Object o)
boolean flag_1=list.remove("郑伊健");
System.out.println("删除结果为:"+flag_1+"
删除后集合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+"
删除后集合list:"+mylist);
//测试public boolean retainAll(Collection<?> c)
mylist.add("罗永浩");
boolean flag_3=mylist.retainAll(list);
System.out.println("删除结果为:"+flag_3+"
删除后集合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);

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

   

更多内容详见微信公众号:Python测试和开发

Python测试和开发

原文地址:https://www.cnblogs.com/phyger/p/14205025.html