201621123037 《Java程序设计》第8周学习总结
作业08-集合
1. 本周学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
答:
思维导图:

其他-笔记:




2. 书面作业
1. ArrayList代码分析
1.1 解释ArrayList的contains源代码
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) { //找到元素就返回当前位置,否则返回-1
if (o == null) {
//如果o为null,遍历elementData[]数组,查看是否有为null的对象,有则返回下标没有则返回-1
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
//如果o不为null,用equals()去比较数组elementData[] 是否有与o相同的对象,有则返回下标没有则返回-1
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
1.2 解释E remove(int index)源代码
答:
//remove代码
public E remove(int index) {
rangeCheck(index); //检查是否在范围内
modCount++; //初始值为0,代表修改的次数
E oldValue = elementData(index);
//被删除的元素存到oldValue中
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 //将原来最后一个数组元素的位置置为null
return oldValue;
}
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的具体类型吗?
答:不需要,ArrayList在存储数据时,可以将元素类型变成Object类型,故添加不同类型的元素不出错。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
答:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
ensureCapacityInternal这个方法是用来判断是否满了,满了就扩充,代码如下:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // DEFAULT_CAPACITY = 10,默认长度为10
}
ensureExplicitCapacity(minCapacity);
}
如果elementData是默认长度的空数组,就取默认长度和传入的参数的最大值。
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//调用一次自增一次
// overflow-conscious code
if (minCapacity - elementData.length > 0)
//需要的容量比现有数组长度要大的话
grow(minCapacity);
}
如果需要的容量比现有数组长度要大的话,就调用grow()方法,以下为其代码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//向右移动一位
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
答:
源代码:
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size);//抛出异常
}
比如get、add等方法中有调用private void rangeCheck(int index),但是用户不需要知道和调用这个方法,他们只要能够调用类似add这样的方法即可,所以封装起来不被外部类所调用。
2. HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
答:
确定存储位置时,首先需要先计算hashcode的值,锁定要加入的哈希表的位置.
其次,如果该位置没有值,就直接添加进去。
否则用equals()方法判断要加入的值和已存在的值有没有重复,如果没有则添加,有则不添加。
调用到的方法:
hashCode()方法
equals()方法
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)
答:
将元素加入HashSet中的时间复杂度是O(1)不是O(n),由hash表中的元素是无序的,和2.1的加入方法,可得出此结论。
2.3 选做:尝试分析HashSet源代码后,重新解释2.1

答:
对于HashSet中保存的对象,应该注意equals()和hashCosde()方法的重写,并且源码中可以看出用到了HashMap。
映射的关系:把hashCosde()的计算看做Key,数组元素的值看做value。
3. ArrayListIntegerStack
题集jmu-Java-05-集合之ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)


答:
在接口内容相同情况下:
- 04-面向对象的实现类ArrayListIntegerStack中,创建了一个Stack数组,并定义top指针来具体化接口中的方法,实现起来整体代码量冗长繁琐
- 05-集合的实现类ArrayListIntegerStack中,创建的是ArrayList动态数组,可以自己改变数组的大小,并且在对接口方法的实现上直接调用ArrayList中已有的方法,整体简洁明了,代码量少,增加阅读性。
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。
答:
接口的好处:
在本题中可以看出,接口可以只定义而不用写具体内容,这样在继承接口的实现类中就可以根据需求来具体编写代码,更加灵活。
其次如果继承的话,每个子类只能有一个父类,但是接口不同,一个类可以有多个接口,实现起来更加全面。
4. Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈(请利用Java集合中已有的类),但不能使用java的Stack类(具体原因自己搜索)与数组。请粘贴你的代码,类名为Main你的学号。


结果:


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

答:
使用LinkedList实现类
5. 统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (作业中不要出现大段代码)
5.1 实验总结

答:
本题主要利用Set集合,又因为需要按照单词的字母顺序进行排序,所以用TreeSet而不用HashSet.
题目要求输出排序后前十个单词,故可以定义一个count变量进行统计次数,完成输出格式需求。
6. 选做:统计文字中的单词数量并按出现次数排序
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
6.1 伪代码
答:
Map<String,Integer> wordmap = new TreeMap<>();
//创建map对象
if(word.equals("!!!!!")) break
if(map.countiansKey(word))
map.put(word,map.get(word)+1) //重复+1
else
map.put(word,1) //未重复为初始的1
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(wordmap.entrySet());
//改成list对象
Collections.sort(list,new Comprartor<Map.Entry<String,Integer>>() ) //对第二个参数进行排序
for(遍历list前十个)
list.get(i).toString() //输出
6.2 实验总结
答:
这道题用的是Map映射,首先要创建一个Map对象。
然后,运用map.countiansKey()方法来判断当前的单词是否已经存在过,如果存在,则在原来个数基础上+1,如果没有,则放入并从一开始计数。
之后,运用Collections的sort方法,对第二个参数对象进行排序。
最后,对前十个单词进行输出,来满足格式上的需求。
7. 选做 面向对象设计大作业-改进
7.1 使用集合类改进大作业或者简述你的面向对象设计大作业中,哪里使用到了集合类。
答:
在存储商品信息中运用了ArrayList
这周因为特殊原因,没有全部用课堂讲的Java集合类进行修改
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)


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

| 周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 |
| 5 | 1167 | 1167 | 26 | 26 |
| 6 | 1830 | 663 | 32 | 6 |
| 7 | 2282 | 452 | 45 | 13 |
| 8 | 2446 | 164 | 48 | 3 |
| 9 | 2774 | 328 | 56 | 8 |
201621123037 《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 ...
随机推荐
- 001---mysql
Mysql数据库 数据库相关概念 数据库服务器:运行数据管理软件的计算机 数据库:顾名思义数据仓库,是一个文件夹.存储多个文件(数据表) 数据表:对应一个文件,存储在数据库下 数据:对应文件中的每一行 ...
- 浅谈style.height、clientHeight、offsetHeight、scrollHeight
先分别介绍以下,以下资料来自MDN HTMLElement.offsetHeight 是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数. Element.clie ...
- 20155329实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 1实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 2. 初步掌握单元测试 ...
- 20145207《Java程序设计》实验一(Java开发环境的熟悉)实验报告
<Java 程序设计>实验一(Java开发环境的熟悉)实验报告 目录 改变 Java开发环境的熟悉实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自 ...
- 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
<Java程序设计>实验二(Java面向对象程序设计)实验报告 目录 改变 Java面向对象程序设计实验要求 实验成果 课后思考 改变 看了下之前实验二的整体,很搞笑,大图+代码,没了.. ...
- RHCSA-day3
10.配置LDAP客户端 在classroom.example.com上已经部署了一台LDAP认证服务器,按以下要求将你的系统加入到该LDAP服务中,并使用Kerberos认证用户密码: 该LDAP认 ...
- [CF888E] Maximum Subsequence 序列分治
早期作品,不喜轻喷. LG传送门 序列分治板子题. 切这道题用了好长时间,所以想发篇题解作为纪念 . 首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我 ...
- Mac下 Windows 7 虚拟机成功搭建SVN服务器后如何与Xcode建立联系,并上传原始工程的详细步骤
内容中包含 base64string 图片造成字符过多,拒绝显示
- mysql 错误代码 1248
1248 - Every derived table must have its own alias (MYSQL错误) 这句话的意思是说每个派生出来的表都必须有一个自己的别名,给派生表加上一个别名就 ...
- 使用Xamarin实现串口通讯
前几天我写了年度总结,然后有人说让我教一下他Xamarin串口通讯怎么做,其实跟java没有多大区别. 记得我刚开始接到公司这个项目的时候很懵逼,我去看了别的安卓串口工具,都不行我当时是RS232串口 ...