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 strset=new TreeSet();//用Set来存储,但HashSet只是无重复的存入单词,无序,此时需要用TreeSet,TreeSet具有排序功能reeSet
实验总结:统计文本出现的词汇并存储,此时要想到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)
实验总结已经在作业中体现,不用写。

posted @ 2017-04-08 19:18  无人的龙之御币  阅读(140)  评论(0编辑  收藏  举报