Java第10章作业:集合框架

Java集合框架的整体概览图:

如下(摘自w3school Java集合框架
在这里插入图片描述
上图中,MapCollectionIterator是三个接口,ListSetCollection接口的子接口,ArrayListLinkedList是实现了List的类,HashSetTreeSet是实现了Set接口的类,HashMapTreeMap是实现了Map接口的类。

Collection接口的常用方法:

方法描述
boolean add(Object c)向集合类中添加一个新元素,返回值表示集合的内容是否改变了(就是元素有无数量、位置等变化)
boolean addAll(Collection<? extends E> c)将c所引用集合对象中的所有对象加入现有集合中。
boolean remove(Object o);从集合类中删除一个指定对象的引用。
boolean removeAll(Collection c);从本集合中删除参数c所引用集合对象中的所有对象。
boolean retainAll(Collection c)保留本集合中参数c所引用集合对象中的所有对象。(取交集)
Iterator< E > iterator()通过该方法返回一个实现Iterator接口的对象,之后可利用该对象对集合类对象进行遍历。
Object[] toArray()将集合中的所有元素以数组对象引用形式返回。
Object[] toArray(Object[] a)首先,将集合的所有元素以对象数组的形式来描述,且类型与参数a的类型是相同的。例如,String[] o = (String[])c.toArray(new String[0]);得到的o实际类型是String[]。其次,如果参数a的大小装不下集合的所有元素,返回的将是一个新的数组;如果参数a的大小能装下集合的所有元素,则返回的还是a,但a的内容用集合的元素来填充;如果填充后a还有剩余,则剩余部分全部被置为null

Map接口的常用方法

方法描述
V put(K key, V value)将key和value存入Map对象中,若该key对应的值已存在于Map中,则用value替换该值并返回旧的值
V get(Object key)获取key对应的value
Set< K > keySet()返回Map对象所有的键,不能包含重复元素
Collection< V > values()返回Map对象的所有的值
public Set<Map.Entry<K,V>> entrySet()返回一个Set,Set中的每一个元素都代表了Map中的一个独立的关键字/值对,其操作由Map.Entry接口规定

作业题

书上的7个题所考察的知识点之间各有重叠,因此此处按照知识点的前后逻辑顺序来作答。

第一题:Map、Collection、Iterator之间的关系如何?

Map是以键值对的形式存储数据,可以通过该接口的values方法获得一个Collection接口,也可以通过MapkeySet方法获取Collection接口的子接口Set
Collection中所存储的是一种线性元素集合,可以通过其iterator方法获取一个Iterator接口,从而实现Collection的实现类中元素的遍历;
Iterator接口通过hasNext方法来判断当前迭代是否还有后续元素,通过next方法获取下一个元素。

第二题:遍历一个集合对象有哪些方法?

for循环,调用get方法
foreach语句
使用Iterator接口实现向后遍历,ListIterator接口实现向前遍历;
使用Enumeration接口(该接口已被Iterator接口替代)

第三题:Vector与ArrayList、LinkedList与ArrayList、Hashtable与HashMap、TreeMap与HashMap之间的共同点和区别是什么?

  1. Vector与ArrayList:在这里插入图片描述

  2. LinkedList与ArrayList:
    在这里插入图片描述

  3. Hashtable与HashMap
    在这里插入图片描述

  4. TreeMap与HashMap
    在这里插入图片描述

第四题:同数组相比,Vector有何特点?

Vector在创建时不需要指定元素个数,并且可以自动扩容,而数组则无法自动扩容。

第五题:现需要选择集合类,它存储的对象集合可以被多个线程维护(增加、删除),请问应该选择什么样的集合类,为什么?如果多个线程只是读取,而不维护,应该选择什么样的集合类,为什么?

  1. 线程安全的集合类(同步):
    Collection:Vector
    Map:Hashtable, ConcurrentHashMap

  2. 线程不安全的集合类(异步):
    Collection:ArrayList, LinkedList
    Map:HashMap,

第六题:Collection和Collections各自的功能是什么?

Collection是一个接口,其定义了集合所需要具备的属性和方法,Collections是一个类,其包含了许多对集合进行操作的方法。

第七题:如何实现集合对象排序?定义一个复数类并按照复数的实部大小对复数对象进行排序。

实现Comparator接口并覆盖其compare方法来对集合对象进行排序,
compare方法声明:int compare(Object o1, Object o2);
返回值是-1,0或1,-1表示o1在o2前面,1表示o1在o2后面;

排序代码示例:

        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(10);
        list.add(-2);
        list.add(20);
        System.out.println(list); // [3, 10, -2, 20]

        // 使用Collections.sort排序,默认升序排序
        Collections.sort(list);
        System.out.println(list); // [-2, 3, 10, 20]

        // 使用Comparator接口,降序排序
        Collections.sort(list, new Comparator<Integer>(){
            public int compare(Integer i1, Integer i2){

                return i2 - i1; // 
            }
        });

        System.out.println(list);

第八题(补充题):编写程序测试Java集合框架中各种常用类的基本操作(包括添加元素,删除元素,遍历集合元素等)

  1. ArrayList
    public static void testArrayList() {
        /** 测试ArrayList的常用方法 */
        List<Integer> list = new ArrayList<Integer>();

        // 增加元素
        list.add(10);
        list.add(20);

        // 遍历集合并打印
        Iterator<Integer> iterator;
        iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }

        // 删除元素
        list.remove(Integer.valueOf(10)); // 这里不能用list.remove(10),因为remove的参数类型是Object,是一个对象,而基本数据类型不是对象
        list.add(30);
        list.remove(Integer.valueOf(30)); // 同上
        iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }


    }

  1. LinkedList
    public static void testLinkedList() {
        /** 测试LinkedList的常用方法 */
        LinkedList<String> list = new LinkedList<String>();

        // 增加元素
        list.add("10");
        list.add("20");

        // 遍历集合并打印
        Iterator<String> iterator;
        iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }

        // 删除元素
        list.remove("10"); 
        list.add("hello");
        list.remove("20"); 
        iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }

        // LinkedList的addFirst, addLast, removeFirst, removeLast
        System.out.println(list); // [hello]
        list.addFirst("f1");
        list.addFirst("f2");
        System.out.println(list); // [f2, f1, hello]

        String tmp;
        tmp = list.removeLast();
        System.out.println(tmp);
        tmp = list.removeFirst();
        System.out.println(tmp);
        System.out.println(list); // [f1]
    }
  1. HashMap和TreeMap的操作(增加元素与遍历):
    以下代码中用的是HashMap,TreeMap与其操作一样。
        // 增加元素
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("10/31/01", "Halloween");
        map.put("01/01/01", "New Years");

        // 遍历map中的键值对
        //1 keySet遍历
        Set<String> keySet = map.keySet();
        Iterator<String> iter;
        String k, v;

        iter  = keySet.iterator();
        while (iter.hasNext()) {
            k = iter.next();
            v = map.get(k); // 根据key来取出value
            System.out.println("key = "+k+", value = "+v);
        }

        //2 entrySet遍历
        Set<Map.Entry<String, String>> entries = map.entrySet();
        Iterator<Map.Entry<String, String>> iterEntry = entries.iterator();
        Map.Entry<String, String> anEntry;
        while (iterEntry.hasNext()) {
            anEntry = iterEntry.next();
            k = anEntry.getKey();
            v = anEntry.getValue();
            System.out.println("key = "+k+", value = "+v);
        }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值