• 201521123070 《JAVA程序设计》第7周学习总结


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

    ArrayList实际上是一个数组,contains方法就是遍历一次数组elementData,
    当o为null时,找到后就返回;当o不为null时,若equals则返回下标;找不到时返回-1。

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

    rangeCheck方法中首先判断index是否超出size,若超出则抛出IndexOutOfBoundsException,
    remove操作中首先modCount自增,然后删除一个元素,后面元素位置前移,然后返回删除的
    元素,size自减一次,size-1位置为null。

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

      不需要,因为ArrayList实际上是一个Objcet数组,Objcet是所有类的父类,所以ArrayList存储数据时不需要考虑元素的类型。
    

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

    ensureCapacityInternal(size + 1); 首先确定内部容量为size + 1,modCount++;modCount自增,
    if (minCapacity - elementData.length > 0)
    grow(minCapacity);
    如果所需容量超出数组elementData容量,就调用grow()方法,
    int newCapacity = oldCapacity + (oldCapacity >> 1);容量扩大1.5倍,确定容量后使用Arrays.copyOf
    建立新的数组,把旧数组拷贝到新数组中。

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

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

    声明为private就只能内部使用,说明它不想被外部使用这个方法或是外部根本不需要使用这个方
    法,这里rangeCheck已经告诉我们了结果的正确与错误,所以外部根本不需要知道内部到底如何操
    作,所以该方法应该声明为private而不声明为public。

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

      通过计算出待存储对象的散列码(hashCode),做为存储位置。
      散列表用链表数组实现--->每个列表被称为桶。根据哈希码查找对应的桶;
      如果桶中已有其他元素,则调用equals方法与已有元素比较;
      如果比较结果为假,则将元素插入桶中,如果比较结果为真,则用新的值替换旧的值。
    

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

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

      ArrayListIntegerStack是用ArrayList来实现,而ArrayList可以自动扩容,但素ArrayIntegerStack就有规定的容量;
      而且ArrayListIntegerStack不需要指针,可以直接进行删除等操作,但素ArrayIntegerStack则需要指针。
    

    3.2 简单描述接口的好处.

      通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系;
      能够更加清晰地把系统的实现细节与接口分离,调用者只需关心接口就行了,不用管内部操作实现。
    

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

    import java.util.Scanner;
    import java.util.Stack;
    
    public class Main201521123070 {
    
        public static void main(String[] args) {
        // TODO Auto-generated method stub
            
            Scanner in = new Scanner(System.in);
            String str = in.next(); 
            System.out.println(check(str));
        }
        public static boolean check(String str){
        	Stack<Character> stack = new Stack<Character>();
            boolean flag = true;
            for(int i = 0;i < str.length(); i++){
            	stack.push(str.charAt(i)); 
            }
            for(int j = 0;j < str.length(); j++) {
            	if (stack.pop() != (str.charAt(j)))
                   flag = false;
            	   break;
             }
                
            return flag;
            
        }
            
    }
    

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

    
    

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

    5.1 实验总结

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

    3.1本周Commit历史截图

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

  • 相关阅读:
    python 语言 yaml文件嵌套另一个yaml
    APP混合原生和H5页面中,appium 与X5内核那些事
    mac appium python 自动化环境搭建遇到的问题
    Appium+Python自动化测试学习笔记
    Appium遇到异常处理
    Android 电池分析工具
    lsof命令使用
    Django入门(一)基础环境搭建
    gunicorn部署Flask服务
    自动化测试-数据驱动实践(126发邮件)
  • 原文地址:https://www.cnblogs.com/TSlover/p/6677326.html
Copyright © 2020-2023  润新知