java第8次作业

1. 本周学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

ArrayList的contains方法是比较是否包含某元素,contains的源代码(源代码如下)调用了indexOf()方法,返回indexOf(o) >= 0

  • indexOf()方法的执行内容:遍历该ArrayList,找到与o参数相等的元素则返回该元素的位置,如果找不到就返回-1;
  • contain(Object o)方法:其返回了indexOf(o) >= 0,如果indexOf(Object o)的返回值大于等于0返回true,如果为-1返回false。
1.2 解释E remove(int index)源代码

源代码如下,E remove(int index)一开始首先调用了rangeCheck(int index)方法,判断该位置是否超出范围,超出就抛出异常。如果未超出就,int numMoved = size - index - 1;为被删除元素后面的元素个数,如果个数大于0,就将index位置后的元素全部往前移动一位,然后用elementData[--size] = null;将数组大小减一,将最后一个位置置为null。

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

不需要考虑元素的具体类型,因为ArrayList的数组数据类型是Object类型,所以说明所有类型都能用。

1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

当容量不够时,add会将数组的容量+1,使数组容量足够使。

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

rangeCheck(int index)(源代码如下)方法是,判断指定位置index是否超出size的大小,如果超出,则抛出IndexOutOfBoundsException异常。用户不需要知道rangeCheck方法如何实现,只需要知道结果就行,所以声明为private。

2. HashSet原理

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

HashSet内部使用一个HashMap保存数据。其中add方法中使用Map.put方法来将元素加入内部的map中,put方法使用hash方法来确定元素保存位置。

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)

不是,添加元素的时候不需要遍历,HashSet只需要通过位置就可以把元素进行添加,所以O(1)。

3. ArrayListIntegerStack

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

3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
  • 相同之处
    IntegerStack接口:
    interface IntegerStack {
    public Integer push(Integer item);
    public Integer pop();
    public Integer peek();
    public boolean empty();
    public int size();
    }
  • 不同之处:ArrayListIntegerStack内部实现用ArrayList列表,ArrayIntegerStack内部实现用Array数组。重写各种方法时,用数组进行实现的时候经常需要考虑是否越界的问题,用列表的时候就不用,省了很多事。
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。

好处:例如此题用到了接口IntegerStack,我们可以写一个类去实现这个接口里的方法,这个类可以是用列表实现的(如题jmu-Java-05-集合之ArrayListIntegerStack),也可以是数组实现的(如题jmu-Java-04-面向对象2-进阶-多态、接口与内部类),当我们写好main函数之后,因为我们利用了接口IntegerStack接口,所以我们改变了输入的数据类型后(比如从列表改为数组),main函数不需要修改,这就是接口的好处。

4. Stack and Queue

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


4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?

答:Queue接口用的LinkedList(链表)实现类。
银行业务模拟有两个主要部分:

  • 1、编号为奇数的“顾客”存入到A队列,为偶数的“顾客”存入B队列。
  • 2、按A队列出两个,B队列出一个的规则输出队列的元素(代码如下),注意末尾不能留空格,除了下方代码之外,还要记得多加两个循环,输出A队和B队内的元素,确保A队和B队中的元素都输尽了,同样也要注意空格的问题。

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

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

5.1 实验总结

这题主要是利用TreeSet可以对加入其中元素进行排序的特点,对英语单词进行排序。此外要注意题目要求,题目要求是只输出前十个的单词。按照题目要求可先用语句Set<String> set = new TreeSet<String>();建立一个TreeSet,然后用set.add()把键入的文本输入到set中,最后按照字母排序从set中输出前十个单词就行了。

3.码云及PTA

题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

周次 总行数 新增行数 总文件数 新增文件数
1 115 115 17 17
2 421 306 24 7
3 698 277 30 6
5 1085 387 38 8
6 1497 412 48 10
7 2033 536 57 9
8 2265 232 60 3
9 2787 522 65 5
posted @ 2017-11-10 22:52  学java真开心  阅读(200)  评论(1编辑  收藏  举报