201521123026 《java程序设计》第七周学习总结
1. 本章学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
2. 书面作业
Q1.ArrayList代码分析
1.1 解释ArrayList的contains源代码
答:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
//indexOf()方法 返回某个指定的字符串值在字符串中首次出现的位置
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
作用:通过equeals方法判断列表中是否包含指定的不为null的元素,若包含则返回true,否则返回false。
1.2 解释E remove(int index)源代码
答:
public E remove(int index) {
rangeCheck(index);
modCount++;//modCount:用来检查列表中的元素是否发生结构性变化(列表元素数量发生改变)
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//数组复制:从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
elementData[--size] = null;
return oldValue;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//若删除的位置如果超出List的大小size,就抛出IndexOutOfBoundsException异常
作用:删除数组中中指定的元素,并返回所删除的元素。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
答:在java中,ArrayList可以存储任何类型的对象(将所有存储的对象强制转化成Object类型),因此可以在定义ArrayList时,通过使用“<参数化类型>(泛型)”的方式指定存储元素的数据类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
答:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0) //需要的容量比现有数组容量大,就调用grow()方法
grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容,将新容量增加至原来容量的一点五倍(右移一位就是/2)
if (newCapacity - minCapacity < 0)//判断新容量是否足够
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);//数组复制
}
当内部数组容量不够时,会引用一个大小为原来数组大小1.5倍的新数组,并通过数组复制的方法,从而在新的数组内进行add操作。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
答:
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private的主要作用就是封装。rangeCheck方法对数据类型的内部操作来说是必需的,但并不需要让外部能够使用或者是访问,外部只需知道rangeCheck方法的结果。
Q2.HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
答:当向HashSet集合中添加一个对象时,首先调用该对象的hashCode()方法来获得该元素的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则将元素直接存入,如果该位置上有元素存在,则会调用equals()方法,让欲存入的元素依次和当前位置上的元素进行比较,如果返回的结果为false就将元素存入集合,如果返回的结果为true,则说明有重复元素,就将欲存入的元素舍弃。
Q3.ArrayListIntegerStack(题集jmu-Java-05-集合之5-1 ArrayListIntegerStack)
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
答:
ArrayListIntegerStack:使用ArrayList,可看作一个长度可以变化的数组,不需要考虑栈满的情况。
ArrayIntegerStack:数组存储,其存储长度一旦确定无法改变,同时需要一个指针top来确定栈顶元素,由于存储长度已经确定,需要考虑栈满的情况。
3.2 简单描述接口的好处.
答:接口能够使其定义和具体实现方法尽可能分离,能够提高程序的灵活性以及可维护性。实现方法需要改变时,只要接口及接口功能不变,甚至可以在不改动定义代码时将实现方法整个替换掉。(就像我们将一个60G硬盘换成一个160G的硬盘,计算机其他地方不用做任何改动,而是把原硬盘拔下来、新硬盘插上就行了,因为计算机其他部分不依赖具体硬盘,而只依赖一个IDE接口,只要硬盘实现了这个接口,就可以替换上去。)
Q.4.Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
答:
4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。
答:1.实现Queue接口的ArrayDeque类的用法
Q5.统计文字中的单词数量并按单词的字母顺序排序后输出(题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出)
5.1 实验总结
1.TreeSet的用法,通过TreeSet自然排序。
2.Collection.toArray的用法。
Q7.面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
7.2 使用集合类改进大作业
3.本周码云代码Commit历史截图
在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图,如下图所示
最新文章
- chrome启用 NPAPI [转]
- curl_init函数用法
- Piggy-Bank[HDU1114]
- CSS布局总结
- hdu 5594 ZYB&#39;s Prime 最大流
- MySQL中内存分为全局内存和线程内存
- mysql优化之定位问题
- [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)
- Android imageview显示圆形图片
- C++模板:欧拉函数
- 【 D3.js 入门系列 — 2.1 】 选择、插入、删除元素
- Linux下获取硬盘使用情况
- IOS开发-UI学习-UITextField的具体属性及用法
- SublimeText3解决中文乱码
- junit+mock+spring-test构建后台单元测试
- version.go
- Callable,Future和FutureTask详解
- HTCVIVE定位器更新之后,定位器指示灯不亮,重置基站固件操作指南。
- 通过TCPView工具查看foxmail用exchange方式连接exchange时用什么端口
- HDOJ 4267 A Simple Problem with Integers (线段树)
热门文章
- OpenGL与CUDA互操作方式总结
- html&;css笔记(1)
- 导入import com.sun.image.codec.jpeg.JPEGCodec出错
- C/C++遍历文件夹和文件
- hdu 6133---Army Formations(启发式合并+树状数组)
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法一(入门版)
- H5性能测试学习
- Tornado模板
- java面向对象(四)之重写、重载
- Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释