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方法后,就无需我们完成排序操作了,那么只需要完成输出前十单词和统计单词数量就可以了

3.1. 码云代码提交记录

posted @ 2017-04-08 16:13  forgetaboutJ  阅读(235)  评论(0编辑  收藏  举报