201521123010 《Java程序设计》第7周学习总结
1. 本周学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
参考资料:
XMind

2. 书面作业
①ArrayList代码分析
1.1 解释ArrayList的contains源代码
A:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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;
}
源代码如上。查到的解释为:由源码可知,系统会对ArrayList中的每个元素e调用o.equals(e),方法,若加入ArrayList中有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了下标,那么ArrayList.contains(o)返回下标,否则返回-1。自己理解为:如果o为null,那么就去找elementData[]里是否有为null的对象,有则返回下标,没有则返回-1。如果o不为null,就通过equals去比较elementData[] 中是否有与o相同的对象,有则返回下标没有则返回-1。所以我认为这里判断 o==null 主要就用来确定是否要调用o.equals()。
1.2 解释E remove(int index)源代码
A:
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
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
return oldValue;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
源代码如上。
E remove(int index)源代码所要表达的其实也就是将ArrayList里其中的一个元素删除,这个被删除元素之后的元素都往前移一位。在rangeCheck(int index)里,index也就是被删除元素的索引,通过索引判断元素是否在ArrayList范围内。我理解为以上意思。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
A:
应是不需要考虑的。首先,根据以前的内容可以知道,初始数组的数据类型都为Object类,而所有数据的默认父类也都为Object类,所以对于一个初始数组是不用考虑元素的类型的,Object类会转换各数据的类型。其次,因为ArrayList是一个数组列表,所以满足了以上条件,故ArrayList存储数据时不需要考虑元素的类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
A:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!! 将容量设置为size + 1
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++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//赋予旧容量的1.5倍给新容量
if (newCapacity - minCapacity < 0)//判断新容量是否足够
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity); //引用1.5倍旧容量的新容量指向新数组
}
源代码如上。当数组容量不够的时候,会自动对数组容量进行扩容。而如何进行扩容,先用if来判断是否超出容量,然后用
grow(minCapacity);来进行扩容。其余查阅到的就在代码上进行粗略注释。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
A:
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
设置为private的话外部就不能看到用户也不能获取,从1.1可以看出
rangeCheck(int index)本就在系统内部进行,并且其作用也为保证语句操作在容量范围内,若某个语句操作超过了范围用户也可以直接发现越界,那也就没有用public声明的必要了。
②HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
A:
当向HashSet中存入一个元素时,HashSet会调用该对象的
HashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中存储位置。
查阅可知,HashSet实质上是通过HashMap()来实现的,而对于存放在HashSet中的对象,也需要通过equals()和HashCode()方法结合起来保证其唯一性。
2.2 选做:尝试分析HashSet源代码后,重新解释1.1
A:
HashSet的定义:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
//HashSet继承了AbstractSet,实现了Set接口。
HashSet定义的属性:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
由此可知,HashSet可看为通过一个HashMap存储元素,元素是存放在HashMap的Key中,而Value统一使用一个Object对象。所以每当查找其中某一个对象时,首先会调用对象的hashCode()方法获得该对象的哈希码表,再找到存储区域,之后再用equal()方法比较。所以每次都需重写以上两种方法。而1.1是加入ArrayList中有n个元素,那么会调用n次o.equals(e),每次都只需重写一种方法。
③ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
A:
区别在于,4-5-3:
ArrayIntegerStack为内部数组实现存储。空间固定,会出现栈满的情况。出栈时通过移动指针判断。5-5-1:ArrayListIntegerStack为动态数组实现存储,会自动扩容故不会有栈满。出栈时使用1.2的remove()方法即可。
3.2 简单描述接口的好处.
A:
在java中最好避免重复方法或类,而使用接口可以达到多重继承的目的以解决前一句话的问题。使用接口可以操作不同的类,达到相同方法不同实现这一点。如3.1都继承了IntegerStack接口,这样就可以根据自己的需求,去以不同的方式去实现。
④Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
A:
贴上主函数为:
public class Main201521123010 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
StringStack stack=new ArrayListStringStack();
String hw=sc.next();
boolean flag = true;
for(int i=0;i<hw.length();i++)
{
stack.push(String.valueOf(hw.charAt(i)));
}
for(int i=0;i<hw.length();i++)
{
if(String.valueOf(hw.charAt(i)).equals(stack.pop()))
{
flag=true;
}
else
{
flag=false;
break;
}
}
if (flag) {
System.out.println("Y");
} else {
System.out.println("N");
}
}
}
4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)
A:
while(!l1.isEmpty()||!l2.isEmpty())
{
Integer a1=l1.poll();
if(a1!=null)
{
if(l1.isEmpty()&&l2.isEmpty())
System.out.println(a1);
else
System.out.print(a1+" ");
}
Integer a2=l1.poll();
if(a2!=null)
{
if(l1.isEmpty()&&l2.isEmpty())
System.out.println(a2);
else
System.out.print(a2+" ");
}
Integer b=l2.poll();
if(b!=null)
{
if(l1.isEmpty()&&l2.isEmpty())
System.out.println(b);
else
System.out.print(b+" ");
}
}
最开始不熟练poll方法,写完了大致就一致卡在a1a2的定义上,查阅了相关资料后,知道为获取并移除次队列的头后,便知道直接用就可以了。。
⑤统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
5.1 实验总结
A:
TreeSet<String> set=new TreeSet<String>(); //二叉排序树
if(set.size() < 10) //若小于十个 全输出
for(String str : set)
{
System.out.println(str);
}
else
{
for (int i = 0; i < 10 ; i++) //输出前十个
{
System.out.println(set.toArray()[i]); //转换为数组输出
}
排序问题用TreeSet就好了,因为是要按字母排序,TreeSet会默认排好序的。
⑦面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
A:
能力有限。。。做不完那么多。。。
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2. PTA实验
编程(5-1, 5-2, 5-3(选做), 5-6)
实验总结已经在作业中体现,不用写。
201521123010 《Java程序设计》第7周学习总结的更多相关文章
- 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 ...
随机推荐
- Loadrunner结果分析中连接图没有数据的设置
场景进行中,或者之后进行结果分析中,连接图表没有数据,取消选择标记选项.
- 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
什么是ThinkSNS+ ThinkSNS(简称TS)始于2008年,一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+.新的产品名 ...
- Oracle 高水位线和全表扫描
--Oracle 高水位线和全表扫描--------------------------2013/11/22 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至 ...
- Discuz 7.2 faq.php漏洞分析
漏洞发生在页面faq.php中,源码如下: elseif($action == 'grouppermission') {ksort($gids); $groupids = array(); forea ...
- JavaJavaScript小问题系列之JSON解析
1.错误消息及截图 这个很搞笑也很纠结,今天一开发妹子,发现一个问题: 服务端返回字符串"{\"phone\":\"15000000000\"}&qu ...
- 利用Arduino快速制作Teensy BadUSB, 攻击计算机
BadUsb介绍 BadUSB是计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在2014年的BlackHat安全大会上公布. 虽然已隔一两年,但还是有 ...
- Orleans的集群构建
Orleans的集群构建 这是Orleans系列文章中的一篇.首篇文章在此 听闻一周前,微软公布了.net core2.0,以及各种各样的其他core2.0.大家都很兴奋.微妈的诚意真是满满的.这次开 ...
- nGrinder 简易使用教程
背景 性能压测工具之前使用的是jmeter,这次说的是nGrinder,先直接搬运两者之间的比较 比较点 JMeter nGrinder 结果 实现语言 Java Java = License Apa ...
- ExtJs6获取form里的数据
1.PanoramForm.js form的items部分 items: [{ xtype: 'form', id:'customerF', modelValidation: true, defaul ...
- poj2828 Buy ticket
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...