1. 本周学习总结

2. 书面作业

ArrayList代码分析

1.1 解释ArrayList的contains源代码

答:ArrayList的Contains的源码如上图所示,如果o为null,那么就去找elementData数组是否有为null的对象,如果有则返回下标,没有则返回-1。如果o不为null,就通过equals去比较elementData数组中的元素是否有与o相同的对象,如果有则返回下标,没有则返回-1。这里判断 o==null主要就用来确定是否要使用 o.equals(),最终contains方法就是如果有包含这个元素泽返回ture,否则返回false。

1.2 解释E remove(int index)源代码

答:E remove(int index)源代码如上图所示,先判断是否越界,然后获取从要移除的元素index开始到最后一个元素的个数,再将elementData数组index+1位置开始复制到elementData从index开始的空间,最后使数组的size减1,最终remove方法会返回要移除的那个数。

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

答:不用考虑,ArrayList存储的数据都要是引用类型,而且ArrayList存储数据实际上是用Object的数组,之前有说过Object类是所有类的默认父类,所以除了基本类型就不需要考虑存储元素的类型了。

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



答:add是在list的末尾进行操作的,ensureCapacityInternal()确保数组有空间给新加进来的元素,如果需要加进来的空间比当前的空间大的话,就会使用grow()方法来进行扩容,grow中的Increases the capacity to ensure that it can hold at least the number of elements specified by the minimum capacity argument.(增加能力以确保它能够容纳至少由最小容量参数指定的元素数量。)说明add内部数组容量不够时可以扩大容量直到可以满足条件为止。

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

答:因为该方法只是用来判断给定的索引是否在范围内,有没有越界,外部并不需要访问它,更不能修改它,只需要知道结果就好,所以声明为private即可。

HashSet原理

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

答:向散列表中插入一个新元素时,首先会调用hashCode()方法得到相应的散列码,根据散列码,决定存储位置,除此之外,Set中的元素是唯一的,所以要使用equals()方法确保对象的唯一性,若equals()方法返回值为假,则把新元素插入散列表中,如果返回值为真,则用新的元素替换旧的值。

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

ArrayListIntegerStack

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

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

答:这次的是使用ArrayList来实现的,上次的是使用Integer数组来实现的。上次的push和pop都需要用到top指针,这次的需要用到remove。
public Integer pop() {	//ArrayListIntegerStack
    if(list.isEmpty())
        return null;
    return list.remove(list.size()-1);
}
public Integer pop() {  //ArrayIntegerStack
		top--;
		if(top==-1){
			top++;
			return null;
		}	
		return array[top];
	}

3.2 简单描述接口的好处.

答:接口本身只是定义了几个方法,没有实际意义,具体的实现是要在实现它的类中进行的,比如ArrayListIntegerStack和ArrayIntegerStack这两个类都实现了IntergerStack这个接口,但是它们中间的一些实现方法不同,如上题说到的push和pop方法不同,修改一个类中的push方法并不会影响到另一个类中的push方法,这就是接口的好处。

Stack and Queue

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

public class Main201521123039 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		StringStack s = new ArrayListStringStack();
		String str = input.next();
		int a = 1;
		for (int i = 0; i < str.length(); i++) {
			s.push(String.valueOf(str.charAt(i)));//把输入的字符串分成一个个字符存入栈
		}
		for (int j = 0; j < str.length(); j++) {
			if (String.valueOf(str.charAt(j)).equals(s.pop()));//出栈的结果和入栈的相比较
			else
				a = 0;//如果出栈和入栈的结果不同,则把0赋值给a,否则a值不变
		}
		if (a == 1)
			System.out.println("该字符串是回文!");
		else
			System.out.println("该字符串不是回文!");
	}

}

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

while(!qa.isEmpty()){
			if(!qa.isEmpty()){
				qc.add(qa.poll());
				qc.add(qa.poll());
			}
			if(!qb.isEmpty())
				qc.add(qb.poll());
		}
		while(!qc.isEmpty()){
			int j=0;
			if(j<qc.size()-1){
				System.out.print(qc.poll()+' ');
				++j;
			}
			else
				System.out.print(qc.poll());
		}

题目要求A窗口处理完2个,B窗口才处理完一个,为了方便输出,先把2个队列合并为一个再输出,最后一定要注意不要留有空格!

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

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

while(input.hasNext()){
			String str=input.next();
			if(str.equals("!!!!!"))
				break;
			if(!list.contains(str))
				list.add(str);
		}
		System.out.println(list.size());
		Collections.sort(list);

5.1 实验总结

总结:一开始写的时候没有考虑重复的单词,所以没使用contains方法,直接使用数组,最后统计出来的是所有的单词数量为60。

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

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

6.1 伪代码

if(映射表中有这个单词)
    n加1;
else
    map.put(该单词);
sort(映射表);
输出map.size;
输出排名前10的单词及数量;

6.2 实验总结

总结:当时没注意Map<String, Integer>的String和Interger的顺序,所以在写sort函数的时候,在Comparator上出了问题,后来解决了。

面向对象设计大作业-改进

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

7.2 使用集合类改进大作业

3.1. 码云代码提交记录

我的码云好像出了问题了。。。提交就会出现下面的提示

3.2. PTA实验

实验总结已经在作业中体现,不用写。