201521123108 《Java程序设计》第7周学习总结
1. 本周学习总结
2. 书面作业
Q1.ArrayList代码分析
Q1.1 解释ArrayList的contains源代码
答:源代码如下:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
解释:contains实现遍历ArrayList,indexOf函数返回值为序号,如果o为null则没有equals方法
Q1.2 解释E remove(int index)源代码
答:源代码如下:
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
解释:检测删除的位置是否超出List大小,如果超出则显示异常。类似数组删除操作,删掉某个元素后,其位置之后的元素前移。
Q1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
答:需要考虑,由1.1可知某些类型的类中会覆盖Object类中的方法以满足自身需求,所以不同类型调用时可能会有不同结果。
Q1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
答:add方法会在末尾追加一个元素,并增加数组总数。ArrayList的add方法会在已存在的定长的集合中添加元素,当集合装满了即内部数组容量不够时,会在添加元素之前进行扩容。
Q1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
答:rangeCheck()方法保证index在ArrayList长度范围之内(index < size()),并在越界时抛出IndexOutOfBoundsException异常。所以它是私有的内部方法,只可被ArrayList中的方法如get,remove调用,所以声明为private。
Q2.HashSet原理
Q2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
答:当从HashSet中访问元素时,HashSet先计算该元素的hashCode值,然后到该hashCode对应的位置取出该元素。要调用equals和hashCode方法。
Q2.2 选做:尝试分析HashSet源代码后,重新解释1.1
使用HashSet中的contain方法那和List中的contain方法的速度简直不可同日而语,
public boolean contains(Object o) {
return map.containsKey(o);
}
List中是遍历而HashSet是利用hashCode快速查找到并利用equals进行比较,当比较值为真则覆盖原来的值若是假则插入到hash桶中。
Q3.ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
Q3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
答:5-1中的ArrayListIntegerStack不需要定义数组的大小,list可以对初始容量赋值,而在5-3中的ArrayIntegerStack就需要自己定义数组的大小,需要指针。
Q3.2 简单描述接口的好处.
答:接口可以做到相同方法,不同实现。拿3.1来举例,ArrayListIntegerStack和ArrayIntegerStack两个类都继承了一个IntegerStack接口。这样可以使用一个接口来操作不同的类。ArrayListIntegerStack和ArrayIntegerStack两个类都有pop()方法,但是实现pop()方法不同。这样我们修改ArrayListIntegerStack的pop()方法而不影响ArrayIntegerStack的pop方法。
Q4.Stack and Queue
Q4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
答:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
interface StringStack{
public String push(String item);//如item为null,则不入栈直接返回null。如栈满,也返回null.
public String pop();//出栈,如为空,则返回null.
}
class ArrayListStringStack implements StringStack{
private List<String> list;
public ArrayListStringStack() {
list=new ArrayList<String>();
}
@Override
public String push(String item) {
// TODO Auto-generated method stub
if(item==null)
return null;
list.add(item);
return item;
}
@Override
public String pop() {
// TODO Auto-generated method stub
if(list.isEmpty())
return null;
return list.remove(list.size()-1);
}
}
public class Main201521123108 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
StringStack stack=new ArrayListStringStack();
String m=sc.next();
int f=1;
for(int i=0;i<m.length();i++)
{
stack.push(String.valueOf(m.charAt(i)));
}
for(int i=0;i<m.length();i++)
{
if(String.valueOf(m.charAt(i)).equals(stack.pop()))f=1;
else
{
f=0;
break;
}
}
if(f==1)System.out.println("true");
else System.out.println("flase");
}
}
Q4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)
答:
Set<String> strset=new TreeSet<String>();
for(i=0;;i++){
str=in.next();
if(str.equals("!!!!!")) break;
else strset.add(str);
}
for(String s:strset){
x=x+1;
System.out.println(s);
if(x==10) break;
}
Q5.统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
Q5.1 实验总结
答:str=in.next();//输入的文本以空格分开将单词存入,输入方式,不能用in.nextLine()
Set
实验总结:统计文本出现的词汇并存储,此时要想到Set,Set集合的对象是不重复的,但要是对对象进行排序,需要的是TreeSet,TreeSet具有排序功能,HashSet可以用作无序的词汇存储,因而本题不使用HashSet
Q6.选做:加分考察-统计文字中的单词数量并按出现次数排序**
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
Q6.1 伪代码
Q6.2 实验总结
Q7.面向对象设计大作业-改进
Q7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
Q7.2 使用集合类改进大作业
3. 码云上代码提交记录及PTA实验总结
Q3.1. 码云代码提交记录
Q3.2. PTA实验
编程(5-1, 5-2, 5-3(选做), 5-6)
实验总结已经在作业中体现,不用写。