Java ArrayList类

2019-06-10  本文已影响0人  SnailLi

好记性不如烂笔头之:Java ArrayList类的一些使用方法

package cn.sl.arrayList.ui;
import java.util.*;
import java.util.function.Predicate;
/**
 * Created by snailLi on 2019/6/6
 *
 * @description: ArrayList类的使用
 */
 public class Test {

 /**
  * ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:
  * 动态的增加和减少元素
  * 实现了ICollection和IList接口
  * 灵活的设置数组的大小
  */

  public static void main(String[] args) {
    int[] array = new int[]{6,6,5,9,3,5,96,46,25,68,5,9,9,354,26,26,54,23,9,872,2,5,654,32,5};
    Test.addArray(array);

    Test.addArray();

    Test.remove();

    Test.conversion();

    Test.sort();

    Test.operation();
  }

  /**
   * ArrayList动态添加元素
   * 方法:add()
   *
   * */
   public static void addArray (int[] array){
    /**
     * Appends the specified element to the end of this list.
     *
     * 将指定的元素追加到此列表的末尾。
     * */
       ArrayList oddList = new ArrayList();//奇数
       ArrayList evenList = new ArrayList();//偶数
       for (int j : array) {
          //奇数 偶数
          if (j % 2 ==0){
              evenList.add(j);
          }
          else {
              oddList.add(j);
         }
     }
      System.out.println("将指定的元素追加到此列表的末尾:\n" + "奇数列表:" + oddList + "\n" + "偶数列表:" + evenList);

    /**
     * Inserts the specified element at the specified position in this list.
     * Shifts the element currently at that position (if any) and any
     * subsequent elements to the right (adds one to their indices).
     *
     * 将指定元素插入列表中的指定位置。将当前位于该位置的元素(如果有的话)和
     * 随后的任何元素向右移动(将一个元素添加到它们的索引中)。
     *
     * */

    ArrayList newList = new ArrayList();
    for (int j: array) {
        newList.add(j);

    }
    //把元素添加到指定的索引中
    newList.add(0,123);
    System.out.println("\n将一个元素添加到它们的索引中:\n" + newList);

    /**
     * Constructs a list containing the elements of the specified collection,
     * in the order they are returned by the collection's iterator.
     *
     *构造包含指定集合的元素的列表,按集合的迭代器返回元素的顺序排列。
     *
     * */
    ArrayList list = new ArrayList(Arrays.asList(array,array));
    System.out.println("\n构造包含指定集合的元素的列表,按集合的迭代器返回元素的顺序排列:\n" + list);

}

/**
 *插入元素
 */
public static void addArray (){

    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("c");
    list.add("d");
    list.add("e");
    System.out.println(list + "\n");

    ArrayList<String> array = new ArrayList<String>();
    array.add("b");

    /**
     * 将集合中的某个元素插入ArrayList的指定索引处--addAll(int index, CollectionE> c);
     */
    list.addAll(1,array);
    System.out.println("将集合中的某个元素插入ArrayList的指定索引处:" + list + "\n");


    ArrayList<String> newList = new ArrayList<String>();
    newList.add("f");
    /**
     * 将集合中的某个元素插入ArrayList的最后面---addAll(Collection<? extends E> c);
     */
    list.addAll(newList);
    System.out.println("将集合中的某个元素插入ArrayList的最后面:" + list);


}


/**
 * 删除元素
 * @return
 */
public static void remove (){

    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    System.out.println(list + "\n");

    /**
     * 从ArrayList中移除特定对象的第一个匹配项,注意是第一个-- remove(Object o)
     */
    list.remove("b");
    System.out.println("从ArrayList中移除特定对象的第一个匹配项:\n" + list + "\n");


    /**
     * 移除ArrayList的指定索引处的元素--remove(int index);
     */
    list.remove(list.size()-1);
    System.out.println("移除ArrayList的指定索引处的元素:\n" + list);

    /**
     * 从该列表中删除指定集合中包含的所有元素--removeAll(Collection<?> c)
     */
    ArrayList<String> newList = new ArrayList<String>();
    newList.add("a");
    newList.add("b");
    list.removeAll(newList);
    System.out.println("从该列表中删除指定集合中包含的所有元素:\n" + list);

    /**
     * 删除列表所有元素
     */
    list.clear();
    System.out.println("删除列表所有元素:\n" + list);


    /**
     * 过滤特定的元素
     */
    ArrayList<String> list2 = new ArrayList<>();
    list2.add("张三");
    list2.add("李四");
    list2.add("王二");
    list2.add("李麻子");
    list2.add("刘三");
    list2.removeIf(obj-> {
        return obj.contains("李") || obj.contains("张");
    });
    System.out.println("\n过滤特定元素:" + list2);

    ArrayList<Integer> list3 = new ArrayList<>();
    Random r = new Random(1);
    for (int i = 0; i < 50; i++) {
        Integer in = r.nextInt(100);
        list3.add(in);
    }
    System.out.println("\n过滤特定元素:" + list3);
    list3.removeIf(obj-> {
        return obj % 2 ==0;
    });
    System.out.println("\n过滤特定元素:" + list3);

}

/**
 * List转换为数组&&数组转换为List
 */
public static void conversion(){

    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    System.out.println(list + "\n");


    /**
     * Returns an array containing all of the elements in this list in proper sequence
     * (from first to last element); the runtime type of the returned array is that of
     * the specified array.  If the list fits in the specified array, it is returned therein.
     * Otherwise, a new array is allocated with the runtime type of the
     * specified array and the size of this list.
     *
     * 返回一个数组,该数组包含列表中按正确顺序排列的所有元素
     * (从第一个元素到最后一个元素);返回数组的运行时类型是指定数组的运行时类型。
     * 如果列表符合指定的数组,则返回其中的列表。
     * 否则,将使用指定数组的运行时类型和该列表的大小分配一个新数组。
     */
    String[] stringArray = list.toArray(new String[list.size()]);
 //        错误方式:使用String[] 强转会出现ClassCastException (类转换异常)
//        String[] stringArray = (String[]) list.toArray();
    System.out.println("List转换为数组--<T> T[] toArray(T[] a):\n" + Arrays.toString(stringArray));


    /**
     * Returns an array containing all of the elements in this list in proper
     * sequence (from first to last element).
     *
     * 返回一个数组,该数组按适当的顺序(从第一个元素到最后一个元素)包含列表中的所有元素。
     */
    Object[] obj = list.toArray();
    System.out.println("List转换为数组--Object[] toArray():\n" + Arrays.toString(obj));


    String[] string = {"a","b","c","d"};
    /**
     * Returns a fixed-size list backed by the specified array.  (Changes to the returned list
     * "write through" to the array.)  This method acts as bridge between array-based
     * and collection-based APIs, in combination with {@link Collection#toArray}.
     * The returned list is serializable and implements {@link RandomAccess}.
     *
     * 返回指定数组支持的固定大小列表。(对返回列表“write through”到数组的更改。)
     * 此方法与{@link Collection#toArray}结合,充当基于数组和基于集合的api之间的桥梁。
     * 返回的列表是可序列化的,并实现{@link RandomAccess}。
     */
    List<String> stringList = Arrays.asList(string);
//        注意的是:返回的集合我们不能对其增删元素,否则会抛出异常,并且对集合的元素进行修改会影响数组对应的元素。
//        stringList.add("e");
    System.out.println("数组转换为List--<T> List<T> asList(T... a):\n" + stringList);


    List<String> newStringList = new ArrayList<String>();
    /**
     * Appends all of the elements in the specified collection to the end of this list,
     * in the order that they are returned by the specified collection's iterator (optional operation).
     * The behavior of this operation is undefined if the specified collection is modified while the
     * operation is in progress.  (Note that this will occur if the specified
     * collection is this list, and it's nonempty.)
     *
     * 将指定集合中的所有元素按照指定集合的迭代器(可选操作)返回的顺序追加到此列表的末尾。
     * 如果在操作进行期间修改了指定的集合,则此操作的行为未定义。
     * (注意,如果指定的集合是这个列表,并且它不是空的,则会发生这种情况。)
     */
    newStringList.addAll(Arrays.asList(string));
    System.out.println("数组转换为List--boolean addAll(Collection<? extends E> c):\n" + newStringList);


}

/**
 * 排序
 */
public static void sort(){
    ArrayList<Integer> list = new ArrayList<Integer>();
    /**
     * 生成10个1到100以内的随机数
     */
    Random r = new Random(1);
    for (int i = 0; i < 10; i++) {
        Integer in = r.nextInt(100);
        list.add(in);
    }
    System.out.println("生成10个1到100以内的随机数集合:\n" + list);
    Collections.sort(list);
    System.out.println("升序:\n" + list);

    Collections.sort(list,Collections.reverseOrder());
    System.out.println("降序:\n" + list);

    /**
     * 最大的数&&最小的数
     */
    int mun = Collections.max(list);
    int mun1 = Collections.min(list);
    System.out.println("list列表:\n" + list + "\n最大的数是:" + mun  + "\n最小的数是:" + mun1);


    /**
     *Collections的sort方法是对集合元素进行自然排序,那么两个元素对象之间就一定要有大小之分。
     * 这个大小之分是如何界定的?实际上,在使用Collections的sort排序的集合元素都必须是Comparable接口的实现类,
     * 该接口表示其子类是可比较的,因为实现该接口必须重写抽象方法:
     * int compareTo(T t);
     * 该方法用于使当前对象与给定对象进行比较。
     * 若当前对象大于给定对象,那么返回值应为>0的整数。
     * 若小于给定对象,那么返回值应为<0的整数。
     * 若两个对象相等,则应返回0。
     * Comparator接口
     * 一旦Java类实现了Comparable接口,其比较逻辑就已经确定,如果希望在排序的操作中临时指定比较规则,可以采用Compartor接口回调的范式。
     * Comparator接口要求实现类必须重写其定义的方法: int compare(T o1,T o2);
     * 该方法的返回值要求:
     * 若o1>o2,则返回值应>0;
     * 若o1<o2,则返回值应<0;
     * 若o1=o2,则返回值应=0。
     *
     */

}


public static void operation(){

    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("b");
    System.out.println(list + "\n");

    /**
     * 如果list含有元素o,返回true
     */
    String string = "b";
    if (list.contains(string)){
        System.out.println("\nlist集合包含元素" + string);
    }
    else {
        System.out.println("\nlist集合不包含元素" + string);
    }

    /**
     * list是否包含元素
     */
    if (list.isEmpty()){
        System.out.println("\nlist集合不包含任何元素");
    }
    else {
        System.out.println("\nlist集合包含至少一个元素元素");
    }


    /**
     * 返回指定index处的元素
     */
    int index = 2;
    String str = list.get(index);
    System.out.println("\nlist列表的第" + index + "个索引下的元素为:" + str);

    /**
     *获取list中第一个匹配元素的index
     */
    int index1 = list.indexOf(string);
    System.out.println("\n获取list中第一个匹配元素" + string + "的下标为:" + index1);
    /**
     * 获取list中最后一个匹配元素的index
     */
    int index2 = list.lastIndexOf(string);
    System.out.println("\n获取list中最后一个匹配元素" + string + "的下标为:" + index2);



    /**
     * 替换指定index(下标)处的元素
     */
    String replace = "3";
    String s = list.set(index,replace);
    System.out.println("\n替换list列表第" + index +"个下标的元素为:" + replace + ",新列表为:" + list);

    /**
     * 替换指定的元素
     */
    Collections.replaceAll(list,"3","c");
    System.out.println("\n替换指定的元素3为c:" + list);


}



}
上一篇下一篇

猜你喜欢

热点阅读