1. 本章学习总结

2. 书面作业

Q1.ArrayList代码分析

1.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;
}

作用是验证该ArrayList中是否包含某个对象,由indexOf(Object o)返回第一个出现的元素o的索引,如果不存在,则返回-1。

1.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;
}

remove(int index)不需要遍历数组,只需要判断索引符合范围即可。作用是检测删除的位置是否在List的范围内,若超出则显示异常。具体操作类似数组的删除操作,即删掉某个元素后,在其位置之后的元素前移。

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

不需要考虑,因为ArrayList中参数的类型是Object类型。

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

  public void add(int index, E element) {
    //检查index是否在已有的数组中
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size);
    ensureCapacity(size + 1);//确保对象数组elementData有足够的容量,可以将新加入的元素e加进去
    System.arraycopy(elementData, index, elementData, index+1, size-index);//将index及其后边的所有的元素整块后移,空出index位置
    elementData[index] = element;//插入元素
    size++;//已有数组元素个数+1
}

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

rangeCheck方法保证了remove等操作需在容量范围内,用private修饰可以不被外界任意修改调用

Q2.HashSet原理

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

当向HashSet中添加一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据该值决定该对象的存储位置,但是如果有两个元素通过equals()方法比较返回true,而它们的hashCode()方法返回值不等,HashSet也会将它们存储在不同的位置。

Q3.ArrayListIntegerStack

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

前者使用了ArrayList的动态数组,直接使用ArrayList内部的方法而不需要判断是否栈满,后者是已经定义了数组的长度,仅就是对数组的操作

3.2简单描述接口的好处.

接口可以达到统一访问,在创建对象的时候用接口创建,即用哪个类的对象就可以new哪个对象,不需要改原来的代码

Q4.Stack and Queue

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

public class Main201521123019 {
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    StringStack stack=new ArrayListStringStack();
    
    String hw=sc.next();
    boolean flag = true;
    for(int i=0;i<hw.length();i++)
    {
        stack.push(String.valueOf(hw.charAt(i)));
    }
    for(int i=0;i<hw.length();i++)
    {
        if(String.valueOf(hw.charAt(i)).equals(stack.pop()))
            {
            flag=true;
            }
        else
        {
            flag=false;
            break;
        }
    }
    if (flag) {
        System.out.println("是回文");
    } else {
        System.out.println("不是回文");
    }
    }

}

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

while(!A.isEmpty() || !B.isEmpty())
    {
        Integer a1 = A.poll();
        if(a1 != null){
            if(B.isEmpty() && A.isEmpty()) System.out.print(a1);
            else System.out.print(a1 + " ");    
        }
        
        Integer a2 = A.poll();
        if(a2 != null){
            if(B.isEmpty() && A.isEmpty()) System.out.print(a2);
            else System.out.print(a2 + " ");    
        }
        Integer b = B.poll();
        if(b != null){
            if(B.isEmpty() && A.isEmpty()) System.out.print(b);
            else System.out.print(b + " ");
        }
        
    }

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

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

5.1实验总结

学会使用TreeSet

3.码云上代码提交记录及PTA实验总结