
正文
201621123043 《Java程序设计》第8周学习总结
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
1. 本周学习总结

2. 书面作业1. ArrayList代码分析1.1 解释ArrayList的contains源代码
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中已有元素个数)
先调用hashCode方法计算元素的哈希码值,然后由哈希码的值算出元素的存储位置
如果指定的位置没有值的话,则将元素添加到哈希表中,
但是如果算出的位置上已经有了一个值的话,就要调用equals方法比较该位置上的值和待加入的值
如果两个值相同则不将元素添加进哈希表,因为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 Queue4.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.码云及PTA3.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解决实际问题
尝试为代码统计项目 增加图形界面。








