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

1. 本周学习总结

2. 书面作业

ArrayList代码分析
1.1 解释ArrayList的contains源代码

//contains()方法
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}

indexOf方法返回值与0比较来判断对象是否在list中。接着看indexOf。
indexOf(Object)

//indexOf()方法
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;
}

通过遍历elementData数组来判断对象是否在list中,若存在,返回index([0,size-1]),若不存在则返回-1。所以contains方法可以通过indexOf(Object)方法的返回值来判断对象是否被包含在list中。
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;
}

首先是检查范围,修改modCount,保留将要被移除的元素,将移除位置之后的元素向前挪动一个位置,将list末尾元素置空(null),返回被移除的元素。

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

就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
不用考虑;,因为其参数为Objcet类型的对象,Object类又是所有类的父类所以想放什么类型的都可以。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

 public boolean add(E e) {
        ensureCapacityInternal(size + 1); 
        elementData[size++] = e;
        return true;
    }

使用ensureCapacityInternal来调整容量;

    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

确保数组容量是传入参数和默认长度的最大值。

     private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

如果需要的容量比数组长度要大的话,就调用grow()方法

    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);
    }
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    } 

新List的容量扩充为原来的1.5倍;
然后将原来的数据拷贝到新数组中去
使用了 ensureCapacityInternal来调整容量。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

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

因为使用private声明,说明此方法只在代码内部进行;rangeCheck方法保证了remove等操作需在容量范围内。就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
HashSet的存储形式用链表数组实现,这种方法叫做哈希桶,如果对象加入HashSet,则会调用对象hashcode()取得哈希码,并尝试放入对应号码的哈希桶中。
ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。
一个是使用动态数组,而另一个是规定数组的大小。
3.2 简单描述接口的好处.
几个类能够继承同一个接口,用起来方便,结构清晰。
Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。

import java.util.ArrayList;
import java.util.List;
public class main201521123054{
 public static void main(String[] args) {
  String str = "abcba";
  System.out.println(str + ":" + isPalindrome(str));
 }

 public static boolean isPalindrome(String pValue){
 
  List<Character>  stack = new ArrayList<Character>();
  List<Character>  stack2 = new ArrayList<Character>();
  int haflen = pValue.length()/2;
  for(int i=0;i<haflen;i++){
   stack.add(pValue.charAt(i));
   stack2.add(pValue.charAt(pValue.length()-i-1));
  }
  boolean bFlag = true;
  for(int i=haflen-1;i>=0;i--){
   if(stack.remove(i) != stack2.remove(i)){
    bFlag = false;
    break;
   }
  }
  return bFlag;
 }
}

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

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

	 while(in.hasNext()){
			 String sc = in.next();
			 if (sc.equals("!!!!!"))
				 break;
			 set.add(sc);
		 }

面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

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

posted @ 2017-04-08 14:11  童欢  阅读(171)  评论(3编辑  收藏  举报