zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/joahyau/p/6419687.html
Copyright © 2011-2022 走看看