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. 浏览器之window对象--javascript

    window对象代表打开的浏览器窗口,是Web浏览器所有内容的主容器.window对象是整个对象链条结构的最高层,是其他对象的父对象,在调用window对象的方法和属性时,可以省略window对象的引 ...

  2. Spring的Bean有哪些作用域?

    Spring的Bean有以下五种作用域: 1.singleton:SpringIOC容器只会创建该Bean的唯一实例: 2.prototype:每次请求都创建一个实例: 3.requset:每次HTT ...

  3. [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  4. animate 动画滞后执行的解决方案

    jQuery动画: animate 容易出现连续触发.滞后反复执行的现象: 针对 jQuery 中 slideUp.slideDown.animate 等动画运用时出现的滞后反复执行等问题的解决方法有 ...

  5. Django入门-基本数据库API

    # 现在系统里还没有 Question 对象 >>> Question.objects.all() <QuerySet []> # 创建新 Question # 在 se ...

  6. PHP 获取访问来源

    原文:http://www.upwqy.com/details/16.html $_SERVER['HTTP_REFERER'] 通过这个全局变量可以获取访问的链接是来源于哪里 比如说从博客园 htt ...

  7. PAT乙级-1037. 在霍格沃茨找零钱(20)

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...

  8. serializeArray()获取的表单参数转化成json格式的对象

    目标:将serializeArray()这个方法获取的表单对象  转换成json格式 function serializeObject(){ //easyui提交表单 $('#form').form( ...

  9. kubernetes中kubeconfig的用法

    在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式. 以kubectl为例介绍kubeco ...

  10. 解决html5 canvas 绘制字体、图片与图形模糊问题

    html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...