第7周-集合

1. 本周学习总结

1109200-20170408142618941-899249728.png

1.1 List接口

——按照索引位置排序,可以有重复对象;允许按照索引位置检索对象
具体实现类:
  • ArrayList—采用长度可变的数组;允许对元素进行快速的随机访问。(随机读取快)
  • LinkedList—采用链表;单独具有可以作为堆栈、队列和双向队列使用的方法。(插入、删除快)

1.2 Set接口

——不按特定方式排序,没有重复对象;有些实现类能对集合中对象按特定方式排序
具体实现类:
  • HashSet—按照哈希算法来存取集合中的对象,存取速度比较快。(子类:LinkedHashSet类-提高插入删除元素的性能)
  • TreeSet—实现了SortedSet接口,具有排序功能。

1.3 Map接口(映射表)

——每一个元素包含一对键对象(key)_不重复和值对象(value)_可重复;有些实现类能对集合中的键对象进行排序
具体实现类:
  • HashMap—按照哈希算法来存取键对象。
  • TreeMap—实现了SortedMap接口,能对键对象进行排序(自然排序与客户化排序)。

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

Answer

源代码:

1109200-20170408130513816-2038212726.png

如果列表中包含指定元素(下标>=0),则返回true;否则,(在indexOf中可以看到列表不包含指定元素返回-1)在contains()中返回false。
1.2 解释E remove(int index)源代码

Answer

源代码:

1109200-20170408133606691-422599986.png
1109200-20170408133522410-544533411.png
1109200-20170408144105800-2146097897.png

作用:移除列表中的指定元素,若不包含指定元素列表不变,若包含指定元素则返回true。
(1) rangeCheck():顾名思义就是判断是否超出size,超出就抛出异常。
(2) modCount:"已从结构上修改此列表的次数-更改列表大小从而使正在进行的迭代产生错误的结果",也就是用来判断add()或者remove()等操作是否改变了列表的结构,若改变了就抛出异常(ConcurrentModificationExceptions)。
(3) arraycopy:从指定源数组中复制一个数组,从index+1到index,即元素前移。
(4) 最后返回被删除的元素。(clear(size-1)的空间,"let GC do its work")
>> GC:计算机用语为垃圾回收(Garbage Collection),用于回收内存空间。

Garbage Collection

1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?

Answer

我认为不需要,只要不是存放基本数据类型。因为ArrayList<>中放入对象的类型直属于父类Object。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

Answer

源代码:

1109200-20170408152226941-484029426.png

(1)ensureCapacityInternal确保容量为size+1;

1109200-20170408152346550-953355148.png

(2)如果elementData是默认长度的空数组的话(DEFAULTCAPACITY_EMPTY_ELEMENTDATA),那么数组容量是默认长度(DEFAULT_CAPACITY)和传入参数的最大值;
(3)容量还是不够用的话,使用grow()方法增加容量;

1109200-20170408152508207-700859364.png

(4)int newCapacity = oldCapacity + (oldCapacity >> 1);扩展容量为原来的一半(右移一位),即原来的1.5倍;
(5)elementData = Arrays.copyOf(elementData, newCapacity);将旧的数组数据复制到新容量的数组中。

1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

Answer

(源代码在分析remove的时候已经贴过了,不重复。)
这个应该涉及之前学的封装性吧。作者认为用户没有必要也不可以修改rangeCheck()方法,用户只需要知道这个方法并会使用就可以了;还可以避免使用时不小心更改的情况。

2. HashSet原理

2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?

Answer

(引用PPT)散列表用链表数组实现,每个列表被称为桶。
1109200-20170408161345238-232885982.png

元素加入HashSet中则会调用hashCode()取得哈希码,并尝试放入对应的桶中;桶中没有对象就直接放入,有对象就要调用equals()进行比较;若为false则不是重复对象,可收集,若为true,则不予收集。  ****这里放上一个草图:

1109200-20170408164214816-2091226249.png

2.2 选做:尝试分析HashSet源代码后,重新解释1.12.1

Answer

源代码:

1109200-20170408162620238-720751716.png
本质是HashMap...(待续)

3. ArrayListIntegerStack

题集jmu-Java-05-集合之5-1 ArrayListIntegerStack

3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)

Answer
(1)实现形式:ArrayListIntegerStack使用动态数组;ArrayIntegerStack使用数组。
(2)关于栈满:ArrayIntegerStack会出现栈满的情况,因为它不可以自动扩容(入栈考虑是否栈满);ArrayListIntegerStack中动态数组会自动扩容。
1109200-20170408170842957-1430349201.png

3.2 简单描述接口的好处

Answer
(1)灵活:同样的接口,不同的实现方法。(ArrayListIntegerStack与ArrayIntegerStack都实现了IntegerStack接口)
(2)可扩展:上述例子看来,IntegerStack接口还可以有更多的实现方法,只要根据需求定义抽象类的话。
(3)节省空间,提高效率。

4. Stack and Queue

4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。

Answer
我的部分代码:

public class Main201521123094 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Stack ch = new Stack();
        String str1 = new String();
        while (in.hasNext()) {
            String str = in.next();
            for (int i = 0; i < str.length(); i++) {
                ch.push(str.charAt(i));
            }
            str1 = "";
            for (int i = 0; i < str.length(); i++) {
                str1 += ch.peek();
                ch.pop();
            }
            if (str1.equals(str)) {
                System.out.println("是回文");
            } else {
                System.out.println("不是回文");
            }
            if(str.equals("!!")) break;
        }
        in.close();
    }

}

运行结果:
1109200-20170409103031347-1389711994.png

不能使用java的Stack类原因:效率慢

4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)

Answer

利用队列分别根据奇偶入队,注意Queue是接口,要用其具体方法。

5. 统计文字中的单词数量并按单词的字母顺序排序后输出

题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)

5.1 实验总结

Answer
1109200-20170408202658894-891226601.png

这题犯的错误是没有注意"!!!!!"也是字符串,要排除在外;使用TreeSet进行排序,迭代器进行排序后的输出。

6. 选做:加分考察-统计文字中的单词数量并按出现次数排序(待)

题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)

6.1 伪代码

Answer

6.2 实验总结

Answer

7. 选做加分:面向对象设计大作业-改进

7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

Answer
尝试使用表格界面(代码未完全实现)

1109200-20170408200311582-1336373684.png
1109200-20170408201953910-50620354.png

7.2 使用集合类改进大作业(待)

3. 码云上代码提交记录及PTA实验总结_题目集:jmu-Java-05-集合

3.1. 码云代码提交记录(在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图)

1109200-20170408202523144-1871337635.png

3.2. PTA实验——实验总结已经在作业中体现,不用写

编程5-1,编程5-2,编程5-3(选做),编程5-6

转载于:https://www.cnblogs.com/whting/p/6664311.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值