zoukankan      html  css  js  c++  java
  • 第7周-集合

    1. 本周学习总结

    1.1 List接口

    ——按照索引位置排序,可以有重复对象;允许按照索引位置检索对象

    具体实现类:

    • ArrayList—采用长度可变的数组;允许对元素进行快速的随机访问。(随机读取快)
    • LinkedList—采用链表;单独具有可以作为堆栈、队列和双向队列使用的方法。(插入、删除快)

    1.2 Set接口

    ——不按特定方式排序,没有重复对象;有些实现类能对集合中对象按特定方式排序

    具体实现类:

    • HashSet—按照哈希算法来存取集合中的对象,存取速度比较快。(子类:LinkedHashSet类-提高插入删除元素的性能)
    • TreeSet—实现了SortedSet接口,具有排序功能。

    1.3 Map接口(映射表)

    ——每一个元素包含一对键对象(key)_不重复和值对象(value)_可重复;有些实现类能对集合中的键对象进行排序

    具体实现类:

    • HashMap—按照哈希算法来存取键对象。
    • TreeMap—实现了SortedMap接口,能对键对象进行排序(自然排序与客户化排序)。

    2. 书面作业

    1. ArrayList代码分析

    1.1 解释ArrayList的contains源代码

    Answer

    源代码:

    如果列表中包含指定元素(下标>=0),则返回true;否则,(在indexOf中可以看到列表不包含指定元素返回-1)在contains()中返回false。
    

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

    Answer

    源代码:



    作用:移除列表中的指定元素,若不包含指定元素列表不变,若包含指定元素则返回true。
    (1) rangeCheck():顾名思义就是判断是否超出size,超出就抛出异常。
    (2) modCount:"已从结构上修改此列表的次数-更改列表大小从而使正在进行的迭代产生错误的结果",也就是用来判断add()或者remove()等操作是否改变了列表的结构,若改变了就抛出异常(ConcurrentModificationExceptions)。
    (3) arraycopy:从指定源数组中复制一个数组,从index+1到index,即元素前移。
    (4) 最后返回被删除的元素。(clear(size-1)的空间,"let GC do its work")
    >> GC:计算机用语为垃圾回收(Garbage Collection),用于回收内存空间。
    

    Garbage Collection

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

    Answer

    我认为不需要,只要不是存放基本数据类型。因为ArrayList<>中放入对象的类型直属于父类Object。
    

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

    Answer

    源代码:

    (1)ensureCapacityInternal确保容量为size+1;

    (2)如果elementData是默认长度的空数组的话(DEFAULTCAPACITY_EMPTY_ELEMENTDATA),那么数组容量是默认长度(DEFAULT_CAPACITY)和传入参数的最大值;
    (3)容量还是不够用的话,使用grow()方法增加容量;

    (4)int newCapacity = oldCapacity + (oldCapacity >> 1);扩展容量为原来的一半(右移一位),即原来的1.5倍;
    (5)elementData = Arrays.copyOf(elementData, newCapacity);将旧的数组数据复制到新容量的数组中。

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

    Answer

    (源代码在分析remove的时候已经贴过了,不重复。)
    这个应该涉及之前学的封装性吧。作者认为用户没有必要也不可以修改rangeCheck()方法,用户只需要知道这个方法并会使用就可以了;还可以避免使用时不小心更改的情况。
    

    2. HashSet原理

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

    Answer

    (引用PPT)散列表用链表数组实现,每个列表被称为桶。

    元素加入HashSet中则会调用hashCode()取得哈希码,并尝试放入对应的桶中;桶中没有对象就直接放入,有对象就要调用equals()进行比较;若为false则不是重复对象,可收集,若为true,则不予收集。  ****这里放上一个草图:
    

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

    Answer

    源代码:


    本质是HashMap...(待续)

    3. ArrayListIntegerStack

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

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

    Answer
    (1)实现形式:ArrayListIntegerStack使用动态数组;ArrayIntegerStack使用数组。
    (2)关于栈满:ArrayIntegerStack会出现栈满的情况,因为它不可以自动扩容(入栈考虑是否栈满);ArrayListIntegerStack中动态数组会自动扩容。

    3.2 简单描述接口的好处

    Answer
    (1)灵活:同样的接口,不同的实现方法。(ArrayListIntegerStack与ArrayIntegerStack都实现了IntegerStack接口)
    (2)可扩展:上述例子看来,IntegerStack接口还可以有更多的实现方法,只要根据需求定义抽象类的话。
    (3)节省空间,提高效率。

    4. Stack and Queue

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

    Answer
    我的部分代码:

    public class Main201521123094 {
    
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		Stack ch = new Stack();
    		String str1 = new String();
    		while (in.hasNext()) {
    			String str = in.next();
    			for (int i = 0; i < str.length(); i++) {
    				ch.push(str.charAt(i));
    			}
    			str1 = "";
    			for (int i = 0; i < str.length(); i++) {
    				str1 += ch.peek();
    				ch.pop();
    			}
    			if (str1.equals(str)) {
    				System.out.println("是回文");
    			} else {
    				System.out.println("不是回文");
    			}
    			if(str.equals("!!")) break;
    		}
    		in.close();
    	}
    
    }
    

    运行结果:

    不能使用java的Stack类原因:效率慢

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

    Answer

    利用队列分别根据奇偶入队,注意Queue是接口,要用其具体方法。
    

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

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

    5.1 实验总结

    Answer

    这题犯的错误是没有注意"!!!!!"也是字符串,要排除在外;使用TreeSet进行排序,迭代器进行排序后的输出。
    

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

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

    6.1 伪代码

    Answer

    
    

    6.2 实验总结

    Answer

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

    7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

    Answer
    尝试使用表格界面(代码未完全实现)


    7.2 使用集合类改进大作业(待)

    3. 码云上代码提交记录及PTA实验总结_题目集:jmu-Java-05-集合

    3.1. 码云代码提交记录(在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图)

    3.2. PTA实验——实验总结已经在作业中体现,不用写

    编程5-1,编程5-2,编程5-3(选做),编程5-6
    
  • 相关阅读:
    一个强大的json解析工具类
    android存储路径问题
    android界面的滑动切换功能
    mysql数据库
    【hadoop+spark】搭建spark过程
    【设计模式】行为型01策略模式(strategy patten)
    【java爬虫】网络爬虫思路
    maven_nexus私服搭建
    【需要重新维护】Redis笔记20170811视频
    【工具】java 文本文档txt写出记录工具
  • 原文地址:https://www.cnblogs.com/whting/p/6664311.html
Copyright © 2011-2022 走看看