zoukankan      html  css  js  c++  java
  • 201621123060《JAVA程序设计》第八周学习总结

    1. 本周学习总结

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

    2. 书面作业

    1. 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;
    }
    
    • contains:如果列表中包含指定的元素则返回true.
    • indexOf:遍历整个数组,找到就返回该数组的的下标,找不到就返回-1.
    • 即意思就是简单判断一下返回值如果>=0,在此中返回指定元素的第一次发生的索引。

    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;           //关键的一句
        return oldValue;
    }
    private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
    
    • remove:移除列表中指定位置上的元素,向左移动所有后序元素(将其索引减1)
    • rangeCheck:如果删除位置越界,抛出异常。
    • 即先判断所要删除的位置是否超出数组大小:若超出,则抛出异常;若未超出,则删除该位置的元素,并将该位置之后的元素逐一往前移

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

    不需要考虑,参数属于Object类(各类的父类)。

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

    A:add源码如下

      public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
    

    在尾部加,数组长度加一。
    同样的,调用了ensureCapacityInternal方法,源码如下:

     private void ensureCapacityInternal(int minCapacity) {
            if (elementData == EMPTY_ELEMENTDATA) {
                minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
            }
    
            ensureExplicitCapacity(minCapacity);
        }
    

    ensureCapacityInternal是判断是否要扩容的方法。首先是判断现在的ArrayList是不是空的,如果是空的,minCapacity就取默认的容量和传入的参数minCapacity中的大值。
    该方法最后一句又调用了ensureExplicitCapacity方法,源码如下:

      private void ensureExplicitCapacity(int minCapacity) {
            modCount++;
    
            // overflow-conscious code
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
    

    如果minCapacity的值大于add数据之前的大小,就调用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);
        }
    

    用grow方法进行扩容。关键语句:int newCapacity = oldCapacity + (oldCapacity >> 1);,相当于新的最大容量是 size+1+size/2 相当于原来的1.5倍然后加1。

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

    private修饰仅同类可见。因为外部人员无需使用这个方法,只要内部操作人员知道是否越界即可。

    2. HashSet原理

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

    计算哈希码,即调用对象的hashCode方法,根据哈希码查找到对应的桶(HashSet的存储形式用链表数组实现:每个列表被称为桶)如果桶中已有其他元素,则调用元素的equals方法与已有元素进行比较。
    如果比较结果为假,则将元素插入桶中,如果比较结果为真,则用新的值替换旧的值。

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

    复杂度为O(1),它靠的不是遍历而是计算哈希码.

    3. ArrayListIntegerStack

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

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

    • ArrayListIntegerStack是用ArrayList来实现栈。ArrayList实际就是长度可变的数组,以它所实现的栈不用考虑栈满的情况,因为ArrayList可以自动扩容。
    • ArrayIntegerStack是用数组来实现栈。需要考虑栈满的情况,在一开始便须设定栈的深度,并设定一个top指针,根据出栈入栈的情况移动top指针。

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

    • 接口是一类行为的总和,实现接口就可以拥有这些行为。
    • 接口能避免因为只需要某类的某一个或几个方法而继承这个类,把操作变得更简单。
    • 接口为编程工作者实现代码交互及任务分工提供便捷。

    4. Stack and Queue

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

    public class Main201621123060 {
         public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
           System.out.println("Please input the number: ");
           String a = sc.next();
           int i = a.length();
          System.out.println(huiwen(a));
         }
         public static boolean huiwen(String a){
          List<Character>  stack1 = new ArrayList<Character>();
          List<Character>  stack2 = new ArrayList<Character>();
          int b = a.length()/2;    
          for(int i=0;i<b;i++){
           stack1.add(a.charAt(i));//前半字符正向入栈
           stack2.add(a.charAt(a.length()-i-1));//后半字符反向入栈
          }
          for(int i=b-1;i>=0;i--){
           if(stack1.remove(i).equals(stack2.remove(i))){
            return true ;
           }
          }
          return false;
         }
        }
    

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

    	for (int i = 0; i < N; i++) {
    		int x=in.nextInt();
    		if(x%2!=0)
    			q1.offer(x);
    		else
    			q2.offer(x);
    	}
    	while(q1.size()!=0||q2.size()!=0){
    		if(q1.size()!=0){
    			if(flage==0) {
    				System.out.print(q1.poll());
    				System.out.print(" "+q1.poll());
    				flage=1;
    			}
    			else {
    				System.out.print(" "+q1.poll());
    				System.out.print(" "+q1.poll());
    			}
    			
    		}
    		if(q2.size()!=0){
    			if(flage==0) {
    				System.out.print(q2.poll());
    				flage=1;
    			}
    			else {
    				System.out.print(" "+q2.poll());
    			}
    

    主要用了Queue中的offer()方法、size()方法、poll()方法

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

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

    关键代码:

    Set<String> a = new TreeSet<String>();
    a.add(str);
    System.out.println(a.size());
    int i=0;
            for(String b:a)
            {
                if(i==10)break;
                System.out.println(b);
                i++;
    

    用到了add、size、forEach遍历

    5.1 实验总结

    使用了Set的自然排序实现类TreeSet,此类可以对添加的对象进行默认排序。

    3.码云及PTA

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

    3.1. 码云代码提交记录

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

    3.2 截图PTA题集完成情况图

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


    3.3 统计本周完成的代码量

    周次 总代码量 新增代码量 总文件数 新增文件数
    1 70 70 5 5
    2 207 207 4 4
    3 205 205 11 11
    4 81 81 4 4
    5 365 365 4 4
    6 296 296 7 7
    7 274 274 5 5

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

  • 相关阅读:
    Android LBS 学习总结
    Android LBS 百度地图(参考: 《第一行代码》第2版(郭霖)11.4 使用百度地图 )
    Android LBS 百度地图(参考: 《第一行代码》第2版(郭霖)11.3.4 显示看得懂的定位信息:准确文字地址)
    Android LBS 百度地图(参考: 《第一行代码》第2版(郭霖)11.3.2 确定自己位置的经纬度:准确数字信息)
    Android 网络编程
    Android LBS
    2018面向对象程序设计(Java)第3周学习指导及要求
    2018面向对象程序设计(Java) 第2周学习指导及要求
    2018面向对象程序设计(Java)第1周学习指导及要求
    2018年7月北航举办软件工程师师资培训札记
  • 原文地址:https://www.cnblogs.com/pty754084101/p/7819302.html
Copyright © 2011-2022 走看看