第7周-集合

1. 本周学习总结

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

参考资料:

XMind

——————————————————————————————————————————————————————————

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

answer:

首先,打开ArrayList的contains源代码:



其中可以发现这句话:Returns true if this list contains the specified element.字面上的意思呢(当然我也只能解释出字面上的意思),就是说“如果此列表包含了指定的的元素,就返回true”

而打开JDK Documentation,有可以发现更确切的解释:“当且仅当此列表包含至少一个满足 (onull ? enull : o.equals(e)) 的元素 e 时,则返回 true。”

——————————————————————————————————————————————————————————

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

answer:

打开源代码:

其中的注释Removes the element at the specified position in this list.:“将列表中的指定元素移除。”以及Shifts any subsequent elements to the left:“将之后的元素向左移动”,其中真正起到这句话作用的语句是int numMoved = size - index - 1;

而这段源代码最后还有一段看似无关的代码:

 if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
//因为经过移动,ArrayList的某个位置空了出来,所以需要加个这个多余的位置置为null

JDK Documentation解释:

——————————————————————————————————————————————————————————

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

answer:

(1)ArrayList储存的数据类型都是Object类,而Object类是所有类的父类,所以不需要考虑。

(2)而1.1与1.2的源代码中,并没有对ArrayList的数据类型有任何定义,所以不需要考虑。

——————————————————————————————————————————————————————————

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

answer:

add源代码:

public boolean add(E paramE)
{
ensureCapacityInternal(this.size + 1); // 检查当前集合中是否有空间可以装下新的元素
this.elementData[(this.size++)] = paramE; // 如果空间不够了,会自动扩容
return true;
// 注:ArrayList会分配连续的内存片段来储存集合的元素,因为内部其实是数组
}
———————————————————————————————————————————————————————————————————————————————————
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); //增加数组容量
} ArrayList的add方法是在已存在的定长的集合中添加元素,当集合装满了,会在添加元素之前进行扩容。

http://blog.csdn.net/cchengone/article/details/52174140

——————————————————————————————————————————————————————————

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

answer:

private void rangeCheck(int index)源代码:

    /**
* Checks if the given index is in range. If not, throws an appropriate
* runtime exception. This method does *not* check if the index is
* negative: It is always used immediately prior to an array access,
* which throws an ArrayIndexOutOfBoundsException if index is negative.
*/
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

使用private声明,说明此方法只在代码内部进行,而不能被用户获取到,而外部确实也没有用到这个方法的地方,这个方法主要是限制语句的操作范围,让使用者可以清晰地发现自己的语句操作越界,而这个rangeCheck操作主要是在代码内部进行,因此没必要使用private。

——————————————————————————————————————————————————————————

2. HashSet原理

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

answer:

(1)HashSet被称为集合,只能存储不重复的对象。

内部存储过程为:

(2)当HashSet存储对象时需重新对象对应的类中的equals()方法和hashCode()方法。

——————————————————————————————————————————————————————————

2.2 选做:尝试分析HashSet源代码后,重新解释1.1

answer:

/**
* 如果此set中尚未包含指定元素,则添加指定元素。
* 更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2))
* 的元素e2,则向此set 添加指定的元素e。
* 如果此set已包含该元素,则该调用不更改set并返回false。
*
* 底层实际将将该元素作为key放入HashMap。
* 由于HashMap的put()方法添加key-value对时,当新放入HashMap的Entry中key
* 与集合中原有Entry的key相同(hashCode()返回值相等,通过equals比较也返回true),
* 新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变,
* 因此如果向HashSet中添加一个已经存在的元素时,新添加的集合元素将不会被放入HashMap中,
* 原来的元素也不会有任何改变,这也就满足了Set中元素不重复的特性。
* @param e 将添加到此set中的元素。
* @return 如果此set尚未包含指定元素,则返回true。
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

http://www.cnblogs.com/ITtangtang/p/3948538.html

——————————————————————————————————————————————————————————

3. ArrayListIntegerStack

题集jmu-Java-05-集合之5-1 ArrayListIntegerStack

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

answer:

关键不同点在于

05-5-1:

private List<Integer> list;
public ArrayIntegerStack() {
list = new ArrayList<Integer>();
}//使用ArrayList存储,可自动扩容

04-5-3:

private Integer[] stack;
private int num; public ArrayIntegerStack(int n) {
this.stack = new Integer[n];
} //使用内部数组,需提前定好数组大小

——————————————————————————————————————————————————————————

3.2 简单描述接口的好处.

answer:

就这题而言,虽然 两个ArrayIntegerStack方法同名,但却都是对IntegerStack接口进行不同的实现,而接口的好处就是在功能相类似具体方法又不同时,可以使用相同的方法名,不同的实现,从而根据自己的需求,通过不同的方式来实现。

——————————————————————————————————————————————————————————

4. Stack and Queue

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

answer:

public class Main201521123084 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Stack<Character> stack = new Stack<Character>();
Scanner scanner = new Scanner(System.in);
int a = 1;
String string = scanner.next();
for (int i = 0; i < string.length(); i++) {
stack.push(string.charAt(i)); //入栈
} for (int j= 0; j < string.length(); j++) {
if (stack.pop() != string.charAt(j)) {
//一个个出栈并与字符串进行对比
System.out.println("no");
break;
}
else {
System.out.println("yes");
break;
}
}
}
}

——————————————————————————————————————————————————————————

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

**answer:**
这题使用了ArrayDeque(双向队列),其中关键poll()方法:获取并移除此双端队列所表示的队列的头(换句话说,此双端队列的第一个元素)。 关键代码: for (int i = 0; i < n; i++) {
if(q1.size() == 2){
System.out.printf(q1.poll()+" "+q1.poll()+" ");
if(q2.size()>=1)
System.out.printf(q2.poll()+" ");
}
if(number[i]%2 == 1)
q1.add(number[i]);
else
q2.add(number[i]);
}
while(q1.size()>1)
System.out.printf(q1.poll()+" ");
if(q1.size()==1)
System.out.printf(q1.poll()+"");
while(q2.size()>1)
System.out.printf(q2.poll()+" ");
if(q2.size()==1)
System.out.printf(q2.poll()+"");

——————————————————————————————————————————————————————————

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

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

5.1 实验总结

answer:

本题使用了TreeSet。

Set<String> strSet = new TreeSet<String>();
int n = 10;
while (scanner.hasNext()) {
String str = scanner.next();
if (str.equals("!!!!!"))
break;
else if(!strSet.contains(str))
strSet.add(str);
}
System.out.println(strSet.size());
strSet.toArray();
if (strSet.size() <= 10) {
for (String s : strSet) {
System.out.println(s);
}
}
else
for (String s : strSet) {
if ( n-- <= 0)
break;
System.out.println(s);
}

——————————————————————————————————————————————————————————

6. 选做:加分考察-统计文字中的单词数量并按出现次数排序

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

6.1 伪代码

answer:

  

遍历text的每一个单词

建立map映射;

if(str重复出现)

键值+1

else

键值=1

6.2 实验总结

——————————————————————————————————————————————————————————

7. 面向对象设计大作业-改进

7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

answer:

上一次完成了登陆界面和结算界面,这次利用老师给的JTable框架改动我们的购物车,界面如下

——————————————————————————————————————————————————————————

7.2 使用集合类改进大作业

answer:

前面的购物车是用ArrayList进行商品信息的存储,而本周学习了集合,集合类有List,Set,Queue,Map,而实际上,Queue类没办法或者说没有必要应用到购物车或者商品信息的存储上。Set则可以用来检查购物车内是否有相同商品。Map则是用来给商品排序。。。。。然而我都结合不了( ╯□╰ ),感到非常的羞愧。

——————————————————————————————————————————————————————————

3. 码云上代码提交记录及PTA实验总结

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

3.1. 码云代码提交记录

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

——————————————————————————————————————————————————————————

3.2. PTA实验

  • 编程(5-1, 5-2, 5-3(选做), 5-6)
  • 实验总结已经在作业中体现,不用写。

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

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

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

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

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

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

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

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

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

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

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

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

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. C#使用Xamarin开发可移植移动应用目录

    Xamarin.Android系列 C#开发移动应用系列(1.环境搭建) C#开发移动应用系列(2.使用WebView搭建WebApp应用) C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知 ...

  2. 送你一双看见时间的眼睛--时间master软件

    开篇语 最近感觉自己时间管理非常错乱,所以去网上找了一些有关于时间管理的软件.然后发现了好几款还不错的软件或者是微信上的应用,下面我把我的一些使用情况以及如何使用的方法写出来,给有需要的朋友进行借鉴! ...

  3. mysql的内连接,外连接(左外连接,右外连接)巩固

    1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...

  4. FastJson将json解析成含有泛型对象,内部泛型对象再次解析出错的解决办法(Android)

    折腾小半天的问题,这里先感谢一下深圳的小伙子,远程帮我搞,虽然也没有搞出来==========FUCK 声明:Android开发下发生此异常,Java开发下并不会有这个问题 异常重现 简单说一下抛出异 ...

  5. ubuntu下apache2-php-mysql的环境配置

    基本的支持环境.暂时还不应用zend优化,因此这里就不涉及到zend optimizer的安装了.其实在ubuntu系统中中安装远比在windows系统中设置更为容易,而且在终端下设置更省事. 1.安 ...

  6. vue中将汉字按照首字母排序,也适用于其他地方,但不适用多音字

    1,.定义数组,可以是从后台传回的数据,也可以是自己写的数据(要json格式) 2.定义一个计算属性,用于将汉字排序(多音字的排序不推荐用这个) 3.在页面渲染

  7. java调用copy复制子文件夹及文件到指定目录(非xcopy)

    因为作所以烦因为烦所以快乐...(为什么不先查一下有没有现成的命令,后悔啊!!) 不知道有xcopy这个命令就自己想写个复制子目录和文件的功能...以下故事诞生了 是这样的,昨天在学校弄的半成品,半成 ...

  8. 物体自由落体动态模拟(Linear Subspace)

    三维物体变形方法赋予了模拟物体的动态特性,但是随着物体模型的复杂度慢慢增加,对高质量的实时变形方法也提出了更高的要求.对于高精度的大型三维网格而言,通常会设计一个低精度的子网格,并构建子网格与原始网格 ...

  9. SSH框架通过JFreeChart实现柱状图和获取项目路径

    获取项目路径:String url= ServletActionContext.getRequest().getRealPath("/upload"); 一.直接生成的图片输出到j ...

  10. 【JVM】tomcat参数调整

    tomcat启动慢,无法获得随机数 (1)在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom (2)打开$JAVA_PATH/jre ...