《Java程序设计》第7周学习总结

1. 本章学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

  • 首先查看ArrayList源代码,找到contain方法

  • contains方法在执行后首先会调用indexOf()方法。indexOf()方法会判断传入的对象是否为空,如果为空,则遍历整个集合的元素,如果集合的某个元素为空,返回该元素的下标。如果传入对象不为空,则遍历整个集合的元素,如果该元素和集合内某个元素的equals比较结构为true,返回该元素下标。可以看到如果遍历完集合后没有元素存在于集合中就返回-1。最后contains还做了判断,如果indexOf()方法返回大于0,就说明集合内存在该元素,小于0则不存在。

1.2 解释E remove(int index)源代码

  • 同样先找到E remove(int index)方法

  • E remove(int index)执行后,先检查索引范围RangeCheck(index),然后将要删除的元素赋值于oldValue,从数组中移除元素后,被移除的元素以后的所有元素的向左移动一个位置,最后返回被删除元素。

1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?

  • 不需要。ArrayList内部使用Object数组来保存收集的对象,而Object类是所有类的父类。

1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

  • 查看源代码

  • 如果超出,数组将会进行扩容,以满足添加数据的需求。数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现。

1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

  • 查看源代码

  • rangeCheck()方法保证index在ArrayList长度范围之内(index < size()),并在越界时抛出IndexOutOfBoundsException异常,被get(int index)、set(int index, E element)、remove(int index)调用。

2. HashSet原理

2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?

  • 当向HashSet中添加一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据该值决定该对象的存储位置,但是如果有两个元素通过equals()方法比较返回true,而它们的hashCode()方法返回值不等,HashSet也会将它们存储在不同的位置。

2.2 选做:尝试分析HashSet源代码后,重新解释1.1

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
  • 对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素。

3. ArrayListIntegerStack

题集jmu-Java-05-集合之5-1 ArrayListIntegerStack

3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)

  • ArrayIntegerStack实例化的时候需要规定大小,而ArrayListIntegerStack使用list可以自动扩容。此外,在ArrayIntegerStack中,出栈入栈等操作需要用到指针,而ArrayListIntegerStack使用list则不需要使用指针,可以直接通过list的一些方法来进行删除,查找等操作。

3.2 简单描述接口的好处.

  • 解决不同的对象的相同需求。比如shape和employee,都存在比较这一操作,但需求不同,前者比较面积,后者比较薪水。

4. Stack and Queue

4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号

class StackArray{
	ArrayList<Character> arr = new ArrayList<Character>();
	public StackArray(String s){
	    for(int i=0;i<s.length();i++)
	        arr.add(s.charAt(i));
	}
	public Character push(Character c){
    	arr.add(c);
    	return c;
	}
	public Character pop() {
    	return arr.remove(arr.size() - 1);
	}
	public int size(){
    	return arr.size();
	}
}
public class Main201521123046 {
	public static void main(String[] args) {
	    Scanner sc = new Scanner(System.in);
	    String s = sc.nextLine();
	    StackArray str = new StackArray(s);
	    for(int i=0;i<str.size();i++){
	        if(s.charAt(i) != str.pop()){
	            System.out.println("NO");
	            return;
	        }
	    }
	    System.out.println("YES");
	}
}

4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)

Queue<Integer> A = new LinkedList<Integer>();
Queue<Integer> B = new LinkedList<Integer>(); 

if(m % 2 == 0)		B.add(m);
else	A.add(m);               //根据奇偶序号分别入栈

while{                          //根据出队速度不同,A为B两倍,即A出队两个B出队一个
	Integer a1 = A.poll();      //poll返回队头
	System.out.print(a1);

	Integer a2 = A.poll();
	System.out.print(a2);

	Integer b = B.poll();
	System.out.print(b);
	}

5. 统计文字中的单词数量并按单词的字母顺序排序后输出

题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)

Set<String> set = new TreeSet();     //TreeSet可以确保集合元素处于排序状态

while(in.hasNext()){
	String s = in.next();
	if (s.equals("!!!!!"))break;
		set.add(s);
}                                    //add添加新单词到表尾
System.out.println(set.size());      //size统计表长即单词数
for循环输入

5.1 实验总结

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。

6. 选做:加分考察-统计文字中的单词数量并按出现次数排序

题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)

6.1 伪代码

6.2 实验总结

7. 面向对象设计大作业-改进

7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

  • 添加结算模块

7.2 使用集合类改进大作业

public class ShoppingCart implements Search{
	ArrayList<Good> car = new ArrayList<Good>();

	public void add(Good c)
	{
	    this.car.add(c);
	}
	.......
}

3. 使用码云管理Java代码

posted @ 2017-04-08 19:31  阿鏢  阅读(250)  评论(0编辑  收藏  举报