第7周-集合
1. 本周学习总结
1.1 List接口
——按照索引位置排序,可以有重复对象;允许按照索引位置检索对象
具体实现类:
- ArrayList—采用长度可变的数组;允许对元素进行快速的随机访问。(随机读取快)
- LinkedList—采用链表;单独具有可以作为堆栈、队列和双向队列使用的方法。(插入、删除快)
1.2 Set接口
——不按特定方式排序,没有重复对象;有些实现类能对集合中对象按特定方式排序
具体实现类:
- HashSet—按照哈希算法来存取集合中的对象,存取速度比较快。(子类:LinkedHashSet类-提高插入删除元素的性能)
- TreeSet—实现了SortedSet接口,具有排序功能。
1.3 Map接口(映射表)
——每一个元素包含一对键对象(key)_不重复和值对象(value)_可重复;有些实现类能对集合中的键对象进行排序
具体实现类:
- HashMap—按照哈希算法来存取键对象。
- TreeMap—实现了SortedMap接口,能对键对象进行排序(自然排序与客户化排序)。
2. 书面作业
1. ArrayList代码分析
1.1 解释ArrayList的contains
源代码
Answer
源代码:
如果列表中包含指定元素(下标>=0),则返回true;否则,(在indexOf中可以看到列表不包含指定元素返回-1)在contains()中返回false。
1.2 解释E remove(int index)
源代码
Answer
源代码:
作用:移除列表中的指定元素,若不包含指定元素列表不变,若包含指定元素则返回true。
(1) rangeCheck():顾名思义就是判断是否超出size,超出就抛出异常。
(2) modCount:"已从结构上修改此列表的次数-更改列表大小从而使正在进行的迭代产生错误的结果",也就是用来判断add()或者remove()等操作是否改变了列表的结构,若改变了就抛出异常(ConcurrentModificationExceptions)。
(3) arraycopy:从指定源数组中复制一个数组,从index+1到index,即元素前移。
(4) 最后返回被删除的元素。(clear(size-1)的空间,"let GC do its work")
>> GC:计算机用语为垃圾回收(Garbage Collection),用于回收内存空间。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
Answer
我认为不需要,只要不是存放基本数据类型。因为ArrayList<>中放入对象的类型直属于父类Object。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
Answer
源代码:
(1)ensureCapacityInternal确保容量为size+1;
(2)如果elementData是默认长度的空数组的话(DEFAULTCAPACITY_EMPTY_ELEMENTDATA),那么数组容量是默认长度(DEFAULT_CAPACITY)和传入参数的最大值;
(3)容量还是不够用的话,使用grow()方法增加容量;
(4)int newCapacity = oldCapacity + (oldCapacity >> 1);
扩展容量为原来的一半(右移一位),即原来的1.5倍;
(5)elementData = Arrays.copyOf(elementData, newCapacity);
将旧的数组数据复制到新容量的数组中。
1.5 分析private void rangeCheck(int index)
源代码,为什么该方法应该声明为private而不声明为public?
Answer
(源代码在分析remove的时候已经贴过了,不重复。)
这个应该涉及之前学的封装性吧。作者认为用户没有必要也不可以修改rangeCheck()方法,用户只需要知道这个方法并会使用就可以了;还可以避免使用时不小心更改的情况。
2. HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
Answer
(引用PPT)散列表用链表数组实现,每个列表被称为桶。
元素加入HashSet中则会调用hashCode()取得哈希码,并尝试放入对应的桶中;桶中没有对象就直接放入,有对象就要调用equals()进行比较;若为false则不是重复对象,可收集,若为true,则不予收集。 ****这里放上一个草图:
2.2 选做:尝试分析HashSet源代码后,重新解释1.12.1
Answer
源代码:
本质是HashMap...(待续)
3. ArrayListIntegerStack
题集jmu-Java-05-集合之5-1
ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类
中的题目5-3自定义接口ArrayIntegerStack
,有什么不同?(不要出现大段代码)
Answer
(1)实现形式:ArrayListIntegerStack使用动态数组;ArrayIntegerStack使用数组。
(2)关于栈满:ArrayIntegerStack会出现栈满的情况,因为它不可以自动扩容(入栈考虑是否栈满);ArrayListIntegerStack中动态数组会自动扩容。
3.2 简单描述接口的好处
Answer
(1)灵活:同样的接口,不同的实现方法。(ArrayListIntegerStack与ArrayIntegerStack都实现了IntegerStack接口)
(2)可扩展:上述例子看来,IntegerStack接口还可以有更多的实现方法,只要根据需求定义抽象类的话。
(3)节省空间,提高效率。
4. Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
Answer
我的部分代码:
public class Main201521123094 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Stack ch = new Stack();
String str1 = new String();
while (in.hasNext()) {
String str = in.next();
for (int i = 0; i < str.length(); i++) {
ch.push(str.charAt(i));
}
str1 = "";
for (int i = 0; i < str.length(); i++) {
str1 += ch.peek();
ch.pop();
}
if (str1.equals(str)) {
System.out.println("是回文");
} else {
System.out.println("不是回文");
}
if(str.equals("!!")) break;
}
in.close();
}
}
运行结果:
不能使用java的Stack类原因:效率慢
4.2 题集jmu-Java-05-集合之5-6
银行业务队列简单模拟。(不要出现大段代码)
Answer
利用队列分别根据奇偶入队,注意Queue是接口,要用其具体方法。
5. 统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2
统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
5.1 实验总结
Answer
这题犯的错误是没有注意"!!!!!"也是字符串,要排除在外;使用TreeSet进行排序,迭代器进行排序后的输出。
6. 选做:加分考察-统计文字中的单词数量并按出现次数排序(待)
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
6.1 伪代码
Answer
6.2 实验总结
Answer
7. 选做加分:面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
Answer
尝试使用表格界面(代码未完全实现)
7.2 使用集合类改进大作业(待)
3. 码云上代码提交记录及PTA实验总结_题目集:jmu-Java-05-集合
3.1. 码云代码提交记录(在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图)
3.2. PTA实验——实验总结已经在作业中体现,不用写
编程5-1,编程5-2,编程5-3(选做),编程5-6