TSlover

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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实际上是一个数组,contains方法就是遍历一次数组elementData,
当o为null时,找到后就返回;当o不为null时,若equals则返回下标;找不到时返回-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;
}


private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

rangeCheck方法中首先判断index是否超出size,若超出则抛出IndexOutOfBoundsException,
remove操作中首先modCount自增,然后删除一个元素,后面元素位置前移,然后返回删除的
元素,size自减一次,size-1位置为null。

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

  不需要,因为ArrayList实际上是一个Objcet数组,Objcet是所有类的父类,所以ArrayList存储数据时不需要考虑元素的类型。

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

public boolean add(E e) {
    ensureCapacityInternal(size + 1); 
    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(minCapacity);
}   
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); 
    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); 
}  

ensureCapacityInternal(size + 1); 首先确定内部容量为size + 1,modCount++;modCount自增,
if (minCapacity - elementData.length > 0)
grow(minCapacity);
如果所需容量超出数组elementData容量,就调用grow()方法,
int newCapacity = oldCapacity + (oldCapacity >> 1);容量扩大1.5倍,确定容量后使用Arrays.copyOf
建立新的数组,把旧数组拷贝到新数组中。

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

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}  

声明为private就只能内部使用,说明它不想被外部使用这个方法或是外部根本不需要使用这个方
法,这里rangeCheck已经告诉我们了结果的正确与错误,所以外部根本不需要知道内部到底如何操
作,所以该方法应该声明为private而不声明为public。

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

  通过计算出待存储对象的散列码(hashCode),做为存储位置。
  散列表用链表数组实现--->每个列表被称为桶。根据哈希码查找对应的桶;
  如果桶中已有其他元素,则调用equals方法与已有元素比较;
  如果比较结果为假,则将元素插入桶中,如果比较结果为真,则用新的值替换旧的值。

Q3. ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack

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

  ArrayListIntegerStack是用ArrayList来实现,而ArrayList可以自动扩容,但素ArrayIntegerStack就有规定的容量;
  而且ArrayListIntegerStack不需要指针,可以直接进行删除等操作,但素ArrayIntegerStack则需要指针。

3.2 简单描述接口的好处.

  通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系;
  能够更加清晰地把系统的实现细节与接口分离,调用者只需关心接口就行了,不用管内部操作实现。

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

import java.util.Scanner;
import java.util.Stack;

public class Main201521123070 {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
        
        Scanner in = new Scanner(System.in);
        String str = in.next(); 
        System.out.println(check(str));
    }
    public static boolean check(String str){
    	Stack<Character> stack = new Stack<Character>();
        boolean flag = true;
        for(int i = 0;i < str.length(); i++){
        	stack.push(str.charAt(i)); 
        }
        for(int j = 0;j < str.length(); j++) {
        	if (stack.pop() != (str.charAt(j)))
               flag = false;
        	   break;
         }
            
        return flag;
        
    }
        
}

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


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

5.1 实验总结

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

3.1本周Commit历史截图

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

posted on 2017-04-08 14:25  TSlover  阅读(185)  评论(0编辑  收藏  举报