第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),用于回收内存空间。

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
posted @ 2017-04-08 20:34  wuht  阅读(262)  评论(0编辑  收藏  举报