201621123010《Java程序设计》第8周学习总结
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方法内部定义了两个变量oldCapacity与newCapacity,前者用于记录数组原本的容量,后者为数组新的容量,其中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 伪代码
- 新建Map对象,将文章中单词一一取出;
- 判断Map中是否已包含单词,如未包含,则存入该单词,赋Value值为1,如已包含,则将Map中该单词的Value值加1;
- 文章读取完毕,将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周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- IDEA安装以及项目初始化
首先安装idea: 如果15.0版本安装不上就安装16.0: 点击安装文件以后,一直点下一步就可以了. 安装完成后设置: 如果没有的话,需要点击SDKs,点击+,然后选择电脑上安装的JDK. 接下来创 ...
- 【查看】mysql 常规书写注意事项(那些坑)
mysql 常规书写注意事项,mysql注意事项 1. 注释: -- 后面一定要加一个空格,否则会报错 2.注释:/*! content */ 在mysql中是会执行的,但是其他数据库不会. 例 ...
- C#基础笔记(第九天)
1.面向过程<-->面向对象面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 面向对象:找个对象帮你做事儿.意在写出一个通用的代码,屏蔽差异. 每个人都有姓名,性别,身高 ...
- jQuery Form
https://github.com/jquery-form/form#type 概念 jQuery表单插件允许您轻松,无差错地升级HTML表单以使用AJAX. 主要方法ajaxForm和ajaxSu ...
- ThinkPhp3.2.3 多项目 后台 APP接口设计 框架设计
↓↓↓项目文件组成部分↓↓↓ APP文件是后台,index.php是入口文件 Interface文件是接口,注意这里不要用api命名!可能会有问题!interface.php是入口文件 注:两个入口文 ...
- gitlab卸载
1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里写的是gitlab-ce) rpm -e gitlab-ce 3.查看gitlab进程 ps aux | grep ...
- Red Hat Linux相关产品iso镜像下载
Linux系统各发行版镜像下载(持续更新) http://www.linuxfly.org/post/659/ http://www.linuxidc.com/Linux/2007-09/7399.h ...
- VS2010/MFC编程入门之十九(对话框:颜色对话框)
鸡啄米在上一节中为大家讲解了字体对话框的使用方法,熟悉了字体对话框,本节继续讲另一种通用对话框--颜色对话框. 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜 ...
- ehcache实现页面整体缓存和页面局部缓存
之前写过spring cache和ehcache的基本介绍和注解实现缓存管理,今天记录下web项目的页面缓存技术. 页面缓存是否有必要?. 这样说吧,几乎所有的网站的首页都是访问率最高的,而首页上的数 ...
- scss使用指南--每天一点
我们平时都称之为 Sass,其实可分成sass和scss, 其中Sass 是以严格的缩进式语法规则来书写,不带大括号({})和分号(;),以".sass"后缀为扩展名:而 SCSS ...