Week08《Java程序设计》第八次学习总结
Week08《Java程序设计》第八次学习总结
1. 本周学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
答:
2.书面作业
1. ArrayList代码分析
1.1 解释ArrayList的contains源代码
答:
- 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;
}
public boolean equals(Object obj) {
return (this == obj);
}
- 从上可以看出,contians方法是先判断对象是否为null,对象为空,就返回列表中第一个null的索引,如果对象不为空就与列表中元素逐一对比,在此过程中会调用equals方法来比较两个对象的引用是否相同,最终没有包含该对象的时候返回-1。
1.2 解释E remove(int index)源代码
答:
- remove源代码
public E remove(int index) {
RangeCheck(index);
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
return oldValue;
}
- 通过RangeCheck(index)检查index是否在索引范围内,满足条件,将要删除的元素赋给oldValue,再将该元素删除,最后返回oldValue。
当index不在索引范围时,会抛出异常 IndexOutOfBoundsException(outOfBoundsMsg(index))。
private void rangeCheck(int index) { if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的具体类型吗?
答:
- ArrayList构造函数源码
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;//EMPTY_ELEMENTDATA是个空的Object[],将elementData初始化,elementData也是Object[]类型
}
在构造函数中,ArrayList类中定义了elementData数组(private transient Object[] elementData)来存放对象,这个数组是Object类型,即无论放入什么引用类型,都会包装成Object类型存入,所以无需考虑具体类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
答:add()有两个方法,boolean add(E),void add(int ,E)
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
要添加一个元素,先判断size+1(size是数组中数据的个数)这个个数数组能否放得下,用ensureCapacityInternal()这个方法判断数组长度(数组.length())能否够用。当数组为空时没有长度,就默认minCapacity变成10,即默认数组大小为10。
- 通过 ensureExplicitCapacity(minCapacity)确认实际的容量。(elementData不是空的数组时,minCapacity=size+1,代表elemenData增加后的实际数据个数,用minCapacity与elementData.length比较)。当内部数组不够用时,ArrayList会 自动扩展数组大小。
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1)
if (newCapacity - minCapacity < 0)//空数组时,真正初始化elementData大小为10
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)y
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity); //确定新容量,拷贝数组,改变容量大小
}
扩容时,会将原来数组的大小给oldCapacity,newCapacity是1.5倍的oldCapacity。newCapacity - MAX_ARRAY_SIZE > 0判断newCapacity是否超过最大容量限制,超过就将能给的最大值给newCapacity,此时确定新容量大小,就拷贝原来数组,并改变容量大小。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
答:rangeCheck用于判断数组是否越界,只有本类移除、增添等方法中需要使用,就用private将其封装起来,用户只需要知道移除,增添等方法,不需要知道具体的实现过程。
2. HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
答:通过哈希算法进行确定存储位置。先调用hashCode()方法,计算出哈希值,找到对应的链表,调用equals方法判断该链表中是否有重复的对象。
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)
答:时间复杂度为O(1)。通过哈希算法得出位置就将元素直接添加进表中,这个过程的时间复杂度为O(1)。
3. ArrayListIntegerStack
题集jmu-Java-05-集合之ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
答:
- 实现类中存储数据形式不同,自定义接口ArrayIntegerStack中用Integer数组,而ArrayListIntegerStack中使用集合List的ArrayList类。
- 自定义接口ArrayIntegerStack中容易发生数组越界的问题,ArrayListIntegerStack中动态数组ArrayList会自动扩容,不用担心会发生越界现象。
- ArrayIntegerStack中需要多一个top指针来存取元素,ArrayListIntegerStack则不用,通过ArrayList存放元素极大便利了栈的操作。
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。
答:接口IntegerStack与上次自定义接口相同, ArrayListIntegerStack实现了该接口。此时我们无需再重新写一个栈并重写实现方法。实现该接口后,我们只需编写具体方法就可以了,减少不必的代码量,让代码更为灵活。
4. Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈(请利用Java集合中已有的类),但不能使用java的Stack类(具体原因自己搜索)与数组。请粘贴你的代码,类名为Main你的学号。
答:
- 自定义栈,用ArrayList存储字符
public class CharatorStack {
private List<Character> list;
public CharatorStack() {
List<Character> list=new ArrayList<>();
this.list = list;
}
//入栈
public void push(char c) {
list.add(c);
}
//出栈,如栈为空,则返回null。
public Character pop(int i) {
if(list.size()==0)
return null;
return list.remove(i);//出栈时注意移除出栈元素
}
//获得栈顶元素,如栈顶为空,则返回null。注意:不要出栈
public Character peek() {
if(list.size()-1==0)
return null;
return list.get(list.size()-1);
}
//如过栈为空返回true
public boolean empty() {
if(list.size()==0)
return true;
else
return false;
}
}
- 实现类
public class Main201621123003 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
CharatorStack stack=new CharatorStack();
while(true){
String str=sc.next();
if(str.equals("end"))
break;
char[] c=str.toCharArray();
for (int i = 0; i < str.length(); i++) {
stack.push(c[i]);
}
int flag=0;
for (int i = 0; i < c.length; i++) {
if(c[i]==stack.pop(c.length-i-1)){
flag=1;
}
else{
flag=0;
}
}
if(flag==1)
{
System.out.println("YES");
}
else{
System.out.println("NO");
}
}
}
}
- 运行
4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?
答:
- 使用Queue接口,并用LinkedList来实现。
- 主要代码
if (Integer.parseInt(strs[0]) <= 1000) {
for (int i = 1; i < strs.length; i++) {
int temp1 = Integer.parseInt(strs[i]);
if (temp1 % 2 == 0) {
arrBQueue.add(temp1);
} else {
arrAQueue.add(temp1);
}
}
}
int i=0;
if(!arrAQueue.isEmpty())
System.out.print(arrAQueue.poll());
else {
System.out.print(arrBQueue.poll());
}
while(!arrAQueue.isEmpty()||!arrBQueue.isEmpty()) {
i++;
if(i%2==0) {
if(!arrAQueue.isEmpty())
System.out.print(" "+arrAQueue.poll());
}else {
if(!arrAQueue.isEmpty())
System.out.print(" "+arrAQueue.poll());
if(!arrBQueue.isEmpty())
System.out.print(" "+arrBQueue.poll());
}
}
5. 统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (作业中不要出现大段代码)
5.1 实验总结
答:该题主要使用TreeSet集合存放不重复的单词,并利用TreeSet完成按字母顺序排序。
6. 选做:统计文字中的单词数量并按出现次数排序
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
6.1 伪代码
答:
- 1、建立Map<String,Integer> words=new HashMap<>();
- 2、循环将单词作为键对象,次数作为值对象存入words集合中;
- 3、建立List存入Map.Entry对象。
- 4、重新定义Collections.sort中的compare方法。
- 5、输出List
6.2 实验总结
答:该题难点是如何实现单词次数按照降序排序,如果次数相同,则按照键值的字母升序排序。先将Map集合中每一个对象存入List,再重新定义compare方法。
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。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 | 739 | 739 | 16 | 16 |
6 | 1084 | 345 | 28 | 12 |
7 | 1180 | 96 | 30 | 2 |
8 | 1627 | 447 | 35 | 5 |
9 | 1986 | 359 | 44 | 9 |
Week08《Java程序设计》第八次学习总结的更多相关文章
- 201521123027 <java程序设计>第八周学习总结
1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...
- 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结
<面向对象程序设计Java>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第八周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第八周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
- 20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
- 20175209 《Java程序设计》第九周学习总结
20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...
- 20175317 《Java程序设计》第九周学习总结
20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...
随机推荐
- selenim之ActionChains 用法
常见的点击方法集锦: 参数: 1.driver是我们的浏览器 2.Actions是我们系统内置的执行鼠标一系列操作的对象 鼠标左击:Actions actions=new Actions(driver ...
- cl.exe 命令行编译sqlite3 sqlite3.dll及sqlite3.exe
有点被宇宙最强的ide惯坏了,封装的太好,不能像gcc那样一步步了解其原理,其实强大的vs背后也有类似gcc的cl.exe 看到How To Compile SQLite http://sqlite. ...
- logstash运输器以及kibana的更多操作
为了达到不会因为ELK中的某一项组件因为故障而导致整个ELK工作出问题,于是 将logstash收集到的数据存入到消息队列中如redis,rabbitMQ,activeMQ或者kafka,这里以red ...
- 20145312 实验五《Java网络编程》
20145312 实验五<Java网络编程> 一. 实验内容及要求 实验内容: 运行下载的TCP代码,结对进行,一人服务器,一人客户端: 利用加解密代码包,编译运行代码,一人加密,一人解密 ...
- 【纯代码】Swift - 自定义底部弹窗基类(可根据需要自行扩展内容)
//弹窗视图 class PopView : UIView { var selectButtonCallBack:((_ title:String)-> Void)? var contenVie ...
- jQuery的$.each()遍历checkbox
$("input[type='checkbox']").each(function(){ var value = $(this).val(); //获得值 $(this).attr ...
- zip unzip tar 压缩解压
yum install -y unzip zip yum安装zip -r mydata.zip mydata mydata目录压缩为mydata.zipunzip mydata.zip - ...
- C# Winform实现手机号码归属地查询工具
摘要:本文介绍使用C#开发基于Winform的手机号码归属地查询工具,并提供详细的示例代码供参考. 一.需求描述 输入正确的手机号码,查询该号码的归属地和其他相关信息. 二.需求分析 1.实现手机号码 ...
- 面试代码基础(一)从strstr说起
对于写程序要注意:要能在面试官的提示下把代码写出来(把思想实现的能力)!还要注意边界检查!递归找到出口! 开场来个简单字符串匹配 int strstr(char* target,char* sourc ...
- Python 实现99乘法表
首先,我们来回忆一下99乘法表长什么样子吧 进入正题:实现99乘法表 一.For循环 for i in range(1,10): for j in range(1,i+1): print(" ...