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

    1. 本周学习总结

    2. 书面作业

    Q1.ArrayList代码分析
    Q1.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实现遍历ArrayList,indexOf函数返回值为序号,如果o为null则没有equals方法

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

    解释:检测删除的位置是否超出List大小,如果超出则显示异常。类似数组删除操作,删掉某个元素后,其位置之后的元素前移。

    Q1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
    答:需要考虑,由1.1可知某些类型的类中会覆盖Object类中的方法以满足自身需求,所以不同类型调用时可能会有不同结果。

    Q1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
    答:add方法会在末尾追加一个元素,并增加数组总数。ArrayList的add方法会在已存在的定长的集合中添加元素,当集合装满了即内部数组容量不够时,会在添加元素之前进行扩容。

    Q1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
    答:rangeCheck()方法保证index在ArrayList长度范围之内(index < size()),并在越界时抛出IndexOutOfBoundsException异常。所以它是私有的内部方法,只可被ArrayList中的方法如get,remove调用,所以声明为private。

    Q2.HashSet原理
    Q2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
    答:当从HashSet中访问元素时,HashSet先计算该元素的hashCode值,然后到该hashCode对应的位置取出该元素。要调用equals和hashCode方法。

    Q2.2 选做:尝试分析HashSet源代码后,重新解释1.1
    使用HashSet中的contain方法那和List中的contain方法的速度简直不可同日而语,

        public boolean contains(Object o) {  
        return map.containsKey(o);  
      }
    

    List中是遍历而HashSet是利用hashCode快速查找到并利用equals进行比较,当比较值为真则覆盖原来的值若是假则插入到hash桶中。

    Q3.ArrayListIntegerStack
    题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
    Q3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
    答:5-1中的ArrayListIntegerStack不需要定义数组的大小,list可以对初始容量赋值,而在5-3中的ArrayIntegerStack就需要自己定义数组的大小,需要指针。

    Q3.2 简单描述接口的好处.
    答:接口可以做到相同方法,不同实现。拿3.1来举例,ArrayListIntegerStack和ArrayIntegerStack两个类都继承了一个IntegerStack接口。这样可以使用一个接口来操作不同的类。ArrayListIntegerStack和ArrayIntegerStack两个类都有pop()方法,但是实现pop()方法不同。这样我们修改ArrayListIntegerStack的pop()方法而不影响ArrayIntegerStack的pop方法。

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

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    interface StringStack{
        public String push(String item);//如item为null,则不入栈直接返回null。如栈满,也返回null.
        public String pop();//出栈,如为空,则返回null.
    }
    class ArrayListStringStack implements StringStack{
        private List<String> list;
        
        public ArrayListStringStack() {
            list=new ArrayList<String>();
        }
        @Override
        public String push(String item) {
            // TODO Auto-generated method stub
            if(item==null)
                return null;
            list.add(item);
            return item;
        }
    
        @Override
        public String pop() {
            // TODO Auto-generated method stub
            if(list.isEmpty())
                return null;
            return list.remove(list.size()-1);
        }
    
    }
    public class Main201521123108 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc=new Scanner(System.in);
            StringStack stack=new ArrayListStringStack();
            String m=sc.next();
            int f=1;
            for(int i=0;i<m.length();i++)
            {
                stack.push(String.valueOf(m.charAt(i)));
            }
            for(int i=0;i<m.length();i++)
            {
                if(String.valueOf(m.charAt(i)).equals(stack.pop()))f=1;
                else
                {
                    f=0;
                    break;
                }
            }
            if(f==1)System.out.println("true");
            else System.out.println("flase");
            }
    
    }
    

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

    Set<String> strset=new TreeSet<String>();
        
        for(i=0;;i++){
            str=in.next();
            if(str.equals("!!!!!")) break;
            else strset.add(str);
        }
        
        for(String s:strset){
            x=x+1;
            System.out.println(s);
            if(x==10) break;
        }
    

    Q5.统计文字中的单词数量并按单词的字母顺序排序后输出
    题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
    Q5.1 实验总结
    答:str=in.next();//输入的文本以空格分开将单词存入,输入方式,不能用in.nextLine()
    Set strset=new TreeSet();//用Set来存储,但HashSet只是无重复的存入单词,无序,此时需要用TreeSet,TreeSet具有排序功能reeSet
    实验总结:统计文本出现的词汇并存储,此时要想到Set,Set集合的对象是不重复的,但要是对对象进行排序,需要的是TreeSet,TreeSet具有排序功能,HashSet可以用作无序的词汇存储,因而本题不使用HashSet

    Q6.选做:加分考察-统计文字中的单词数量并按出现次数排序**
    题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
    Q6.1 伪代码
    Q6.2 实验总结

    Q7.面向对象设计大作业-改进
    Q7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
    Q7.2 使用集合类改进大作业

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

    Q3.1. 码云代码提交记录

    Q3.2. PTA实验

    编程(5-1, 5-2, 5-3(选做), 5-6)
    实验总结已经在作业中体现,不用写。

  • 相关阅读:
    JavaScript 中的求值策略
    JavaScript中的reduce()的5个用例
    使用JavaScript检测空闲的浏览器选项卡,可以做些什么?
    前端优化代码
    你可能不需要在JavaScript使用switch语句
    Js中的compose函数和pipe函数
    css是什么格式的文件?
    h5和css3的新特性有哪些?
    ES2020的这些新功能令人期待
    WindowsServer2003服务器的性能监视
  • 原文地址:https://www.cnblogs.com/yytx/p/6682705.html
Copyright © 2011-2022 走看看