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 |