• 201521123054 《Java程序设计》第7周学习总结


    1. 本周学习总结

    2. 书面作业

    ArrayList代码分析
    1.1 解释ArrayList的contains源代码

    //contains()方法
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
    

    indexOf方法返回值与0比较来判断对象是否在list中。接着看indexOf。
    indexOf(Object)

    //indexOf()方法
    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;
    }
    

    通过遍历elementData数组来判断对象是否在list中,若存在,返回index([0,size-1]),若不存在则返回-1。所以contains方法可以通过indexOf(Object)方法的返回值来判断对象是否被包含在list中。
    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;
    }
    

    首先是检查范围,修改modCount,保留将要被移除的元素,将移除位置之后的元素向前挪动一个位置,将list末尾元素置空(null),返回被移除的元素。

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

    就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
    1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
    不用考虑;,因为其参数为Objcet类型的对象,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);
            }
    
            ensureExplicitCapacity(minCapacity);
        }
    

    确保数组容量是传入参数和默认长度的最大值。

         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);
        }
        private static int hugeCapacity(int minCapacity) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
        } 
    

    新List的容量扩充为原来的1.5倍;
    然后将原来的数据拷贝到新数组中去
    使用了 ensureCapacityInternal来调整容量。
    1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

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

    因为使用private声明,说明此方法只在代码内部进行;rangeCheck方法保证了remove等操作需在容量范围内。就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
    HashSet原理
    2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
    HashSet的存储形式用链表数组实现,这种方法叫做哈希桶,如果对象加入HashSet,则会调用对象hashcode()取得哈希码,并尝试放入对应号码的哈希桶中。
    ArrayListIntegerStack
    题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
    3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
    ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。
    一个是使用动态数组,而另一个是规定数组的大小。
    3.2 简单描述接口的好处.
    几个类能够继承同一个接口,用起来方便,结构清晰。
    Stack and Queue
    4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。

    import java.util.ArrayList;
    import java.util.List;
    public class main201521123054{
     public static void main(String[] args) {
      String str = "abcba";
      System.out.println(str + ":" + isPalindrome(str));
     }
    
     public static boolean isPalindrome(String pValue){
     
      List<Character>  stack = new ArrayList<Character>();
      List<Character>  stack2 = new ArrayList<Character>();
      int haflen = pValue.length()/2;
      for(int i=0;i<haflen;i++){
       stack.add(pValue.charAt(i));
       stack2.add(pValue.charAt(pValue.length()-i-1));
      }
      boolean bFlag = true;
      for(int i=haflen-1;i>=0;i--){
       if(stack.remove(i) != stack2.remove(i)){
        bFlag = false;
        break;
       }
      }
      return bFlag;
     }
    }
    

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

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

    	 while(in.hasNext()){
    			 String sc = in.next();
    			 if (sc.equals("!!!!!"))
    				 break;
    			 set.add(sc);
    		 }
    

    面向对象设计大作业-改进
    7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

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

  • 相关阅读:
    灰度发布
    rabbitmq应用场景
    redis设置cpu核数与内存
    使用word2010发布博客到博客园
    讲师
    UML-6.3-用例-详述示例
    UML-6.2-用例-用例模型/用例/场景关系
    UML-6.1-用例-示例
    数据库增量同步开源软件
    UML-5-进化式需求
  • 原文地址:https://www.cnblogs.com/dongnankanwang/p/6681016.html
Copyright © 2020-2023  润新知