第八次作业
1. 本周学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

2. 书面作业
1. ArrayList代码分析
1.1 解释ArrayList的contains源代码
public boolean contains(Object o) {
return indexOf(o) >= 0;
} //判断动态数组中是否存在"o"元素
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i] == null)
return i;
} //返回第一次当o == null时元素的位置
else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
} //返回数组中第一次与o相同的元素的位置
return -1;
}
- 根据输入的参数o判断和遍历ArrayList动态数组时使用该方法
1.2 解释E remove(int index)源代码
public E remove(int index) {
rangeCheck(index);//检查索引范围
modCount++;//记录ArrayList结构性变化的次数
E oldValue = elementData(index);//将被删除元素放入oldValue
fastRemove(index);
return oldValue;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)//删除的不是最后一个元素时
System.arraycopy(elementData, index + 1, elementData, index,numMoved);//删除元素到最后的一个元素整块向前移
elementData[--size] = null;
}
- 删除指定索引位置index下的元素,返回被删除的元素,删除指定的元素之后,再将删除位置之后的元素整块向前移
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的具体类型吗? - 不需要考虑元素的具体类型,因为ArrayList存储数据时可以把类型转换为Object类,目前所学的对象基本都是Object类的,所以往里面添加不同数据类型的元素一般不会出错。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办? - 当内部数组容量不够时,使用ensureCapacity()方法扩容
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity=elementData.length;//获取当前数组的容量
if (minCapacity > oldCapacity) { //内部数组容量不够时,执行扩容
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)//如果扩容后的新容量还是没有传入的所需的最小容量大或等于最小容量
newCapacity = minCapacity; //将新容量设置为最小容量
elementData = Arrays.copyOf(elementData, newCapacity); //复制新容量
}
}
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size);//抛出异常
}
- 用来判断是否超出界限,这个方法仅限在类内部使用,是程序内部自动检查的方法,不能被外界篡改,就应该使用private而不是public。
2. HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
- 存储位置:当向HashSet中添加一个元素时,HashSet会调用hashCode()方法然后得到hashCode的值,根据hashCode值找到对应的列表,即决定该对象的存储位置;但如果列表中已经存在其他元素,就调用equals()方法与那个数进行比较,如果返回假,就将该元素插入到列表中,如果返回真,则把旧值替换成新值。(hashCode的值也应相等,要不然会被存储在不同的位置)
- 调用的方法:hashcode()和equals()
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数) - 直接计算出地址,然后再逐个比较,时间复杂度为O(1)
3. ArrayListIntegerStack
题集jmu-Java-05-集合之ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
jmu-Java-05-集合之ArrayListIntegerStack
public ArrayListIntegerStack(){
list = new ArrayList<Integer>();
}
在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack
private int top=0;
public ArrayIntegerStack(int capacity){
this.arr = new Integer[capacity];
}
- 在
ArrayListIntegerStack中的数组不需要定义大小,自身可以给予初容量和扩容,而口ArrayIntegerStack要对数组的大小进行自定义,并且在输出、输入或删除等操作要借助top指针来完成。
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。 - 我们定义类时实现某个我们定义的接口,如果我们需要使用其他的类时,我们只需要再重新调用该接口然后引用了另一个类就可以了,这样减少代码量,使用起来也灵活。接口也弥补了类不能多继承的缺点,一个类可以实现多个接口,一个接口也可以在多个类上实现。
4. Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈(请利用Java集合中已有的类),但不能使用java的Stack类(具体原因自己搜索)与数组。请粘贴你的代码,类名为Main你的学号。

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

- 采用了LinkedList实现类
5. 统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (作业中不要出现大段代码)
5.1 实验总结
- 要统计单词数的话,可以使用Set来进行统计,而且它有个特点是不重复,我使用的TreeSet来进行统计。
![]()
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)


3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。

| 周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 |
| 2 | 492 | 492 | 10 | 10 |
| 3 | 435 | -57 | 6 | -4 |
| 4 | 0 | 0 | 0 | 0 |
| 5 | 312 | -123 | 8 | 2 |
| 6 | 525 | 213 | 7 | -1 |
| 7 | 236 | -289 | 3 | -4 |
| 8 | 305 | 69 | 3 | 0 |
| 9 | 183 | -122 | 5 | 2 |

浙公网安备 33010602011771号