201621123005《Java程序设计》第八次实验总结


  1. 本周学习总结

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

  1. 书面作业

  1. ArrayList代码分析


1.1 解释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;
}

当元素不为null时,调用equals()方法来确定元素是否存在,当存在是返回true,否则返回false

1.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;
return oldValue;
}

先判断数组是否越界,当不越界时,将对应的元素取出来,然后把后面所有的元素往前,最后返回被删除的元素。原来最后一个元素位置为null

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

不需要,因为是用Object数组实现,而Object类又是所有类的父亲,所以不需要考虑。

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

public boolean add(E e) {
ensureCapacityInternal(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);
}

当elementData是默认的长度的空数组的时,就确保数组容量是传入参数和默认长度的最大值。

private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

modCount先自增,当数组容量不够时,调用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);
} private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

所以当数组容量不够时,数组容量会对数组进行自动扩容并把原数组的值拷贝到这个数组中。

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

因为类的用户是不需要知道remove()的时候具体发生了什么,只需要知道是否正确删除就可以了。


2、HashSet原理

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

首先计算哈希码的值即调用hashCode方法,然后根据哈希码查找对应存储位置,如果指定位置已有其他元素,则调用equals方法与已有元素进行比较,如果比较结果为假,则将元素插入,如果为真,则用新的值替换旧的值。

2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)

时间复杂度是o(1),因为添加的时候是通过哈希算法来确定元素的添加位置,判断次数是常量。


3、 ArrayListIntegerStack

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

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

存储方式不同,上次运用数组存储,这次用动态数组,相比动态数组简简洁很多,比如动态数组在获取栈顶元素或出栈都可以直接运用size()来获得栈顶位置,然后进行操作,而数组则需定义一个top指针。

3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。

先定义一个接口,在接口内存放接口的名称,然后在类里面根据所需要的功能去重写这些方法,如果想要修改时就直接在类里面修改,想要增加时就只需要在接口中添加想要的,然后在类里面去编写这个方法,所以就是很方便而且灵活。


4、 Stack and Queue

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

package week9;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; interface IntegerStack{
public Integer push(Integer item);
public Integer pop();
} class ArrayInterStack implements IntegerStack{
private List<Integer> list;
public ArrayInterStack (){
list=new ArrayList<Integer>();
}
@Override
public Integer push(Integer item) {
// TODO Auto-generated method stub
if (item == null)
return null;
list.add(item);
return item; } @Override
public Integer pop() {
// TODO Auto-generated method stub if (list.isEmpty())
return null;
return list.remove(list.size() - 1); }
@Override
public String toString() {
return list.toString();
}
}
public class Main201621123005{
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayInterStack arr=new ArrayInterStack();
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
char ch[]=str.toCharArray();
for (int i = 0; i < str.length(); i++) {
arr.push((int) ch[i]);
}
for (int i = 0; i < ch.length; i++) {
if(ch[i]==arr.pop())
{
System.out.println("huiwen");
break;
} else
{
System.out.println("buhuiwen");
break;
}
}
}
}

4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?

把A,B窗口存放的人放在两个队列

Queue<Integer> dequeA=new ArrayDeque<>();
Queue<Integer> dequeB=new ArrayDeque<>();

根据奇偶入队

if(m%2==0){
{ dequeB.add(m); }
else
dequeA.add(m);
}
}

输出操作

while(dequeA.size()!=0||dequeB.size()!=0){
if(dequeA.size()>=2&&dequeB.size()>=1)
{
//
} else if(dequeA.size()<2&&dequeB.size()>=1){
//
}
else if(dequeA.size()>=2&&dequeB.size()<1)
{
//
}
else
System.out.print(dequeA.remove()); }

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

5.1 实验总结

用Set集时可以避免重复元素进入,而且TreeSet使字符排序。

for (String e : words) {
if(i<10)
{ i++; System.out.println(e);
}
else break; }

用如上来输出排名前十的字符。


6、 选做:统计文字中的单词数量并按出现次数排序

6.1 伪代码

创建HashMap对象map;
读入字符串;
当遇到!!!!!时退出;
当map中不存在word时times=1;
当map中存在word时times+1;
创建ArrayList对象list;
用Collections.sort()排序;
输出map长度;
输出前十个数据;

6.2 实验总结

List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
public int compare(Map.Entry<String,Integer>o1,Map.Entry<String,Integer>o2)
{
if(o1.getValue()==o2.getValue()){
return o1.getKey().compareTo(o2.getKey());
}
if( o1.getValue()>o2.getValue())
return -1;
else
return 1; }
});

这道题是主要把Map中的键值对放进ArrayList,然后用Collections.sort()排序。


3.码云及PTA

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

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图



3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
2 381 381 12 5
3 661 280 19 7
4 974 313 24 5
5 1358 384 33 9
6 2211 853 37 4
7 4623 412 42 5

201621123005《java程序设计》第八次实验总结的更多相关文章

  1. 201621123005《Java程序设计》第九次实验总结

    201621123005<Java程序设计>第九周实验总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 ...

  2. 20145330《Java程序设计》第二次实验报告

    20145330<Java程序设计>第二次实验报告 实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承多态 3.初步掌握UM ...

  3. 20145320《Java程序设计》第二次实验报告

    20145320<Java程序设计>第二次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.12 15: ...

  4. 《Java程序设计》第二次实验报告

    20145220 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测 ...

  5. 20145333 《Java程序设计》第二次实验报告

    2014333 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测试 ...

  6. 20144303 《Java程序设计》第二次实验实验报告

    20144303 <Java程序设计>第二次实验实验报告 北京电子科技学院(besti)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

  7. 20145240 《Java程序设计》第二次实验报告

    20145240 <Java程序设计>第二次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.12 实验 ...

  8. 201621123005《Java程序设计》第十次实验总结

    201621123005<Java程序设计>第十周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1. 常用异常 1.1 自己 ...

  9. Java程序设计第四次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

  10. 201771010123汪慧和《面向对象程序设计JAVA》第八周实验总结

    一.理论部分 1.接口 用interface声明,是抽象方法和常量值定义的集 合.从本质上讲,接口是一种特殊的抽象类. 在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常量和一组抽象 ...

随机推荐

  1. 从零开始写JavaWeb框架(第四章节的AOP)

    使用"链式代理"实现 AOP   本文是<轻量级 Java Web 框架架构设计>的系列博文. 大家是否还记得<Proxy 那点事儿>中提到的 CGLib ...

  2. SAP GUI常用快捷键

    F1:帮助 F2:双击.比如TC行的双击,LIST行的双击等 F3:后退(Back),后退按钮 Shift+F3:退出(Exit),退出按钮 F4:搜索帮助 F8:执行 F10:菜单 F12:取消(C ...

  3. PAT 1112 Stucked Keyboard[比较]

    1112 Stucked Keyboard(20 分) On a broken keyboard, some of the keys are always stucked. So when you t ...

  4. SCons构建工具使用

    scons是一个Python写的自动化构建工具,和GNU make相比优点明显:    1. 移植性:python能运行的地方,就能运行scons    2. 扩展性:理论上scons只是提供了pyt ...

  5. centos7 lua安装

    yum -y install gcc automake autoconf libtool makeyum install readline-develcurl -R -O http://www.lua ...

  6. 关于Serializable的一个形象的例子

    一.知识预备 根据使用Serializable的使用场景,可以发现所涉及的场景都是跨进程的,就是要做的事情不是在一个java进程中完成的,我们都知道java进程是基于jvm跑起来的,而每一个被创建出来 ...

  7. 测试人必备:国内外最好用的6款Bug跟踪管理系统

    在移动互联网产品中,Bug会导致软件产品在某种程度上不能满足用户的需要.确保一个项目进展顺利,关键在于妥善处理软件中的BUG,那么,如何高效的管理BUG,解决BUG?在这里,我为大家搜集了几款优秀的B ...

  8. open-falcon设置报警邮件

    下载编译好的二进制包并解压: https://files.cnblogs.com/files/dylan-wu/mail-provider.tar.gz [root@localhost work]# ...

  9. Android ActionBar自定义

    关于自定义的ActionBar的实现过程,这里做下笔记以供之后查看. 1.默认状态 使用Android Studio新建一个名为“ActionBar”的应用,默认actionbar如图(1)所示. 图 ...

  10. linux下抓包工具tcpdump详解

    本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the ...