• Java集合框架学习笔记


    本文为学习笔记,学习课程为慕课网Java入门第三季中的集合框架部分,若需要研究文中的代码,可前往下载。http://www.imooc.com/learn/110

    1. List(Collection子接口)

    1.1 实例化

    List list = new ArrayList();

      List是一个接口,不可直接实例化,通常情况下ArrayList实现类进行实例化。

    1.2 增

    1.2.1 add(obj)

      直接将obj对象加入List末位。

    1.2.2 add(i, obj)

      将obj对象加入第i位。

    1.2.3 addAll(c)
    Course[] course1 = {new Course("3","离散数学"), new Course("4","设计模式")};
    coursesToSelect.addAll(Arrays.asList(course1));

      同时加入多个对象,需要注意的是,addAll方法的参数为collection对象,需通过Arrays类的asList方法将数组转换为collection对象才可。

    1.2.4 addAll(i, c)

      与1.2.3基本相同,将n个对象插入到第i位至第i+n位。

    1.3 删

    1.3.1 remove(obj)
    Course cr = (Course) coursesToSelect.get(1);
    coursesToSelect.remove(cr);

      直接指定删除对象,若引用不同,删除失败。

    1.3.2 remove(i)

      删除List中第i位对象,较1.3.1中的方法更好。

    1.3.3 removeAll(c)

      与1.2.3中的addAll方法类似。

    1.4 改(set方法)

    coursesToSelect.set(0, new Course("5","计算机网络"));

      第一个参数指定修改的位置,第二个是修改的内容,实质为新建一个修改后的对象插入到指定位置。

    1.5 查

    1.5.1 get(i)

      获取List中第i位的对象。

    1.5.2 通过迭代器遍历List
    Iterator it = coursesToSelect.iterator();
    while (it.hasNext()) {
        Course cr = (Course) it.next();
    }
    1.5.3 通过for-each遍历
    for (Object obj:coursesToSelect) {
        Course cr = (Course) obj;
    }
    1.5.4 contains(obj)、containsAll(c)
    System.out.println("请输入要查询的课程名称:");
    String name = console.next();
    Course course2 = new Course();
    course2.setName(name);
    System.out.println("新建课程:" + course2.getName());
    System.out.println("备选课程中是否包含课程:" + course2.getName() + "," + coursesToSelect.contains(course2));

      contain方法的原理为:通过分别调用List中所有对象的equals方法与传递的参数进行比较,若有某一对象相等,则返回true,若无,则返回false。

      需要注意的是,contains方法比较的并不是对象的值,而是对象的引用,若引用不同,即使值相等,返回值依然为false。

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Course)) {
            return false;
        }
        Course course = (Course) obj;
        if (this.getName() == null) {
            if (course.getName() == null)
                return true;
            else
                return false;
        } else {
            if (this.getName().equals(course.getName()))
                return true;
            else
                return false;
        }
    }

      如需通过值比较两对象是否相等,需重写List中存放的对象所属类中的equals方法。

    1.5.5 indexOf(obj)、lastIndexOf(obj)

      前者返回obj对象顺序第一次出现的索引位置,后者则为倒序遍历,若List中不存在该对象,则返回-1。

    2. Set(Collection子接口)

    2.1 实例化

    Set courses = new HashSet();

      通过HashSet实现类进行实例化。

    2.2 增、删、改、查

      了需要指定索引的方法外,其余与List基本一致。

    需要注意的是,这里的Set是通过HashSet实现,因而其contains、containsAll方法除去equals方法外,还需逐个调用其hashCode方法,因此必须重写hashCode方法。

    3. Map接口

    3.1 实例化

    Map<String, Student> students = new HashMap<String, Student>();

      需指定key、value,即键值对的类型,通过HashMap实例化。

    3.2 增

    put(key, value)

    3.3 删

    remove(key)

    3.4 改

      Map中修改元素的方法为put,实质为通过新建一个key值重复的新的对象,覆盖需要修改的对象。

    3.5 查

    3.5.1 keySet()
    public void testKeySet() {
        //通过keySet方法,返回Map中的所有key的Set集合
        Set<String> keySet = students.keySet();
        System.out.println("总共有" + keySet.size() + "个学生");
        //遍历keySet,取得每一个key,再调用get方法取得每个key对应的value
        for (String stuId : keySet) {
            Student st = students.get(stuId);
            if (st != null) {
                System.out.println("学生:" + st.getName());
            }
        }
    }

      新建Set用于承载keySet返回的集合时,需按照key的类型指定Set的类型。

    3.5.2 entrySet()
    public void testEntrySet() {
        Set<Entry<String, Student>> entrySet = students.entrySet();
        for (Entry<String, Student> entry : entrySet) {
            System.out.println("取得key:" + entry.getKey());
            System.out.println("取得value:" + entry.getValue().getName());
        }
    }

      该函数返回的键值对的集合本身指定了泛型,因而新建Set集合时需要指定Entry的泛型。

    3.5.3 values()(略)
    3.5.4 containsKey(key)、containsValue(value)

      判断Map中是否存在相应key值、value值的对象。

      需要注意的是,同List、Set中的Contains方法一样,这两个方法的原理也是调用Map中所有元素的equals方法进行比较,因而需要重写equals方法。

    4. Collections工具类

    4.1 对Integer类型的List进行排序

    List<Integer> intList = new ArrayList<Integer>();
    //插入10个100以内的不重复随机数
    Random random = new Random();
    Integer k;
    for (int i=0; i<10; i++) {
        do {
            k = random.nextInt(100);
        } while (intList.contains(k));
        intList.add(k);
    }
    System.out.println("-------排序前-------");
    for(Integer i : intList) {
        System.out.println("元素:" + i);
    }
    Collections.sort(intList);
    System.out.println("-------排序后-------");
    for(Integer i : intList) {
        System.out.println("元素:" + i);
    }

    4.2 对String类型的List进行排序

    List<String> stringList = new ArrayList<String>();
    stringList.add("microsoft");
    stringList.add("google");
    stringList.add("lenovo");
    System.out.println("-------排序前-------");
    for(String s : stringList) {
        System.out.println("元素:" + s);
    }
    Collections.sort(stringList);
    System.out.println("-------排序后-------");
    for(String s : stringList) {
        System.out.println("元素:" + s);
    }

      从首个字符开始比较,若首字符相同,则比较第二个字符,以此类推。

      顺序为:0~9、大写字母、小写字母。

    4.3 对其它类型的List进行排序

      由于sort方法的定义(可自行参照官方文档,使用sort方法均需实现Comparable或Comparator接口),对自定义的类进行排序时,需让该类实现Comparable接口,否则将出现编译错误。

    5. Comparable接口

      实现接口时需指定与List相同的泛型,同时实现compareTo方法。

    a.compareTo(b),若返回正整数,则a>b,若返回0,则a等于b,若返回-1,则a<b。

    6. Comparator接口

      实现接口时需指定与List相同的泛型,同时实现compare方法。
    通过

    sort(List<T> list, Comparator<? super T> c)

    使用。

      compare(a, b),若返回正整数,则a>b,若返回0,则a等于b,若返回-1,则a<b。

  • 相关阅读:
    Java相对路径读取文件
    【转载】 OpenCV ——双线性插值(Bilinear interpolation)
    【转载】 从ACM会议看中国大陆计算机科学与国外的差距
    【转载】 一个老博士的经验顺口溜! 研究生生活的精华总结!
    【转载】 研究生生活总结(2):从技术到研究再到技术的过程
    【转载】 研究生生活总结(1):当助教的那些人和事
    【转载】 如何看待 2019 年 CS PhD 现扎堆申请且大部分为 AI 方向?未来几年 AI 泡沫会破裂吗?
    【转载】 深度强化学习处理cartpole为什么reward很难超过200?
    【转载】 强化学习中 采用 【首次访问的蒙特卡洛预测法】 的算法描述
    【转载】 混合智能
  • 原文地址:https://www.cnblogs.com/yujihaia/p/7468143.html
Copyright © 2020-2023  润新知