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. docker搭建oracle 11.2.0.3.0

    dockerfile 如下: FROM oraclelinux:-slim ARG ORACLE_BASE=/opt/oracle ARG ORACLE_HOME=/opt/oracle/produc ...

  2. 统计编程的框架与R语言统计分析基础——摘(1)

    清屏命令ctrl+L 一.基础 1.产生数据结构 a.直接输入 b.冒号,1:10 c.seq函数 d.rep函数 > 1:10 [1] 1 2 3 4 5 6 7 8 9 10 > 10 ...

  3. 1.2、Django 视图与网址__进阶

    Django 视图与网址进阶 1.1.简单使用: 把我们新定义的app加到settings.py中的INSTALL_APPS中 修改 HelloDjango/HelloDjango/settings. ...

  4. C#之父

    来自为知笔记(Wiz)

  5. mongodb安装及副本集搭建

    mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...

  6. C# 多线程编程第一步——理解多线程

    一.进程.线程及多线程的概念 什么是多线程呢?不理解. 那什么是线程呢?说到线程就不得不说说进程.我在网上搜索也搜索了一些资料,大部分所说的进程其实是很抽象的东西.通俗的来讲,进程就是一个应用程序开始 ...

  7. #C++初学记录(阶乘#递归)

    练习题目三 用递归进行阶乘 运行代码 #include<iostream> using namespace std; int f(int n); int n; int main() { c ...

  8. 002-字段不为null

    1.尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,强烈建议where涉及的列,不要留空,创建表时赋予初始值. 比如 select id from ...

  9. A Practical Guide to Support Vector Classi cation

    <A Practical Guide to Support Vector Classication>是一篇libSVM使用入门教程以及一些实用技巧. 1. Basic Kernels: ( ...

  10. docker 容器目录挂载 | 进出容器

    docker run --name wnginx -d -p 9001:80 -v /home/www:/usr/share/nginx/html nginx --name   别名 -d      ...