作业08-集合

本文深入探讨了Java集合框架中的ArrayList与HashSet的工作原理,包括源码分析、存储机制及算法效率等内容,尤其针对ArrayList的动态扩容机制和HashSet的哈希算法进行了详细说明。

1. 本周学习总结

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

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

1123716-20171111171305325-599228816.png
从图中可以看出contain函数实际调用的是indexof这个函数,而在indexof这个函数中,如果添加的参数存在的话,则返回下标i,否则不存在则返回-1。

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

1123716-20171111173158106-307494528.png
首先用rangCheck来判断数组是否有越界情况,在没有数组无越界的前提下,删除定位点index位置的元素,同时数组自行减一,当最后一个元素被删除时返回NULL。

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

不需要,因为从1.1何1.2的图中可以看出,所有元素的父类都是object类,即超级父类(所有类的父类),所以ArrayList存储数据时需要考虑元素不的具体类型。

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

1123716-20171111175311622-1742513412.png
1123716-20171111175320559-1227102734.png
1123716-20171111175330200-1758141453.png
1123716-20171111175336028-1920790364.png
1123716-20171111175343653-988593278.png
ensureCapacityInternal()方法判断内部数组是否需要扩容,如果需要则使用ensureExplicitCapacity()方法来进行扩容,然后再用Arrays.copyOf()方法将原数组元素拷贝到新的扩容数组当中。

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

1123716-20171111180135403-413033004.png
rangeCheck这个方法只是为了来判断数组是否有越界现象,只需要在ArryList这个类中自行调用判断即可,对其他类没有太大的利用价值。

2. HashSet原理

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

可以通过HashCode()这个函数对所添加的元素计算其哈希值(便是他在链表中的位置),如果该位置已有元素,则调用equal来进行比较,如果相同则不添加,反之,将其添加到该链表的尾部。

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

元素加入HashSet中的时间复杂度为O(1);

3. ArrayListIntegerStack

题集jmu-Java-05-集合ArrayListIntegerStack

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

ArrayListIntegerStack时,是采用ArryList进行数组存储的,其为动态数组,可以制动进行扩容,而ArrayIntegerStack则不行.

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

在实现了IntegerStack接口之后,不论是采用ArryList进行数组存储的还是其他存储方式都可以采用接口中的方法,因为接口是抽象的,其中的方法也是抽象的所以具体实现方法可以因存储方法的不同而有不同的实现

4. Stack and Queue

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

1123716-20171111194548778-1990673146.png
1123716-20171111194605247-540618754.png

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

1123716-20171111201718997-1324298320.png
1123716-20171111201728450-1543000242.png
实现了Queue接口中的LinkList的实现类

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

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

5.1 实验总结

使用TreeSet进行单词字母的排序,然后在放入ArryList容器中进行输出。

3.码云及PTA

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

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)
1123716-20171111205334309-459363801.png

3.3 统计本周完成的代码量

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

周次总代码量新增代码量总文件数新增文件数
22712711010
3386135133
46973112310
51087390252
61728641327
7388721594311
8427138436-7

转载于:https://www.cnblogs.com/1613HZX/p/7819892.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值