1. 本周学习总结

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


2. 书面作业

1. ArrayList代码分析

 1.1 解释ArrayList的contains源代码


:如图,可见contains方法内部调用了indexOf方法,而indexOf方法内部又使用了equals方法将传入的参数与动态数组元素逐一比较判断是否相同,相同则返回相同时数组元素的下标,所以contains方法本质上就是使用了equals方法。

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


:由图,remove方法执行起始先调用了rangeCheck方法,该方法当传入的下标值大于要进行操作的动态数组的长度时,抛出报错信息IndexOutOfBoundsException,否则继续执行remove方法的下一段代码。numMoved用于记录需要左移的元素的个数,其中左移时使用的是System.arraycopy方法。

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

:不需要考虑,因为数组中存放的元素为Object类,而Object类是超级父类,是所有类的父类。

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



当内部数组容量不够时,数组会自行判断进行扩容。
由源代码截图可以看出,add方法内部调用了其他的方法,其他方法也是逐层调用了另外的方法,较为关键的是grow方法grow方法内部定义了两个变量oldCapacitynewCapacity,前者用于记录数组原本的容量,后者为数组新的容量,其中newCapacity在赋值上等于oldCapacity + (oldCapacity >> 1),如果此时新的容量还小于传入的参数minCapacity,则修改newCapacity的值为minCapacity,如果newCapacity大于MAX_ARRAY_SIZE(MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8),则调用hugeCapacity判断是否继续修改容量为Integer.MAX_VALUE,当然一般是用不到这么大的数组容量的。计算好新数组的容量长度应为多大后,执行elementData = Arrays.copyOf(elementData, newCapacity);语句为数组设置新的长度。

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

rangeCheck方法是系统内部用于判断传入的下标参数是否超过了数组的长度,由此决定是否抛出IndexOutOfBoundsException的报错信息,该方法执行的内容只用于其他方法执行时所依赖的判断条件之一,使用者无需知道也无需调用该方法,所以应修饰为private


2. HashSet原理

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

:存储位置通过调用hashCode方法计算出其存储位置。
存储元素时,先调用hashCode方法计算出其存储位置,若此时该位置为空,则直接存入,若该位置不为空,调用equals方法判断当前该位置的元素属性是否与将要传入的元素一致,一致则放弃传入(符合Set不能存放相同的元素的基本规则),不一致则应该是使用类似哈希表的解决冲突方法(开放地址法:1.线性探查法 2.平方探查法 或拉链法)来解决冲突问题。

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

:应是O(1)。将元素放入HashSet中,一般只要直接调用一次hashCode方法便可以直接得到该元素的存放位置,不需要进行多次计算。


3. ArrayListIntegerStack

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

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

:在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack中,内部实现栈方法主要是利用了数组与top指针来实现进栈出栈等操作。使用数组实现内部操作时,由于数组是定长的,因此存在栈满的条件,也就是说,使用ArrayList来实现栈的内部操作时,由于ArrayList的长度可变性,此时的栈则不存在栈满这一情况。此外相比于数组来说,感觉ArrayList在实现出栈操作时更具有优势一些,数组上真正实现元素的删除相比于ArrayList来说还是较为复杂的,ArrayList中仅需调用remove方法即可一步实现出栈操作,感觉还是比较便捷的。

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

:由3.1来看,内部实现方法不同的两种栈各有其各自的优缺点,因而在实际运用过程中,若希望这两种都能被使用到,那么就可以通过创建接口对两种栈的内部方法进行统一的定义。定义后两种栈同时实现该接口后,便可以各自编写自己的内部实现方法,互不影响互不干扰,使用者只需要在调用的时候标明使用的是哪种栈即可。另外,由于实现了接口,两种栈内部方法名及参数完全一致,仅实例化栈时的类名不同,若使用者想要更改具体的实现方法时,不需要修改大段的代码,只需要修改实例化栈的那一句代码即可,提高了效率,降低了工作量。


4. Stack and Queue

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

栈功能的编写

主函数及回文测试

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


:使用了LinkedList这一实现类,由于LinkedList在实现过程中采用的是链表,且包含了addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等方法,比较符合栈和队列的操作,因而在实现栈、队列、双向队列都具有不错的效果。


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

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

5.1 实验总结

:本题中由于要求统计的是出现的不同单词的个数,因而在统计时,判断到相同的单词便可以不作处理,因而使用Set最为合适。另外由于需对所有村放入Set中的单词按字母顺序排序后输出,因而便具体到使用具有排序功能的TreeSet来进行本题的解决。

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

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

6.1 伪代码

  1. 新建Map对象,将文章中单词一一取出;
  2. 判断Map中是否已包含单词,如未包含,则存入该单词,赋Value值为1,如已包含,则将Map中该单词的Value值加1;
  3. 文章读取完毕,将Map中所有元素按Value值进行排序,相同时则对单词的字母进行排序,排序后输出。

6.2 实验总结

:本题与上题不同,因为要统计单词的出现次数,因而就不能再使用Set来做了,所以使用Map。需要注意的是当判断到相同单词时,需修改对应Key的Value值,最后比较输出的时候先比较Value值,Value相同时再比较单词的字母。此外,本题中我还尝试使用了冒泡法来解决,但是提交后会出现如下图的测试点报错,这表明了在时间复杂度上冒泡法还是比较欠缺优势的。


3.码云及PTA

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

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成情况图

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

3.3 统计本周完成的代码量

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

周次 总代码量 新增代码量 总文件数 新增文件数
1 90 90 5 5
2 322 232 11 6
3 652 330 16 5
4 946 294 21 5
5 1347 401 26 5
6 1591 244 28 2
7 2118 527 31 3
8 2627 509 39 8

201621123010《Java程序设计》第8周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. PAT 1057 Stack [难][树状数组]

    1057 Stack (30)(30 分) Stack is one of the most fundamental data structures, which is based on the pr ...

  2. ubuntu update-alternatives

    update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了open jdk和sun ...

  3. 解决maven的依赖总是无法下载完成

    有时候在eclipse里面刚刚导进一个maven项目,但是总是无法完整下载pom文件里面的依赖 主要有两个原因: 1,需要下载的依赖(jar包)需要开发人员给权限(远程仓库的下载权限),这个可以找开发 ...

  4. 53. Maximum Subarray(动态规划 求最大子数组)

      Find the contiguous subarray within an array (containing at least one number) which has the larges ...

  5. Educational Codeforces Round 57 Solution

    A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...

  6. linux 服务器部署的web项目存入数据库的时间不正确

    在linux获取当前时间 date 获取的时间是正常的 ----- java写了个测试类 public class TestDate { public static void main(String[ ...

  7. TED #06# Questioning the universe

    Stephen Hawking: Questioning the universe 1. 第一段: There is nothing bigger or older than the universe ...

  8. 20145329 《网络对抗技术》MS08_067远程漏洞攻击

    MS08_067远程漏洞攻击:shell 实现攻击的前提是:攻击机和靶机在同一个网段下,首先将kali的ip改为与winxp的ip一样,二者能ping通 两台虚拟机: kali ip:192.168. ...

  9. MFC各种属性定义及DLL使用理解

    ps:如果需要使用第三方动态库,需要下面几个因素配置 1.第三方库提供的源文件[C/C++,常规,附加包含目录] 2.动态库[和生成的exe放一起] 3.LIB文件的目录[链接器,附加库目录] 4.L ...

  10. ESXi主机遗忘密码重置密码

    ESXi版本:6.0.0 VMware-VMvisor-Installer-6.0.0.update02-3620759.x86_64-Dell_Customized-A00.iso 使用和服务器系统 ...