代码改变世界

201521123051《Java程序设计》第七周学习总结

2017-04-08 19:05  jmu201521123051  阅读(219)  评论(0编辑  收藏  举报

1. 本周学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

使用工具:百度脑图

2. 书面作业

1.ArrayList代码分析

1.1 解释ArrayList的contains源代码

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;

分析:contains方法在执行后首先会调用indexOf()方法。indexOf()方法会判断传入的对象是否为空,如果为空,则遍历整个集合的元素,如果集合的某个元素为空,返回该元素的下标。如果传入对象不为空,则遍历整个集合的元素,如果该元素和集合内某个元素的equals比较结构为true,返回该元素下标。可以看到如果遍历完集合后没有元素存在于集合中就返回-1。

结论:判断集合中是否含有此元素;有,返回true。没有,返回false; 

1.2 解释E remove(int index)源代码


E remove(int index)源代码:

public E remove(int index) {    
        RangeCheck(index);    
   
        modCount++;    
        E oldValue = (E) elementData[index];    
   
        int numMoved = size - index - 1;    
        if (numMoved > 0)    
            System.arraycopy(elementData, index+1, elementData, index,    
                 numMoved);    
        elementData[--size] = null; // Let gc do its work    
   
        return oldValue;    
    }    
   
 
分析:首先是检查范围,修改modCount,保留将要被移除的元素,将移除位置之后的元素向前挪动一个位置,将list末尾元素置空(null),返回被移除的元素。

结论: 删除ArrayList的指定元素   

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

1.1与1.2中并没有对ArrayList的数据类型有任何定义,可知ArrayList存储数据时不需要考虑元素的类型。

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

ArrayList中add方法
 /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
//添加操作,首先会调用ensureCapacityInternal(size + 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。


ArrayList中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);   
}

//在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensureExplicitCapacity()。

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

private void rangeCheck(int index)源代码:
/** 
      * Checks if the given index is in range. 
 */  
 private void RangeCheck(int index) {  
     if (index >= size)  
         throw new IndexOutOfBoundsException(  
         "Index: "+index+", Size: "+size);  
     }  


 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
使用private声明,说明此方法只在代码内部进行,外部也确实不会用到这个方法,所以没必要用public。

2.HashSet原理

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

HashSet的存储形式用链表数组实现->每个列表被称为桶。
当我们向HashSet中添加一个元素时,HashSet会先调用该对象的hashCode()方法得到其hashCode值,根据该值决定该对象在桶中存储位置。
如果桶中已有其他元素,则调用加入对象的equals()方法与已有元素进行比较。如果比较结果为假,则将对象插入桶中。如果比较结果为真,则用新的值替换旧的值。//详见PPT《集合》33.34页

3.ArrayListIntegerStack

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

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

public ArrayIntegerStack(int n) {
    this.arr = new Integer[n];
}


public ArrayListIntegerStack(){
    this.list = new ArrayList<Integer>();
}


ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。

3.2 简单描述接口的好处.

两个类都继承了一个接口,那就是IntegerStack.

假设在 ArrayIntegerStack的基础上,如果我需求改变了,我不想用 ArrayIntegerStack ,想用ArrayListIntegerStack,那么按照上面写的话,只需要改下部分代码,否则需要改的就多了。

简单打比方,你定义一个杀鸡的接口,再写个用小刀来杀的实现类,以后用接口就可以了,如果想换牛刀的话,自己再定义一个用牛刀的实现类,然后在代码中改成换牛刀的就好,这样就不需要你改大量代码了。

4.Stack and Queue

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

public class Main201521123051 {  
    public static void main(String[] args){  
        Scanner input=new Scanner(System.in);  
        System.out.print("Enter a string: ");  
        String s=input.nextLine();  
        if(isPalindrome(s))  
            System.out.println(s+" is a palindrome");  
        else  
            System.out.println(s+" is not a palindrome");  
    }  
    public static boolean isPalindrome(String s){  
        int low=0;  
        int high=s.length()-1;  
        while(low<high){  
            if(s.charAt(low)!=s.charAt(high))  
                return false;  
            low++;  
            high--;  
        }  
        return true;  
    }  
  
} 

示例

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

for (int i = 1; i <= n; i++) {
int sc = scanner.nextInt();
if (sc % 2 == 0) {
    B.offer(x);
} else {
    A.offer(x);
}
}
区分奇偶。

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

... ... 
}

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

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

package homework;

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main02 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Set<String> arr = new TreeSet<String>();
        String str=null;
        while(true)
        {
            String word=sc.next();
            if(word.equals("!!!!!"))break;
            arr.add(word);

        }

        System.out.println(arr.size());


        int i=0;
        for(String s:arr)
        {
            if(i==10)break;
            else if(i>arr.size())break;
            System.out.println(s);
            i++;
        }
    }
}

5.1 实验总结

  使用了Set的自然排序实现类TreeSet可较容易完成本题。
  TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。

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

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

6.1 伪代码

6.2 实验总结

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

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

3.1. 码云代码提交记录

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

3.2. PTA实验

编程(5-1, 5-2, 5-3(选做), 5-6)