201521123028 《java程序设计》 第7周学习总结
1. 本周学习总结
2. 书面作业
Q1.ArrayList代码分析
1.1 解释ArrayList的contains源代码
Ans:
ArrayList的contains源代码
contain源代码中有这么一行
* @return <tt>true</tt> if this list contains the specified element //翻译过来就是“列表中包含指定的特殊元素时,返回True”
即“当且仅当此列表包含至少一个满足 (onull ? enull : o.equals(e)) 的元素 e 时,则返回 true。”
1.2 解释E remove(int index)源代码
Ans:
图示为E remove(int index)源代码:
删除数组中指定位置的元素,然后将该元素后的元素前移。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
Ans:
不需要考虑,此处ArrayList的存储数据类型是Object类,是所有类型父类,因此可以考虑不同的类型,都可以在此之中转换。
答:不用考虑,因为其参数为Objcet类型的对象,Object类又是所有类的父类。也就是说时不需要考虑元素的类型,随便放什么类型进去都可以转换类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
Ans:
当内部容量不够时,会将原来的数组元素复制到新的更大的数组,然后将ArrayList的引用指向新的数组。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
Ans:
对使用用户而言,只需要得到remove的结果而不需要知道实现方式。所以此处用private。
Q2.HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
Ans:
HashSet(散列集)的存储形式为链表加上数组的存储形式。
将元素加入HashSet中时,会先调用元素的HashCode()方法,得到元素的HashCode值,由该值的不同确定不同的存储位置。
若表中已有其他元素,则调用加入对象的equals()方法与表中元素进行比较。如果比较结果为false,则将对象插入表中。如果比较结果为true,则用新的值替换旧的值。
Q3.ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
Ans:
①同样是栈,但栈的实现方法不同,ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。
②同样是栈,但是应对栈满的解决方法不同,ArrayItegerStack会直接栈满,而ArrayListIntegerStack像Q1.4说的一样,可以创建新数组扩充容量。
3.2 简单描述接口的好处.
Ans:
可以做到相同方法,不同实现。
例如3.1中的ArrayListIntegerStack和ArrayIntegerStack都继承了同一个方法,即IntegerStack,也就是说我们修改它们的实现,都不会影响他们完成的方法。
Q4.Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
import java.util.*;
interface StringStack{
public String push(String item);
public String pop();
}
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 Main201521123028{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sca=new Scanner(System.in);
StringStack stack=new ArrayListStringStack();
String s=sca.next();
int j=1;
for(int i=0;i<s.length();i++)
{
stack.push(String.valueOf(s.charAt(i)));
}
for(int i=0;i<s.length();i++)
{
if(!String.valueOf(s.charAt(i)).equals(stack.pop()))j=0;
else j=1;
}
if(j==1)System.out.println("true");
else System.out.println("flase");
}
}
Q5.统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
5.1 实验总结
Ans:使用代码注释说明一下比较重要的程序段
TreeSet<String> strset=new TreeSet<String>();//使用Set方法,会默认将元素排序,因此无需手动排序
//输入单词,若输入不为"!!!!!"则继续输入
for(i=0;;i++){
str=in.next();
if(str.equals("!!!!!")) break;
else strset.add(str);
}
当使用Set方法后,就无需我们完成排序操作了,那么只需要完成输出前十单词和统计单词数量就可以了