《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);
}
.......
}