201521145048 《Java程序设计》第7周学习总结

1. 本周学习总结


2. 书面作业

Q1.ArrayList代码分析

1.1 解释ArrayList的contains源代码
1.2 解释E remove(int index)源代码
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

1.1、答:
ArrayList的contains源代码:

可以观察到,contains()方法直接就返回下标是否≥0的布尔值。indexOf方法对于传入的是否是null进行了区分。如果找到了,就直接返回,找不到跳出循环外面,就返回-1,标记为没找到,那么contains()方法也会直接返回false。

1.2、答:
E remove(int index)源代码:

先检查要删除的位置如果超出List大小,就抛出IndexOutOfBoundsException异常。大概流程就是类似数组删除操作,删掉某个元素后,其位置之后的元素前移,最后返回被删除的元素即可。size需要自减一次,然后原来最后一个数组元素所在的位置置为null即可。

1.3、答:不用考虑,因为其参数为Objcet类型的对象,所有对象皆为Object。

1.4、答:

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // ensureCapacityInternal用来调整容量
    elementData[size++] = e;
    return true;
}  
private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}
    modCount++;
    // overflow-conscious code
    if (minCapacity - elementData.length > 0) //如果超出容量,则调用grow方法增加容量
        grow(minCapacity);
}   
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); //增加原来容量的一半(右移一位就是/2),也就是说新List的容量是旧的1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity); //把旧数组拷贝至新数组,这里说明了并不是增加原来数组的大小,而是引用了一个大小为原来数组1.5倍的新数组。
}  

1.5、答:使用private声明,说明此方法只在代码内部进行,而不能被用户获取到,而外部确实也没有用到这个方法的地方,这个方法主要是限制语句的操作范围,让使用者可以清晰地发现自己的语句操作越界,而这个rangeCheck操作主要是在代码内部进行,因此没必要使用private。


Q2.HashSet原理

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

答:HashSet用链表数组实现存储,每个列表被称为桶,添加元素时,HashSet会先调用该对象的hashCode()方法得到其hashCode值,根据该值决定该对象在桶中存储位置。如果桶中已有其他元素,则调用加入对象的equals()方法与已有元素进行比较。如果比较结果为假,则将对象插入桶中。如果比较结果为真,则用新的值替换旧的值。如果有两个元素通过equals()方法比较返回true,而它们的hashCode()方法返回值不等,HashSet也会将它们存储在不同的位置。


Q3.ArrayListIntegerStack

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

3.1、答:
05-5-1

private List<Integer> list;
public ArrayIntegerStack() {
   list = new ArrayList<Integer>();
}//使用ArrayList存储,可自动扩容

04-5-3

private Integer[] stack;
private int num;
   
public ArrayIntegerStack(int n) {
   this.stack = new Integer[n];
} //使用内部数组,需提前定好数组大小

3.2、答:相同方法,不同实现。正如ArrayListIntegerStack与ArrayIntegerStack。 即可以让我们根据需求,通过不同方式去实现同一个目的。


Q4.Stack and Queue

4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)

4.1、答:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main201521145048 {
    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");
        }

}

class ArrayListStringStack {
    private List<String> list;
    public String push(String item);//如item为null,则不入栈直接返回null。如栈满,也返回null.
    public String pop();//出栈,如为空,则返回null.
    
    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);
    }

}

4.2、答:

Queue<Integer>A=new LinkedList<Integer>();
Queue<Integer>B=new LinkedList<Integer>();
Queue<Integer>C=new LinkedList<Integer>();
for(i = 0; i < n; i++){
    int temp=in.nextInt();
    if((temp%2)!=0)
        A.add(temp);
    else
        B.add(temp);
}
for(i=0;i<n;i++){
    for(int j=0;j<2;j++){
        if(!A.isEmpty())
            C.add(A.poll());
    }
    if(!B.isEmpty())
        C.add(B.poll());
}
for(i=0;i<n-1;i++)
    System.out.print(C.poll()+" ");
System.out.print(C.poll());

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

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

 if(set.size() < 10)
        for(String str : set){
            System.out.println(str);
        }
     else 
     {   
        for (int i = 0; i < 10 ; i++) {
        System.out.println(set.toArray()[i]);
    }
  • 实验总结:使用TreeSet时,因为其本身就已经有进行排序,这时候只需遍历输出前十个就行。

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

题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

  • 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2. PTA实验

  • 编程(5-1, 5-2, 5-3(选做), 5-6)
  • 实验总结已经在作业中体现,不用写。
posted @ 2017-04-08 12:34  林健  阅读(177)  评论(0编辑  收藏  举报