201621123043 《Java程序设计》第8周学习总结
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周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- 浏览器之window对象--javascript
window对象代表打开的浏览器窗口,是Web浏览器所有内容的主容器.window对象是整个对象链条结构的最高层,是其他对象的父对象,在调用window对象的方法和属性时,可以省略window对象的引 ...
- Spring的Bean有哪些作用域?
Spring的Bean有以下五种作用域: 1.singleton:SpringIOC容器只会创建该Bean的唯一实例: 2.prototype:每次请求都创建一个实例: 3.requset:每次HTT ...
- [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- animate 动画滞后执行的解决方案
jQuery动画: animate 容易出现连续触发.滞后反复执行的现象: 针对 jQuery 中 slideUp.slideDown.animate 等动画运用时出现的滞后反复执行等问题的解决方法有 ...
- Django入门-基本数据库API
# 现在系统里还没有 Question 对象 >>> Question.objects.all() <QuerySet []> # 创建新 Question # 在 se ...
- PHP 获取访问来源
原文:http://www.upwqy.com/details/16.html $_SERVER['HTTP_REFERER'] 通过这个全局变量可以获取访问的链接是来源于哪里 比如说从博客园 htt ...
- PAT乙级-1037. 在霍格沃茨找零钱(20)
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...
- serializeArray()获取的表单参数转化成json格式的对象
目标:将serializeArray()这个方法获取的表单对象 转换成json格式 function serializeObject(){ //easyui提交表单 $('#form').form( ...
- kubernetes中kubeconfig的用法
在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式. 以kubectl为例介绍kubeco ...
- 解决html5 canvas 绘制字体、图片与图形模糊问题
html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...