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


    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)

  • 相关阅读:
    Codeforces Round #107 (Div. 1) D Mission Impassable
    Codeforces Round #107 (Div. 1) C Smart Cheater
    Codeforces Round #104 (Div. 1) D Lucky Pair
    Codeforces Round #104 (Div. 1) C Lucky Subsequence
    拓扑排序&&欧拉(回)路
    复习笔记之矩阵快速幂(不定时更新)
    复习笔记之母函数
    树链剖分来一发
    最短路算法略解
    题目记录
  • 原文地址:https://www.cnblogs.com/xqy123/p/6679649.html
Copyright © 2020-2023  润新知