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


    第7周-集合

    1. 本周学习总结

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

    参考资料:

    XMind

    ——————————————————————————————————————————————————————————

    2. 书面作业

    1. ArrayList代码分析

    1.1 解释ArrayList的contains源代码

    answer:

    首先,打开ArrayList的contains源代码:

    其中可以发现这句话:Returns true if this list contains the specified element.字面上的意思呢(当然我也只能解释出字面上的意思),就是说“如果此列表包含了指定的的元素,就返回true”

    而打开JDK Documentation,有可以发现更确切的解释:“当且仅当此列表包含至少一个满足 (onull ? enull : o.equals(e)) 的元素 e 时,则返回 true。”

    ——————————————————————————————————————————————————————————

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

    answer:

    打开源代码:
    

    其中的注释Removes the element at the specified position in this list.:“将列表中的指定元素移除。”以及Shifts any subsequent elements to the left:“将之后的元素向左移动”,其中真正起到这句话作用的语句是int numMoved = size - index - 1;

    而这段源代码最后还有一段看似无关的代码:

     if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                                 numMoved);
            elementData[--size] = null;
            //因为经过移动,ArrayList的某个位置空了出来,所以需要加个这个多余的位置置为null
    

    JDK Documentation解释:

    ——————————————————————————————————————————————————————————

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

    answer:

    (1)ArrayList储存的数据类型都是Object类,而Object类是所有类的父类,所以不需要考虑。
    
    (2)而1.1与1.2的源代码中,并没有对ArrayList的数据类型有任何定义,所以不需要考虑。
    

    ——————————————————————————————————————————————————————————

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

    answer:

    add源代码:
    
    public boolean add(E paramE) 
    {    
      ensureCapacityInternal(this.size + 1); // 检查当前集合中是否有空间可以装下新的元素     
      this.elementData[(this.size++)] = paramE; // 如果空间不够了,会自动扩容    
      return true;
      // 注:ArrayList会分配连续的内存片段来储存集合的元素,因为内部其实是数组  
    }    
    ———————————————————————————————————————————————————————————————————————————————————
     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);    //增加数组容量
        }
    
    ArrayList的add方法是在已存在的定长的集合中添加元素,当集合装满了,会在添加元素之前进行扩容。
    

    http://blog.csdn.net/cchengone/article/details/52174140

    ——————————————————————————————————————————————————————————

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

    answer:

    private void rangeCheck(int index)源代码:
    
        /**
         * Checks if the given index is in range.  If not, throws an appropriate
         * runtime exception.  This method does *not* check if the index is
         * negative: It is always used immediately prior to an array access,
         * which throws an ArrayIndexOutOfBoundsException if index is negative.
         */
        private void rangeCheck(int index) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
    

    使用private声明,说明此方法只在代码内部进行,而不能被用户获取到,而外部确实也没有用到这个方法的地方,这个方法主要是限制语句的操作范围,让使用者可以清晰地发现自己的语句操作越界,而这个rangeCheck操作主要是在代码内部进行,因此没必要使用private。

    ——————————————————————————————————————————————————————————

    2. HashSet原理

    2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
    answer:
    (1)HashSet被称为集合,只能存储不重复的对象。
    内部存储过程为:

    (2)当HashSet存储对象时需重新对象对应的类中的equals()方法和hashCode()方法。

    ——————————————————————————————————————————————————————————

    2.2 选做:尝试分析HashSet源代码后,重新解释1.1
    answer:

    /** 
      * 如果此set中尚未包含指定元素,则添加指定元素。 
      * 更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2)) 
      * 的元素e2,则向此set 添加指定的元素e。 
      * 如果此set已包含该元素,则该调用不更改set并返回false。 
      * 
      * 底层实际将将该元素作为key放入HashMap。 
      * 由于HashMap的put()方法添加key-value对时,当新放入HashMap的Entry中key 
      * 与集合中原有Entry的key相同(hashCode()返回值相等,通过equals比较也返回true), 
      * 新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变, 
      * 因此如果向HashSet中添加一个已经存在的元素时,新添加的集合元素将不会被放入HashMap中, 
      * 原来的元素也不会有任何改变,这也就满足了Set中元素不重复的特性。 
      * @param e 将添加到此set中的元素。 
      * @return 如果此set尚未包含指定元素,则返回true。 
      */  
      public boolean add(E e) {  
         return map.put(e, PRESENT)==null;  
      }  
    

    http://www.cnblogs.com/ITtangtang/p/3948538.html

    ——————————————————————————————————————————————————————————

    3. ArrayListIntegerStack

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

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

    private List<Integer> list;
    public ArrayIntegerStack() {
       list = new ArrayList<Integer>();
    }//使用ArrayList存储,可自动扩容
    

    04-5-3:

    private Integer[] stack;
    private int num;
       
    public ArrayIntegerStack(int n) {
       this.stack = new Integer[n];
    } //使用内部数组,需提前定好数组大小
    

    ——————————————————————————————————————————————————————————

    3.2 简单描述接口的好处.
    answer:

    就这题而言,虽然 两个ArrayIntegerStack方法同名,但却都是对IntegerStack接口进行不同的实现,而接口的好处就是在功能相类似具体方法又不同时,可以使用相同的方法名,不同的实现,从而根据自己的需求,通过不同的方式来实现。
    

    ——————————————————————————————————————————————————————————

    4. Stack and Queue

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

    public class Main201521123084 {
    
        public static void main(String[] args) {
        // TODO Auto-generated method stub
            Stack<Character> stack = new Stack<Character>();
            Scanner scanner = new Scanner(System.in);
            int a = 1;
            String string = scanner.next(); 
            for (int i = 0; i < string.length(); i++) {
                stack.push(string.charAt(i));      //入栈
            }
        
            for (int j= 0; j < string.length(); j++) {
                if (stack.pop() != string.charAt(j)) {
                    //一个个出栈并与字符串进行对比
            	    System.out.println("no");
            	    break;
                }
                else {
            	    System.out.println("yes");
            	    break;
                }
            }
         }
    }
    

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

    **answer:**
    这题使用了ArrayDeque(双向队列),其中关键poll()方法:获取并移除此双端队列所表示的队列的头(换句话说,此双端队列的第一个元素)。
    
    关键代码:
    
    for (int i = 0; i < n; i++) {
    if(q1.size() == 2){
    	System.out.printf(q1.poll()+" "+q1.poll()+" ");
    	if(q2.size()>=1)
    		System.out.printf(q2.poll()+" ");
    }
    if(number[i]%2 == 1)
    	q1.add(number[i]);
    else
    	q2.add(number[i]);
    }
        while(q1.size()>1)
            System.out.printf(q1.poll()+" ");
        if(q1.size()==1)
            System.out.printf(q1.poll()+"");
        while(q2.size()>1)
            System.out.printf(q2.poll()+" ");
        if(q2.size()==1)
            System.out.printf(q2.poll()+"");
    

    ——————————————————————————————————————————————————————————

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

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

    5.1 实验总结
    answer:

    本题使用了TreeSet。
    
    Set<String> strSet = new TreeSet<String>();
    int n = 10;
    while (scanner.hasNext()) {
    String str = scanner.next();
    if (str.equals("!!!!!"))
        break;
        else if(!strSet.contains(str))
        strSet.add(str);
    }
    System.out.println(strSet.size());
    strSet.toArray();
    if (strSet.size() <= 10) {
    for (String s : strSet) {
        System.out.println(s);
    }
    }
    else 
    for (String s : strSet) {
        if ( n-- <= 0)
            break;
        System.out.println(s);
        }
    

    ——————————————————————————————————————————————————————————

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

    题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
    6.1 伪代码
    answer:
      
    遍历text的每一个单词
    建立map映射;
    if(str重复出现)
    键值+1
    else
    键值=1

    6.2 实验总结

    ——————————————————————————————————————————————————————————

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

    7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
    answer:
    上一次完成了登陆界面和结算界面,这次利用老师给的JTable框架改动我们的购物车,界面如下

    ——————————————————————————————————————————————————————————

    7.2 使用集合类改进大作业
    answer:
    前面的购物车是用ArrayList进行商品信息的存储,而本周学习了集合,集合类有List,Set,Queue,Map,而实际上,Queue类没办法或者说没有必要应用到购物车或者商品信息的存储上。Set则可以用来检查购物车内是否有相同商品。Map则是用来给商品排序。。。。。然而我都结合不了( ╯□╰ ),感到非常的羞愧。

    ——————————————————————————————————————————————————————————

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

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

    3.1. 码云代码提交记录

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

    ——————————————————————————————————————————————————————————

    3.2. PTA实验

    • 编程(5-1, 5-2, 5-3(选做), 5-6)
    • 实验总结已经在作业中体现,不用写。
  • 相关阅读:
    js 判断字符串中是否包含某个字符串
    MySQL批量更新数据
    js实现字符串切割并转换成对象格式保存到本地
    C#用openfiledialog文件和savefileDialog打开和保存文件
    C#中e.Cancel,e.Handled的区别与应用
    登录窗体与主窗体的关闭
    C#中WinForm程序退出方法技巧总结
    c# 如何获取项目的根目录
    C# Winform中WndProc 函数作用
    SqlDataAdapter.Update批量数据更新
  • 原文地址:https://www.cnblogs.com/fantasticlzs/p/6680705.html
Copyright © 2020-2023  润新知