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 ...
随机推荐
- 什么是IAT重定向
例壳:telock 0.98 仅允许非商业转载,转载请注明出处
- Exceptionless 本地部署踩坑记录
仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...
- 开源社群系统ThinkSNS+安装部署演示视频!
社群系统TS+一期版本发布之后,很多小伙伴们反馈安装部署有些困难,那么今天由我们的颜值与技术实力担当乔斌大佬通过录制视频的形式,给大家演示一下部署的整个过程,录制过程中有些杂音,请各位尽情谅解,后续我 ...
- .NET并行计算和并发2-Foreground and Background Threads
后台线程不会使托管执行环境处于运行状态,除此之外,后台线程与前台线程是一样的. 一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭.
- ssh相关问题
问题1 一般错误信息为:ssh: connect to host localhost port 22: Connection refused 这种错误很主要的一个原因是sshd服务没有启动,先启动ss ...
- javascript中的时间版运动
前面的话 速度版JS运动是指以速度为参照,随着路程的变化,时间随之变化:而时间版JS运动是指以时间为参照,随着路程的变化,速度随着变化.相较而言,时间版JS运动更为常用.JQ的animate就是时间版 ...
- Navicat查询哪些表有指定字段名
通常需要查询某个字段来自于哪张表,在navicat中没有直接查哪些表有指定字段名的功能,只能用sql来查. 1.(按字段名查表)查询哪些表有指定字段名(比如查字段名article_id)的SQL: S ...
- linux系统参数调优
执行 ulimit -a 查看系统配置 需要修改max user processes 和 open files 这两个值 vim /etc/security/limits.conf #新增下面几行 ...
- WeQuant交易策略—网格交易
网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...
- 关于 struts2 Unable to load configuration. - action
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...