zoukankan      html  css  js  c++  java
  • 201621123037 《Java程序设计》第8周学习总结

    作业08-集合


    1. 本周学习总结

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

    其他-笔记:


    2. 书面作业

    1. ArrayList代码分析

    1.1 解释ArrayList的contains源代码

    public boolean contains(Object o) {
            return indexOf(o) >= 0; 
        }
    
    public int indexOf(Object o) {  //找到元素就返回当前位置,否则返回-1
            if (o == null) {
            //如果o为null,遍历elementData[]数组,查看是否有为null的对象,有则返回下标没有则返回-1
                for (int i = 0; i < size; i++)   
                    if (elementData[i]==null)   
                        return i;                
            } else { 
            //如果o不为null,用equals()去比较数组elementData[] 是否有与o相同的对象,有则返回下标没有则返回-1
                for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i]))
                        return i;
            }
            return -1;
        }
    

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

    答:

    //remove代码
     public E remove(int index) {
            rangeCheck(index);                        //检查是否在范围内
    
            modCount++;                               //初始值为0,代表修改的次数
            E oldValue = elementData(index);   
                                                      //被删除的元素存到oldValue中
            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                                                                                     //将原来最后一个数组元素的位置置为null
            return oldValue;
        }
    

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

    答:不需要,ArrayList在存储数据时,可以将元素类型变成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); // DEFAULT_CAPACITY = 10,默认长度为10
            }
    
            ensureExplicitCapacity(minCapacity);
        }
    

    如果elementData是默认长度的空数组,就取默认长度和传入的参数的最大值。

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

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

    答:
    源代码:

    private void RangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size);//抛出异常
    }
    

    比如get、add等方法中有调用private void rangeCheck(int index),但是用户不需要知道和调用这个方法,他们只要能够调用类似add这样的方法即可,所以封装起来不被外部类所调用。

    2. HashSet原理

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

    答:

    确定存储位置时首先需要先计算hashcode的值,锁定要加入的哈希表的位置.
    其次,如果该位置没有值,就直接添加进去。
    否则用equals()方法判断要加入的值和已存在的值有没有重复,如果没有则添加,有则不添加。

    调用到的方法:
    hashCode()方法
    equals()方法

    2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)

    答:
    将元素加入HashSet中的时间复杂度是O(1)不是O(n),由hash表中的元素是无序的,和2.1的加入方法,可得出此结论。

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

    答:
    对于HashSet中保存的对象,应该注意equals()和hashCosde()方法的重写,并且源码中可以看出用到了HashMap。
    映射的关系:把hashCosde()的计算看做Key,数组元素的值看做value。

    3. ArrayListIntegerStack

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

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

    答:
    在接口内容相同情况下:

    • 04-面向对象的实现类ArrayListIntegerStack中,创建了一个Stack数组,并定义top指针来具体化接口中的方法,实现起来整体代码量冗长繁琐
    • 05-集合的实现类ArrayListIntegerStack中,创建的是ArrayList动态数组,可以自己改变数组的大小,并且在对接口方法的实现上直接调用ArrayList中已有的方法,整体简洁明了,代码量少,增加阅读性。

    3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。

    答:
    接口的好处:
    在本题中可以看出,接口可以只定义而不用写具体内容,这样在继承接口的实现类中就可以根据需求来具体编写代码,更加灵活。
    其次如果继承的话,每个子类只能有一个父类,但是接口不同,一个类可以有多个接口,实现起来更加全面。

    4. Stack and Queue

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

    结果:

    4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?

    答:
    使用LinkedList实现类

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

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

    5.1 实验总结

    答:
    本题主要利用Set集合,又因为需要按照单词的字母顺序进行排序,所以用TreeSet而不用HashSet.
    题目要求输出排序后前十个单词,故可以定义一个count变量进行统计次数,完成输出格式需求。

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

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

    6.1 伪代码

    答:

    Map<String,Integer> wordmap = new TreeMap<>();
    //创建map对象
    if(word.equals("!!!!!")) break
    if(map.countiansKey(word))
        map.put(word,map.get(word)+1)   //重复+1
    else
        map.put(word,1)     //未重复为初始的1
        
      List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(wordmap.entrySet());  
    //改成list对象
    Collections.sort(list,new Comprartor<Map.Entry<String,Integer>>() )  //对第二个参数进行排序
    for(遍历list前十个)
    list.get(i).toString() //输出
    
    

    6.2 实验总结

    答:
    这道题用的是Map映射,首先要创建一个Map对象。
    然后,运用map.countiansKey()方法来判断当前的单词是否已经存在过,如果存在,则在原来个数基础上+1,如果没有,则放入并从一开始计数。
    之后,运用Collections的sort方法,对第二个参数对象进行排序。
    最后,对前十个单词进行输出,来满足格式上的需求。

    7. 选做 面向对象设计大作业-改进

    7.1 使用集合类改进大作业或者简述你的面向对象设计大作业中,哪里使用到了集合类。

    答:
    在存储商品信息中运用了ArrayList
    这周因为特殊原因,没有全部用课堂讲的Java集合类进行修改


    3.码云及PTA

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

    3.1. 码云代码提交记录

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

    3.2 截图PTA题集完成情况图

    需要有两张图(1. 排名图。2.PTA提交列表图)


    3.3 统计本周完成的代码量

    需要将每周的代码统计情况融合到一张表中。

    周次 总代码量 新增代码量 总文件数 新增文件数
    1 0 0 0 0
    2 0 0 0 0
    3 0 0 0 0
    4 0 0 0 0
    5 1167 1167 26 26
    6 1830 663 32 6
    7 2282 452 45 13
    8 2446 164 48 3
    9 2774 328 56 8
  • 相关阅读:
    如何去重一个Oracle表
    配置Eclipse来开发Java 程序
    在windows上使用opera mini
    Oracle OLAP 介绍
    一个Batch作业调度系统构思
    how to Use Subversion with TortoiseSVN
    java official Design Pattern
    how to install ubuntu OS combined with Windows
    确保DWBI项目成功的几个关键点
    spinner 读取sqlite
  • 原文地址:https://www.cnblogs.com/qin-yu/p/7811599.html
Copyright © 2011-2022 走看看