1. 本周学习总结

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

2. 书面作业

Q1.ArrayList代码分析

Q1.1 解释ArrayList的contains源代码

ArrayList的contains源代码如下:

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;
}

源代码中主要通过判断参数o是否为null来判断遍历时所用方法。o不为null时,用equals方法进行。而当o为null时,则判断elementData[i]是否为null。

Q1.2 解释E remove(int index)源代码

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));
}

其中RangeCheck()的作用是判断参数index是否超出范围,若检查出要删除的位置如果超出List大小,就显示IndexOutOfBoundsException异常。若没有超出,则删除指定元素,再将位置之后的元素往前移,最后使得size-1的位置的值为null,并使GC clear it。

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

不用,Object类是所有类的父类,而在源代码中的参数都是Object类型的对象。所以ArrayList存储数据时无需考虑元素类型。

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

代码如下:

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}

ensureCapacity()方法,它的作用是用来调整容量,保证elementData内部容量是size + 1。

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);
}

如果超出容量,则调用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倍,也就是说新List的容量是旧的1.5倍,再把旧数组拷贝至新数组。

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

简单来说,用户端并不需要知道remove()的时候具体执行了哪些操作,他们只需要了解最终的结果,这并不是单纯属于代码隐私的问题,而是可以认为对用户端来说这些是无用的信息,设置为private反而利于用户端的使用。

Q2. HashSet原理

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

HashSet存储形式依靠链表数组实现。

当向HashSet中添加一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据该值决定该对象的存储位置,但是如果有两个元素通过equals()方法比较返回true,而它们的hashCode()方法返回值不等,HashSet也会将它们存储在不同的位置。

-- 引用自该博客

Q3. ArrayListIntegerStack

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

5-5-1:

public ArrayListIntegerStack(){
list = new ArrayList<Integer>();
}

使用ArrayList,自身就可以为内部数组进行初始容量赋值并扩容。



4-5-3:

private Integer[] stack;
private int top=0;
public ArrayIntegerStack(int n){
this.stack = new Integer[n];
}

ArrayIntegerStack中则需要自行定义数组的大小,并且需要用top指针来进行删除,输出等操作。

Q3.2 简单描述接口的好处.

对本题来说,两个ArrayIntegerStack方法同名,却是对IntegerStack接口进行不同的实现。所以可以看出接口的好处之一是对要完成功能相似而具体实现方法不同的情况来说,可以用相同的方法名,不同的实现,来根据需求通过不同的方式来实现。

Q4. Stack and Queue

Q4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。

部分代码如下:

public class Main201521123022 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Stack<Character> stack = new Stack<Character>();
Scanner sc = new Scanner(System.in);
String b = sc.next();
for (int i = 0; i < b.length(); i++) {
stack.push(b.charAt(i));
} for (int j= 0; j < b.length(); j++) {
if (stack.pop() == b.charAt(j)) {
System.out.println("是");
break;
}
else {
System.out.println("否");
break;
}
}
}
}

Q4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)

本题通过建立2个队列List1,List2分别存放奇数和偶数,List1输出2个后List2输出1个。当一个队列空时跳出循环,输出剩余元素。

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

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

关键代码如下:

TreeSet<String>jojo=new TreeSet<String>();
int i=0;
for(String e:jojo)
{
if(i==10) break;
System.out.println(e);
i++;
}

5.1 实验总结

使用TreeSet时,其本身有默认排序功能。而HashSet可用作无序的词汇存储。所以本题用TreeSet输出前十位字母即可。

3. 码云代码提交记录

201521123022 《Java程序设计》 第七周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第七周学习总结

    1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...

  2. 201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第七周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...

  3. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  7. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  8. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  9. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  10. 20175317 《Java程序设计》第九周学习总结

    20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...

随机推荐

  1. Node.js 入门简介

    Node.js简介 1.1 简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl鬼才般的把这个V8搬到了服务器上,用于做服务器的软件. Node.js是一个专注于实现高性 ...

  2. ARP协议详解RARP

    简单来说,ARP协议是IP地址转换成MAC地址的协议.链路层协议.过程如下: 1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系. 2:当源主机要 ...

  3. TestNG--入门介绍教程

    阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装Testng TestNG最简单的测试 TestNG的基本注释 TestNG中如何执行测试 使用testt ...

  4. 2015 Tencent 线上模拟测试题

    第一题  下面的程序的输出结果是: A. 134122 B. 123412 C. 14302012 D. 143212 #include <iostream> using namespac ...

  5. Django导入外部js、css、图片等巨大的坑

    初学Django,踩过最大的坑只有之一.至今任然不是很明白. 通常我们导入外部js等文件都是 <script src="myScript.js"></script ...

  6. tomcat调优的几个方面(转)

    tomcat调优的几个方面 和早期版本相比最新的Tomcat提供更好的性能和稳定性.所以一直使用最新的Tomcat版本.现在本文使用下面几步来提高Tomcat服务器的性能. 增加JVM堆内存大小 修复 ...

  7. 【可视化】Echarts3坐标系倒映

    目标: 用echarts实现在一个echarts图表中包含上下两个坐标系 横轴合并在一块.有一种上下对称水映的视觉效果 要点提示:grid 是一个数组 包含两个grid xAxis,yAxis也都是数 ...

  8. openstack配置

    参考林海峰老师的配置教程 http://blog.51cto.com/9161406/1839667

  9. 常用路径 URL 中的斜杠与反斜杠

    常用路径中的斜杠与反斜杠... ------------------------------ 斜杠:反斜杠:======================电脑能识别的斜杠有两种:斜杠分正斜杠(forwa ...

  10. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...