• 201621123028《Java程序设计》第8周学习总结


    作业08-集合

    1.本周学习总结

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

    2. 书面作业

    1. ArrayList代码分析

    1.1 解释ArrayList的contains源代码

    甩图:

      ArrayList的contains方法中还有一个indexOf方法,当输入的对象是空的时候,不会直接调用equals方法。判断elementData[i]是否为空,为空返回i。如果o不为空的时候,进行比较,找到放回下标值,找不到则返回-1。

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

    rangeCheck(index);检查是否符合所在的范围。rangeCheck方法是判断下表有没有超过size,超过报错。

    if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                                 numMoved);
            elementData[--size] = null; // clear to let GC do its work
    
            return oldValue;
    

    这一段是在不为空的时候,逐一删除元素,每删除一个,将下一个向前面移动,删除完后,置为空。返回oldValue。

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

      首先,在集合中操作的肯定是对象喽,那么,简单的数据类型是不可以的,然后ArrayList中继承自Object类,所以说不管你存放进什么引用类型,都会被封装成Object添加到ArrayList。所以需要不考虑元素的具体类型。

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

      首先,使用ensureCapacityInternal()方法,去保证elementData数组的长度是size+1,elementData[size++] = e;在添加对象的时侯,size增加1。

      DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个常量,默认的长度是10,那么这里是判断elementData数组的长度,如果是默认长度,将DEFAULT_CAPACITY和minCapacity比较,较大的值赋给minCapacity。确保数组长度是新的minCapacity的长度。modCount实现++操作,if判断的是所需长度minCapacity 是不是比elementData数组的长度大,如果是,说明存储不够,调用grow(minCapacity)方法,明显是增加容量。

      int newCapacity = oldCapacity + (oldCapacity >> 1);扩容,增加至1.5倍,第一个if判断新的容量够不够存储的,够了就不要扩了,第二个if是如果不够继续扩大,然后复制给elementData数组。原来的就不要了。有个问题是如果超出了最大长度,就会报溢出错误。

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

      要判断有没有超过size,用户是不需要去关心的,用户知道是有remove的方法就行了,实现将这个方法直接封装起来。

    2. HashSet原理

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

      HashSet的add()在底层调用了HashMap的put(),在HashMap的put()方法中,先判断key的存在来决定value的修改与否,这样子向HashSet中添加值的时候,相当于进行了判断key,实现了不重复添加的功能。put()方法调用putVal()方法。

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

    是o(1),因为添加进去的元素只需要和key进行比较一次就可以,有就不会加入,没有就加入进去。

    2.3 选做:尝试分析HashSet源代码后,重新解释2.1

    3. ArrayListIntegerStack

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

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

    • 存储方式不同,ArrayListIntegerStack是使用动态数组实现存储的,而ArrayIntegerStack是使用普通数组来实现存储的。
    • ArrayIntegerStack中我用到了top,但是在ArrayListIntegerStack可以不需要top用arrList.size()也能实现。拿出栈方法来说:

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

      在eclipse里写两个.java文件,一个是IntegerStack.java,这是一个接口,里面就定义了一堆的方法,在另一个.Java的文件里面在写了class ArrayIntegerStack implements IntegerStack后,点下可以自动生成添加未实现的方法,很快又便利。现在我想加一个方法,在IntegerStack.java文件里面添加就OK了。感觉速度上比不用接口快好多。

    4. Stack and Queue

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

    package week9;
    
    import java.util.LinkedList;
    import java.util.Scanner;
    
    public class Main201621123028{
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		LinkedList<Character> stack1 = new LinkedList<Character>();
    		LinkedList<Character> stack2 = new LinkedList<Character>();
    		String stack =sc.next();
    		for(int i=0;i<stack.length();i++){
    			stack1.addFirst(stack.charAt(i));
    			stack2.addLast(stack.charAt(i));
    		}
    		
    		boolean flag = true;
    		while(!stack1.isEmpty()){
    			if(stack1.peek().compareTo(stack2.peek())==0){
    				stack1.remove(stack1.peek());
    				stack2.remove(stack2.peek());
    			}
    			else
    				flag=false;
    				break;	
    		}
    		if (flag) {
                System.out.println("这是回文!");
            } else {
                System.out.println("这不是回文!");
            }
    		
    			
    
    	}
    
    }
    

    我是用了LinkedList实现。

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

    Queue接口的LinkedList实现类。

    for(i=0;i<N;i++)
    		{
    			int temp;
    			temp=sc.nextInt();
    			if(temp%2!=0){
    				Q1.add(temp);
    			}
    			else
    			{
    				Q2.add(temp);
    			}
    		}
    
    

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

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

    5.1 实验总结

    首先都是按行读取文章,if来判断有没有输入“!!!!!”来判断文章是否结束,接着add进去,TreeSet是可以实现排序的,因为添加进去的不会重复,所以words.size()就是文章不同单词的个数。最后根据单词是否超过10个来实现不同的输出情况就好了。

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

    题集jmu-Java-05-集合之5-3

    6.1 伪代码

    1.读入单词
    2.放入set
    3.获取set的size
    4.进行排序
    5.输出结果

    6.2 实验总结

    统计文字中的单词数量并按出现次数排序(不要出现大段代码)
    按键排序方法相对简单点,本身比较规则就是按键排序的,但是这里会用到按值排序,不能直接排,需要进行如下一个转换:

    然后用到java.util.Collections的一个静态方法实现排序:

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

    7.1 使用集合类改进大作业或者简述你的面向对象设计大作业中,哪里使用到了集合类。

    7.2 进一步完善图形界面(仅需出现改进的后的图形界面截图)

    3.码云及PTA

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

    3.1. 码云代码提交记录

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

    3.2 截图PTA题集完成情况图

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

    3.3 统计本周完成的代码量

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

    周次 总代码量 新增代码量 总文件数 新增文件数
    1 0 0 0 0
    2 571 571 19 19
    3 1029 458 20 1
    4 1029 0 20 0
    5 1359 330 25 5
    6 2061 702 35 10
    7 2653 592 42 7
    8 3315 662 48 6
    9 4171 856 54 6

    选做:4. 使用Java解决实际问题

    尝试为代码统计项目 增加图形界面。

    3.1 设计图形界面(可用纸画)。

    3.2 从该git项目fork一个分支,在该分支上进行你的开发,以后如果开发的好,可以尝试向开发者提出pull request。注意:规划好包名。

  • 相关阅读:
    #3146. 「APIO 2019」路灯
    #3145. 「APIO 2019」桥梁
    #3144. 「APIO 2019」奇怪装置
    雅礼集训2019 D7T2 Subsequence
    Luogu P3600 随机数生成器
    CF 704 D. Captain America
    Luogu P2570 [ZJOI2010]贪吃的老鼠
    Loj #2585. 「APIO2018」新家
    Access denied for user 'root'@'localhost' (using password: NO)
    MySql修改密码
  • 原文地址:https://www.cnblogs.com/bbshenme/p/7816928.html
Copyright © 2020-2023  润新知