• 26、线性表(List)


    1、List

      List接口是Collection的子接口,List是一个可重复集合

    2、ArrayList和LinkedList

      ArrayList和LinkedList是List接口最常见的两个实现类,分别用动态数组和链表的方式实现了List接口。

    3、get与set方法

      List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法。

      E get(int index):获取集合中指定下标对应的元素,下标从0开始。

      E set(int index, E elment):将给定的元素存入给定位置,并将原位置的元素返回。

     1 List list=new ArrayList();
     2 list.add("java");
     3 list.add("C#");
     4 list.add("javascritp");
     5 list.add("vbscript");
     6 //遍历集合
     7 for(int i=0;i<list.size();i++){
     8     System.out.println(list.get(i));
     9 }
    10 System.out.println("============================");
    11 //交换元素2和3的位置
    12 list.set(2, list.set(1, list.get(2)) ) ;
    13 for(int i=0;i<list.size();i++){
    14     System.out.println(list.get(i));
    15 }
    16 
    17 
    18 结果
    19 java
    20 C#
    21 javascritp
    22 vbscript
    23 ============================
    24 java
    25 javascritp
    26 C#
    27 vbscript

    3. 插入和删除

      List根据下标的操作还支持插入与删除操作:

      void add(int index,E element):

      将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。

      E remove(int index):

      删除给定位置的元素,并将被删除的元素返回。

    4、 subList方法

      List的subList方法用于获取子List。

      需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响的原List。

      List<E> subList(int fromIndex, int toIndex);

      fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括) 。

    5. List转换为数组

      List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。

      其有两个方法:

      Object[] toArray()

      <T>T[] toArray(T[] a)

    1 List<String> list=new ArrayList<String>();
    2 list.add("java");
    3 list.add("C#");
    4 list.add("javascritp");
    5 list.add("vbscript");
    6 
    7 Object[] arr= list.toArray();
    8 
    9 String[] arr2 = list.toArray(new String[]{} );

      其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。

    6. 数组转换为List

      Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。其方法定义为:

       static <T>List<T> asList<T… a> 返回的List的集合元素类型由传入的数组的元素类型决定。

      需要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行的修改会影响数组对应的元素。

     7、List排序

    方法一: Collections.sort方法实现排序:其作用是对集合元素进行自然排序(按照元素的由小至大的顺序)

    1         List list=new ArrayList();
    2         Random r=new Random();
    3         for(int i=0;i<10;i++){
    4             list.add(r.nextInt(100));
    5         }
    6         System.out.println(list);
    7         Collections.sort(list);
    8         System.out.println(list);

    运行结果:
    [48, 25, 29, 65, 85, 52, 20, 68, 76, 5]
    [5, 20, 25, 29, 48, 52, 65, 68, 76, 85]

    方法二: Comparable

      通过上一节我们知道了如何对集合元素进行自然排序,但是要想对元素进行自然排序那么就必须要有一个必要条件,就是元素的大小。集合中存入的都是引用类型,是以对象的形式存在于内存中,那么对象是如何进行的大小比较呢?实际上,若想对某个集合的元素进行自然排序,该集合的元素有一个要求,就是这些元素必须是Comparable的子类。

    Comparable是一个接口,用于定义其子类是可以比较的。因为该接口有一个抽象方法:

    int compareTo(T t)

    所有子类都需要重写该方法来定义对象间的比较规则。该方法要求返回一个整数,这个整数不关心具体的值,而是关注取值范围。

    当返回值>0时,表示当前对象比参数给定的对象大。

    当返回值<0时,表示当前对象比参数给定的对象小。

    当返回值=0时,表示当前对象和参数给定的对象相等。

    例如:

     1 class Person implements Comparable<Person>{
     2     
     3     int age;
     4     String name;
     5     public Person(String name,int age){
     6         this.name=name;
     7         this.age=age;
     8     }
     9     public int compareTo(Person o) {
    10         return age-o.age;
    11     }
    12     public String toString(){
    13         return "[name="+name+",age="+age+"]";
    14     }
    15     
    16     public static void main(String[] args) {
    17         List list=new ArrayList();
    18         list.add(new Person("zhangshan", 25));
    19         list.add(new Person("lisi", 22));
    20         list.add(new Person("wangwu", 24));
    21         list.add(new Person("zhaoliu", 21));
    22         System.out.println(list);
    23         Collections.sort(list);
    24         System.out.println(list);
    25     }
    26 }

    运行结果
    [[name=zhangshan,age=25], [name=lisi,age=22], [name=wangwu,age=24], [name=zhaoliu,age=21]]
    [[name=zhaoliu,age=21], [name=lisi,age=22], [name=wangwu,age=24], [name=zhangshan,age=25]]

    方法三:comparator

      一旦Java类实现了Comparable,其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。

    该接口要求实现类必须重写其定义的方法:

    int compare(T o1,T o2)

    该方法的返回值要求,若o1>o2则返回值应>0,若o1<o2则返回值应<0,若o1==o2则返回值应为0

    例如:

    1 Collections.sort(list, new Comparator<Person>() {
    2     @Override
    3     public int compare(Person o1, Person o2) {
    4             return o2.age-o1.age;
    5     }
    6 });
    7 System.out.println(list);

    运行结果

    [[name=zhangshan,age=25], [name=wangwu,age=24], [name=lisi,age=22], [name=zhaoliu,age=21]]

  • 相关阅读:
    rocketmq 命令示例
    原 荐 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控
    业务系统中最核心的状态设计,异常 case. (系统设计)
    大数据架构分析
    开源 java 电商系统
    数据一致性对账平台架构
    管理中遇到的问题--人,组织上的问题
    腾讯后台开发面试题
    理解inode
    TCP序列号和确认号
  • 原文地址:https://www.cnblogs.com/caoyc/p/4603756.html
Copyright © 2020-2023  润新知