201521123053《Java课程设计》第七周学习总结

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;
          }
          public boolean equals(Object obj) {
         return (this == obj);
         }
 contains方法返回indexOf(o)》=0;indexOf方法先判断o是否为空,若为空则返回-1,跳出,程序false,不为空则执行下一步,判断elemenData【i】是否为空,为空返回i,i++重新判断,若不为空则执行equals方法,equals方法的作用是判断o和elemenData【i】是否相等,若相等则返回序号i,

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));
}
 remove的源代码是执行删除操作,先rangCheck()判断index是否超过数组大小,若超过则抛出IndexOutOfBoundsException()异常,不超过执行删除,然后后一个补前一个,到最后size-1为空,在处理掉。

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

 答:需要,java中,数组可以存放基本数据类型,而集合就不行,集合中存放的必须是对象。但可以转换。将基本数据类型转换为对象

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++;
    if (minCapacity - elementData.length > 0) 
        grow(minCapacity);
}   

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); 
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity); 
}  
如果超出容量,则调用grow方法增加到一点五倍容量。把旧数组拷贝至新数组,并不是增加原来数组的大小,而是引用了一个大小为原来数组1.5倍的新数组。

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

 答:代码如下
private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private的属性是只能被包里或子类访问,不能被外部访问,所以显然是为了防止被外部的访问。

Q2.HashSet原理

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

 答:确定储存地址需要调用hashCode方法计算地址,根据哈希码找到对应的捅,如果桶中已有元素,调用equals比较对象是否相等,若不相等将值插入,相等用新值替换旧值。用到hashCode()和equals()方法。

2.2 选做:尝试分析HashSet源代码后,重新解释1.1

 答:分析完了,至少我知道的都在上面了。

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

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

 答:主要区别:动态数组和内部实现数组,ArrayListIntegerStack内部使用ArrayList动态对象存储。jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack内部使用Integer数组储存。因为动态数组和普通数组的区别出栈和入栈也会有区别。

3.2 简单描述接口的好处.

 答:接口可以有多个实现,一个类可以实现多个接口,所以接口有 简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口;安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务;而不涉及任何具体的实现细节。这样就比较安全、严密一些;

Q4.Stack and Queue

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

  答:代码如下
	 public static void main(String[] args) {
		  String str = "201521123053";
		  System.out.println(str + "回文数:" + isPalindrome(str));
		   
		  str = "201521123053";
		  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()));
		  }
		  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 银行业务队列简单模拟。(不要出现大段代码)

  答:

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

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

5.1 实验总结

Q6.选做:加分考察-统计文字中的单词数量并按出现次数排序

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

6.1 伪代码

6.2 实验总结

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

3.1本周Commit历史截图

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

3.2 实验总结

实验碰到的问题、思考、收获与解决方案

4. 其他的一些题目,如特别加分的实验题目、小任务、自己用Java做的一些小东西(可选,加分)

原文地址:https://www.cnblogs.com/Einsten/p/6681149.html