zoukankan      html  css  js  c++  java
  • Java集合框架中List接口的简单使用

      Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放到同一个集合中,否则是不能放进去的;

      集合可以对元素进行简单快速的查找、插入、删除操作

      某些集合可以有<key value>映射的关系

      数组的长度是固定的,而集合的长度是跟随元素的个数动态变化的,灵活性和扩展性都比数组更加优越

      数组只能存放基本类型的数据,而集合存放的是对象引用类型的

      数组只能通过索引来访问,但是集合的访问则可以通过任意类型查找元素

      

      Java中提供了一些接口用于构建集合,根接口主要有:Collection和Map接口

      Collection接口常用的是3个子接口:List(序列)、Queue(队列)、Set(数据集);对于这个子接口各有自己的实现方法,来创建引用,常用的:List实现方法是ArrayList方法,Queue实现方法是LinkedList,Set实现方法是HashSet

      Map接口则可以由HashMap方法直接实现

      

      以上是集合的基本概念和Java中常用的集合框架接口,下面来看一个学生选课的简单示例,代码如下:

      课程类,Course.java

     1 /*
     2  * 课程类,规定课程结构,用于向集合中传入此类型的元素
     3  */
     4 
     5 public class Course {
     6     public String id;
     7     public String name;
     8     public Course(String id,String name){
     9         //含参构造方法
    10         this.id = id;
    11         this.name = name;
    12     }
    13     
    14     public Course(){
    15         //无参构造器,为了子类初始化隐式构造方法
    16     }
    17 }

      集合操作类,ListTest.java

      1 import java.util.ArrayList;
      2 import java.util.Arrays;
      3 import java.util.Iterator;
      4 import java.util.List;
      5 
      6 /*
      7  * 操作课程测试类
      8  */
      9 
     10 public class ListTest {
     11     public List coursesToSelect;    //定义List接口类型的属性,存放课程
     12     
     13     public ListTest(){
     14         this.coursesToSelect = new ArrayList();    //初始化构造器,通过ArrayList方法实现List接口类型属性初始化
     15     }
     16     /*
     17      * 用于添加课程的方法
     18      */
     19     public void testAdd(){
     20         Course cr1 = new Course("1","数据结构");    //不一个类中,必须实例化课程对象,传入初始值
     21         coursesToSelect.add(cr1);    //添加属性到List中,位置0
     22         Course temp1 = (Course) coursesToSelect.get(0);    //取出对应位置的属性,因为取出时全部为Object类型的所以需要转成Course类型的
     23         System.out.println("添加了课程:" + temp1.id + ":" + temp1.name);
     24         
     25         Course cr2 = new Course("2","C语言");
     26         coursesToSelect.add(0,cr2);    //通过重载的add指定添加位置,会把刚才添加的0位置挤到1位置
     27         Course temp2 = (Course) coursesToSelect.get(0);    //取出对应位置的属性,因为取出时全部为Object类型的所以需要转成Course类型的
     28         System.out.println("添加了课程:" + temp2.id + ":" + temp2.name);
     29         
     30         //List中元素允许重复,重新添加一次
     31         coursesToSelect.add(cr1);    //重新添加课程1,索引继续往后排
     32         Course temp0 = (Course) coursesToSelect.get(2);
     33         System.out.println("添加了课程:" + temp0.id + ":" + temp0.name);
     34         
     35 //        Course cr3 = new Course("3","Test");
     36 //        coursesToSelect.add(4,cr3);    //添加索引不能大于当前元素个数,所以最大应该是2,否则会抛出数组下标越界异常
     37         
     38         Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};    //创建一个课程类数组,存放多个对象
     39         coursesToSelect.addAll(Arrays.asList(course));    //把数组转成List传递到courseToSelect属性中
     40         Course temp3 = (Course) coursesToSelect.get(3);
     41         Course temp4 = (Course) coursesToSelect.get(4);
     42         System.out.println("添加了两门课程:" + temp3.id + ":" + temp3.name + "  " + temp4.id + ":" + temp4.name);
     43         
     44         Course[] course2 = {new Course("5","高等数学"),new Course("6","算法分析")};
     45         coursesToSelect.addAll(2,Arrays.asList(course2));    //通过重载的addAll指定添加位置,只是放置多个对象,原有的将会被挤出
     46         Course temp5 = (Course) coursesToSelect.get(2);
     47         Course temp6 = (Course) coursesToSelect.get(3);
     48         System.out.println("添加了两门课程:" + temp5.id + ":" + temp5.name + "  " + temp6.id + ":" + temp6.name);
     49     }
     50     
     51     /*
     52      * 遍历List中元素的方法
     53      */
     54     public void testGet(){
     55         int size = coursesToSelect.size();    //取得List中的元素个数
     56         System.out.println("有如下课程:");
     57         for(int i = 0;i < size;i++){
     58             Course cr = (Course) coursesToSelect.get(i);
     59             System.out.println("课程:" + cr.id + ":" + cr.name);
     60         }
     61     }
     62     
     63     /*
     64      * 通过迭代器来遍历List中的元素
     65      */
     66     public void testIterator(){
     67         Iterator it = coursesToSelect.iterator();    //通过iterator实现Iterator接口
     68         System.out.println("有以下课程:");
     69         //如果下一个元素存在,循环
     70         while(it.hasNext()){
     71             Course cr = (Course) it.next();
     72             System.out.println("课程:" + cr.id + ":" + cr.name);
     73         }
     74     }
     75     
     76     /*
     77      * 通过foreach方法遍历List中的元素
     78      */
     79     public void testForeach(){
     80         System.out.println("有以下课程:");
     81         //因为coursesToSelect中元素都为Object所以foreach循环元素为:Object obj
     82         for(Object obj:coursesToSelect){
     83             Course cr = (Course) obj;
     84             System.out.println("课程:" + cr.id + ":" + cr.name);
     85         }
     86     }
     87     
     88     /*
     89      * 修改List中的元素
     90      */
     91     public void testModify(){
     92         coursesToSelect.set(4,new Course("7","操作系统"));    //通过set方法修改相应位置的元素
     93     }
     94     
     95     /*
     96      * 删除List中的元素
     97      */
     98     public void testRemove(){
     99 //        Course cr = (Course) coursesToSelect.get(4);
    100 //        System.out.println("将要删除课程:" + cr.id + ":" + cr.name);
    101 //        //coursesToSelect.remove(4);    //按照索引删除课程
    102 //        coursesToSelect.remove(cr);    //按照传入对象删除课程
    103 //        testForeach();
    104         System.out.println("将同时要删除索引4和5上的元素:");
    105         Course[] course = {(Course) coursesToSelect.get(4),(Course) coursesToSelect.get(5)};
    106         coursesToSelect.removeAll(Arrays.asList(course));    //把对象数组转成List类型,然后批量删除
    107         testForeach();
    108         
    109     }
    110     
    111     /*
    112      * 往List中添加其他类型的时候会出现异常
    113      */
    114     public void testType(){
    115         System.out.println("往List添加其他类型的元素:");
    116         coursesToSelect.add("string");
    117         //会报出异常,String类型无法转换成Course类型
    118     }
    119     
    120     public static void main(String[] args){
    121         ListTest lt = new ListTest();    //实例化对象,并调用构造器初始化
    122         lt.testAdd();
    123 //        lt.testType();
    124 //        lt.testForeach();
    125         lt.testGet();
    126         lt.testIterator();
    127         lt.testForeach();
    128         lt.testModify();
    129         lt.testForeach();
    130         
    131         lt.testRemove();
    132     }
    133     
    134 }

      代码比较乱,主要就是体现了怎么定义List引用,通过构造方法初始化List引用,通过add、addAll、get、set、remove、removeAll这些方法来操作List中的元素,同时有一些常见的错误注释中都有说明,然后就是通过3中遍历方式遍历出List中所有元素,值得注意的一点是把属性放入List的引用coursesToSelect属性中时全部会被转换成Object类型,然后取出时也是Object类型的,不是Course类型的,所以每次取出时都要用一次类型强制转换,下一篇文章会解决这种问题,就是使用泛型来解决

      以上就是List接口的简单使用,另外还有很多方法,这里只是最基本的操作,只要对集合的本质有个明确的理解和认识,其他的具体方法经常去查Java API文档就可以了

  • 相关阅读:
    mysql用 法like concat()
    redis系列之数据库与缓存数据一致性解决方案
    day33:进程锁&事件&进程队列&进程间共享数据
    day32:进程&进程join&守护进程deamon
    day31:socketserver&hashlib&hmac&TCP登录
    day30:TCP&UDP:socket
    day29:计算机网络概念
    小程序3:ATM小程序
    hdu 6867 Tree 2020 Multi-University Training Contest 9 dfs+思维
    Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
  • 原文地址:https://www.cnblogs.com/freeweb/p/4836329.html
Copyright © 2011-2022 走看看