1. 本周学习总结

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

2. 书面作业

ArrayList代码分析

1.1 解释ArrayList的contains源代码



答:从ArrayList的contains源代码中可以看到,contains 方法返回的是indexOf(o) >= 0,而indexOf方法中先是判断传入的对象是否为空,如果为空,比较Arraylist数组中是否有空元素,如果有返回空元素的位置;如果对象不为空,则将该对象与Arraylist中的元素进行比较,如果有equals成功的,则返回该元素的位置;否则返回-1。因此当contains返回的数值大于0时,证明这个对象在Arraylist数组中已经存在了。

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

答:首先rangeCheck(index)判断是否有越界(即超过Arraylist数组的长度); E oldValue = elementData(index)获取index位置开始到最后一个位置的个数, System.arraycopy(elementData, index+1, elementData, index, numMoved);将elementData数组index+1位置开始拷贝到elementData从index开始的空间; elementData[--size] = null; 使长度-1 ,设置elementData的原本的size位置为空。

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

答:不需要。从1.1和1.2的源代码中可以看到其传入的对象是object,Object在Java中被定义为一个顶级父类,它是任何类父类,因此ArrayList存储数据时不需要考虑元素的类型。

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





答:当内部数组容量不够时,首先ensureCapacityInternal方法得到最小扩容量,其次ensureExplicitCapacity判断是否要扩容。
参考资料

>
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181625613-919350759.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181647253-1650872466.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407181709957-1479271663.png)

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

答:用了private使rangeCheck这个方法只能在内部调用,从1.1的源代码可以看到其中remove这个方法就调用了rangecheck这个方法,rangecheck这个方法仅在内部被调用,若生命为public则外部也能调用,若是外部有人调用后改变了该方法的内容,那么整个程序就会错乱,因此用private保证了私有性。

HashSet原理

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

答:计算出带存储的散列码作为存储的位置依据,将对象存入Hash类集合,需要用到hashCode和equals两个方法。

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

答:从源代码中可以看到,hashset中的contain方法返回的是map.containsKey,map.containsKey判断传入的参数有没有对应的value值,有则返回true,没有则返回false。

ArrayListIntegerStack

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

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

05-5-1中的ArrayListIntegerStack

```
private ArrayList list;
public ArrayListIntegerStack(){
list=new ArrayList();//使用了Arraylist
}
public Integer push(Integer item) {
// TODO Auto-generated method stub
if(item==null)
return null;
list.add(item);//用到了add方法
return item;
}
public Integer pop() {
// TODO Auto-generated method stub
if(list.size()==0)
return null;
return list.remove(list.size()-1);//用到remove方法

}
<table><tr><td bgcolor=frech grey>04-5-3中的ArrayListIntegerStack</td></tr></table>
private Integer[]arr;//使用数组
private int top=0;//top指针
public ArrayIntegerStack(int capacity) {
arr=new Integer[capacity];
}
public Integer pop(){
if(top==0)
return null;
top--;//出栈需要移动指针
return arr[top]; }

答:在5-1中编写的ArrayListIntegerStack使用的是ArrayList数组来存放对象,因此相应的push、pop、peek等方法的编写用到了list中的add、remove等方法;5-3中则是用数组来存放对象,并且要有top指针。

**3.2 简单描述接口的好处.**

答:接口有利于代码的复用,便于维护,在做大项目的时候有接口的话,可以并行开发,提高效率。


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

public class Main201521123034 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String x=sc.next();
ArrayListStringStack list=new ArrayListStringStack();//创建两个栈,ArrayListStringStack使用的接口是实验5-1中的IntegerStack改成了StringStack
ArrayListStringStack list1=new ArrayListStringStack();
char [] arr = x.toCharArray();
for(int i=0;i<arr.length;i++){
list.push(String.valueOf(arr[i]));
}
int q=arr.length/2;
int k=arr.length%2;
//分两种情况,一种是字符串长度为奇数,另一种是字符串长度为偶数
if(k==0){
for(int y=1;y<=q;y++){
list1.push(list.pop());//将字符串的后一半入栈
}
for(int b=0;!list.empty()&&!list1.empty();b++){
if(!list.pop().equals(list1.pop())){//出栈比较字符是否相等
System.out.println("该字符串不是回文");
break;
}
if(list.empty()&&list1.empty()){
System.out.println("该字符串是回文");
}
}
}
else{ for(int p=1;p<=q;p++){
list1.push(list.pop()); }
list.pop();//如果长度为奇数,则list要先出栈一次
for(int b=0;!list.empty()&&!list1.empty();b++){ if(!(list.pop().equals(list1.pop()))){
System.out.println("该字符串不是回文");//同样是出栈比较是否相等
break;
}
if(list.empty()&&list1.empty()){
System.out.println("该字符串是回文");
break;
}
}
} } }
<table><tr><td bgcolor=frech grey>运行结果</td></tr></table>
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093430253-1614157548.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093507675-1836721324.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408093530082-1260939366.png) **4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)**
    //创建三个队列,A窗口对应queue2,B窗口对应queue1
Queue<String> queue = new LinkedList<String>();
Queue<String> queue1 = new LinkedList<String>();
Queue<String> queue2 = new LinkedList<String>(); //当奇数的数字只有一个的情况
if(queue2.size()==1&&queue1.size()!=0){
System.out.print(queue2.remove()+" ");
for(;queue1.size()!=0;){
if(queue1.size()==1)
System.out.print(queue1.remove());
else
System.out.print(queue1.remove()+" ");
}
}
else {
//当奇数的数字个数大于1时的情况
for(int p=1;queue2.size()>0;p++){
if(queue2.size()==1&&queue1.size()==0)
System.out.print(queue2.remove());
else
System.out.print(queue2.remove()+" ");
if(p==2&&queue1.size()!=0){
System.out.print(queue1.remove()+" ");
p=0;
}
}
//若queue2队列已经为空,queue1仍有元素时,按顺序输出queue1剩下的元素
if(queue1.size()!=0){
for(;queue1.size()!=0;){
if(queue1.size()==1)
System.out.print(queue1.remove());
else
System.out.print(queue1.remove()+" ");
}
} }

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

TreeSet strSet = new TreeSet();//创建TreeSet对象

strSet.add(str);//将每个单词添加进strSet

String[] arr = strSet.toArray(new String[strSet.size()] );//将Treeset中的元素转成String类型再输出

答:这题是经老师上课提醒后才做出来的,要考虑到字母顺序排序,所以要用到TreeSet排序,还有输入一段文字时要用while循环,当输入为“!!!!”时结束。



**6.1 伪代码**

int n=0;

//输入字符串并且加入map中

while(sc.hasNext()){

String x=sc.next();

if(x.equals("!!!!!"))

break;

if (!map.contains(x))

map.put(x, 1);

else

n=map.get(x)+1;

map.put(x, n);

}

Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() ;//排序

**6.2 实验总结**

答:使用到了映射map,排序需要map转换成list才能调用Collections。


**面向对象设计大作业-改进**
**7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)**
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185517597-1117798919.png) ![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185525816-1454348896.png)
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185536207-961168244.png)

组员:陈凯欣 邱晓娴

本周项目的改动:实现了页面跳转,以及点击按钮实现数量的添加;目前还在研究如何将之前的代码和gui结合在一起,因为这一点还没解决,所以购物车虽然能做得出页面但是没办法完整实现商品数量的显示,另外也还在研究如何把登录的密码改为密文.

**7.2 使用集合类改进大作业**

集合类在一开始设计的时候就有用到

![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170408185739410-1669414707.png)
#3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合 3.1. 码云代码提交记录 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407095102207-1700433581.png) 3.2. PTA实验 ![](http://images2015.cnblogs.com/blog/1109692/201704/1109692-20170407095207957-1193639474.png)

201521123034《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. charAt()的功能

    <script type="text/javascript"> var str="Hello world!" document.write(str. ...

  2. ssh相关问题

    问题1 一般错误信息为:ssh: connect to host localhost port 22: Connection refused 这种错误很主要的一个原因是sshd服务没有启动,先启动ss ...

  3. xhost和DISPLAY

    xhost是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显示 ...

  4. SQL基本之增删查改操作

    1.为表添加主键 alter table <tablename> add primary key(col); 主键添加前: 主键添加后: 2.插入数据 insert into <ta ...

  5. 【.Net Core 2.0 生态】-- 好文收藏

    随笔分类 - .NET Core - dotNet实训营 .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南 .Net Core 2.0 生态(2).NET ...

  6. 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

    选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...

  7. XtraBackup应用说明(支持TokuDB)

    背景: 关于物理备份工具xtrabackup的一些说明可以先看之前写过的文章说明:XtraBackup 安装使用和xtrabackup 使用说明(续),本篇文章将介绍xtrabackup在使用中的注意 ...

  8. java‘小秘密’系列(一)---String、StringBuffer、StringBuilder

    java'小秘密'系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现b ...

  9. sql语句回忆录1-多表连接子查询

    --多表连接查询,在多张表中查询符合条件的记录--注意:给表起简短的别名select * from emp e--给字段起别名:字段名 别名,当别名为数字(包括数字开头)或者有空格时需要用双引号括起来 ...

  10. 设计模式原则(3)--Dependency Inversion Principle(DIP)--依赖倒转原则

    1.定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对接口编程,而不是针对实现编程. 2.使用场 ...