1. 本周学习总结

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

contains的源代码如下

public boolean contains(Object o) {
        return indexOf(o) >= 0;
}
public int indexOf(Object o) {      //遍历元素看是否存在元素“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;
    }            

由源代码可见,contains函数是调用indexOf(o)方法 ,而indexOf(o)里面又调用equals()方法

最终函数的功能是:如果此列表中包含指定的元素,则返回 true,否则返回false。

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

remove(int index)源代码如下

  public E remove(int index) {
        rangeCheck(index);

        modCount++; //修改次数+1
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved); //System类中的一个本地方法复制
        elementData[--size] = null; // 删除数组最后一个元素并修改大小
        return oldValue;
}
 private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

由源代码可知:先调用了rangeCheck方法来判断数组是否越界,再删除指定位置的元素 ,并且修改数组长度。

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

不需要,因为数组中存放的元素的类型为Object类型(超级父类)

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

//将数据添加尾部的add方法
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
}
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);
    }

首先调用了ensureCapacityInternal方法判断是否要进行数组的扩容,在调用调用ensureExplicitCapacity实现数组的扩容。最后再修改对象数组的长度。ArrayList对象没有指定长度时,初始容量会初始化为10.

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

rangeCheck(int index)用来判断数组是否越界,只需在romove类里使用,所以声明private就好啦

2. HashSet原理

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

先调用hashCode方法计算元素的哈希码值,然后由哈希码的值算出元素的存储位置

如果指定的位置没有值的话,则将元素添加到哈希表中,

但是如果算出的位置上已经有了一个值的话,就要调用equals方法比较该位置上的值和待加入的值

如果两个值相同则不将元素添加进哈希表,因为HashSet不会存储重复的元素,如果两个值不同

就使用解决冲突的方法将元素添加到相应的哈希表的位置中。

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

O(1),因为是以哈希表实现的,无序的

2.3 选做:尝试分析HashSet源代码后,重新解释2.

3. ArrayListIntegerStack

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

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

主要是储存方式的不一样,一个是用数组储存元素,一个则是用动态数组来储存。因为储存方式的不一样,导致类中的方法的实现方式不一样,两种本质上思路是差不多的。

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

本题是先定义了一个栈的接口里面放一些栈的方法名定义,然后在定义一个栈的方法具体实现类,最后再用Main调用自定义栈类。

这样的好处是:代码结构清晰,简单易懂,易于维护和拓展,增强了代码的灵活性。

4. Stack and Queue

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

//接口定义
public interface CharStackFace {

    public char push(char a);
    public char pop();
    public char peek();

}
//接口的实现类
import java.util.ArrayList;
import java.util.List;

public class CharStack implements CharStackFace {

    List<Character>  ArrList = new ArrayList<Character>();

    public char push(char a) {

        if(ArrList == null)
            return 0;
        ArrList.add(a);
        return a;

    }

    public char pop() {
        if(ArrList.isEmpty())
            return 0;

        return ArrList.remove(ArrList.size()-1);

    }

    public char peek() {

        if(ArrList.size()==0)
            return 0;
        return ArrList.get(ArrList.size()-1);
    }

    @Override
    public String toString() {
        return ArrList.toString();
    }

}
//判断是否回文的Main函数
import java.util.Scanner;

public class Main201621123043 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        CharStack CS1 = new CharStack();
        CharStack CS2 = new CharStack();
        CharStack CS3 = new CharStack();

        String  str = sc.nextLine();
        char[] s = str.toCharArray();

        for(int i=0; i<s.length;i++) {
             CS1.push(s[i]);

        }
        for(int i=0; i<s.length;i++) {
             CS3.push(s[i]);

        }
        for(int i=0; i<s.length;i++) {

           CS2.push(CS3.pop());
        }
        if(CS1.toString().equals(CS2.toString()))
          System.out.println("回文");
        else
            System.out.println("不回文");

    }

}





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

//两个队列的定义
Queue<Integer> listA = new LinkedList<Integer>();
Queue<Integer> listB = new LinkedList<Integer>();
//入队操作
for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            if (a % 2 == 1)
                listA.add(a);
            else
                listB.add(a);

        }
//业务处理
while(!qA.isEmpty()&&!qB.isEmpty()){//A和B队列煤油同时都为空

            if(!qA.isEmpty()){              //A队列不为空
                System.out.print(qA.poll()+" ");
                if(!qA.isEmpty())           //A队列一次输出两个
                    System.out.print(qA.poll()+" ");
            }

            Integer i = qB.poll();
            if(qA.isEmpty()&&qB.isEmpty())
                System.out.print(i);   //对最后一个元素做特殊处理
            else
                System.out.print(i+" ");
        }

        while (!qA.isEmpty()) {
            for (int i = 0; i < qA.size() - 1; i++) {
                System.out.print(qA.poll() + " ");
            }
            System.out.print(qA.poll());

        }
        while (!qB.isEmpty()) {
            for (int i = 0; i < qB.size() - 1; i++) {
                System.out.print(qB.poll() + " ");
            }
            System.out.print(qB.poll());

        }
    }

}

使用了Queen 的LinkedList实现类

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

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

5.1 实验总结

1.使用TreeSet来存储数据,其不仅具有具有排序功能且能够不添加重复的元素

Set <String> words = new TreeSet<>();

2.使用next()方法可不用分割字符,直接输入一个单词便存入TreeSet中

3.遍历TreeSet并输出(注意输出前十个单词的方法)

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

        }
        

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

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

6.1 伪代码

6.2 实验总结

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

7.1 使用集合类改进大作业或者简述你的面向对象设计大作业中,哪里使用到了集合类。

7.2 进一步完善图形界面(仅需出现改进的后的图形界面截图)

参考资料:

JTable参考项目

3.码云及PTA

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图

3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 488 488 23 23
6 488 0 23 0
7 1292 804 42 19
8 1630 338 45 3
9 1798 168 53 8

需要将每周的代码统计情况融合到一张表中。

选做:4. 使用Java解决实际问题

尝试为代码统计项目 增加图形界面。

3.1 设计图形界面(可用纸画)。

3.2 从该git项目fork一个分支,在该分支上进行你的开发,以后如果开发的好,可以尝试向开发者提出pull request。注意:规划好包名。

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

  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. RobotFramework下的http接口自动化Set Request Header 关键字的使用

    Set Request Header 关键字用来设置http请求时的请求头部信息. 该关键字接收两个参数,[ header_name | header_value ] 示例1:设置http请求时的Re ...

  2. C#多线程编程(3)--开启子任务

    上一篇我讲解了await和async关键字,这两个关键字的作用是将async限定的方法中await关键字后面的部分封装成一个委托,该委托会在await修饰的Task完成后再执行.简单的说,就是等待任务 ...

  3. php 目录处理函数

    之前我们处理的全都是文件,那目录和文件夹怎么处理呢? 我们就来学习目录或者称为文件夹的处理相关函数. 处理文件夹的基本思想如下: 1.读取某个路径的时候判断是否是文件夹 2.是文件夹的话,打开指定文件 ...

  4. VHDL和verilog应该先学哪个?

    网上有太多的VHDL和verilog比较的文章,基本上说的都是VHDL和verilog之间可以实现同一级别的描述,包括仿真级.寄存器传输级.电路级,所以可以认为两者是等同级别的语言.很多时候会了其中一 ...

  5. html学习第二弹の表格的使用方法

    >创建表格的四个元素: table.tbody.tr.th.td 1.<table>-</table>:整个表格以<table>标记开始.</table ...

  6. ccd引脚

  7. 【python学习笔记】2.列表和元组

    # 第二章:列表和元组   序列中,每个元素都有个一个序号,序号以0开始,最后一个元素序号为-1,倒数第二个-2 序列类型包括,列表,元组,字符串,unicode字符串,buffer, xrange ...

  8. python 检测nginx状态,若无法访问发邮件通知

    应用场景:用来检测网站可用性,访问失败,则发邮件通知 #!/usr/bin/env python import urllib2,time,smtplib,string,logging from con ...

  9. 进程优化工具Process Lasso Pro 8.4官方版+激活破解方法

    Process Lasso是一款来自美国的系统进程优化工具,基于特殊算法动态调整进程的优先级别,通过合理的设置进程优先级来实现降低系统负担的功能.可有效避免蓝 屏.假死.进程停止响应.进程占用 CPU ...

  10. WebCracker4.0和monster字典——路由器登陆密码破解工具

    路由器登陆密码破解,很伤cpu的