1. 本周学习总结
2. 书面作业
1.ArrayList代码分析
1.1 解释ArrayList的contains源代码
以下是ArrayList的contains源代码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object 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;
}
public boolean equals(Object obj) {
return (this == obj);
}
答:contains是一个用来判断某个ArrayList中是否包含某个对象或者元素,其中indexOf是用来查找该对象或者元素所在位置的方法,如果该对象或者元素存在,则indexOf方法返回其位置,如果不存在,则返回-1,contains方法再根据indexOf方法的返回值来确定是否含有该对象或者元素,如果indexOf方法的返回值>=0,则contains方法返回true,如果indexOf方法的返回值<0,则contains方法返回false。
1.2 解释E remove(int index)源代码
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
答:首先根据指定的位置找到要删除的元素,然后将该元素移除,向左移动所有后续元素,再将长度减1。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
答:ArrayList存储数据时不需要考虑元素的类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
以下是add的源代码:
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
答:add方法是先判断需要加入新元素的位置是否超过数组容量,如果超过,则先扩大数组容量,使其长度加1。
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
以下是private void rangeCheck(int index)的源代码:
private void rangeCheck(int index) {
if (index >= size) {
throw new RuntimeException("range out");
}
}
答:因为将rangeCheck用private修饰可以不被外界任意修改,并且具有隐私性,不被随意调用,如果用public来修饰,那么该方法就可以被外界看到,并且能被任意调用
2.HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
答:当向HashSet(散列集)中增加新对象时,首先根据哈希函数计算要增加对象的hashCode码,根据该值来得到一个位置用元素来存放当前对象。如果在该位置上没有东西的话,那么HashSet认为该元素在集合中不存在,直接增加进去。如果在该位置已经有一个元素了,接着将准备增加到集合中的元素与该位置上的元素用equals方法进行比较。如果该equals方法返回false,那么说明HashSet中不存在该元素,再进行一次散列,将该元素放到散列后计算出来的地址中。如果equals方法返回true,那么说明HashSet中已经存在该元素了,不再将该元素增加到HashSet中。此过程需要调用的是equals方法和insert方法。
3.ArrayListIntegerStack
题集jmu-Java-05-集合
之5-1 ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类
中的题目5-3自定义接口ArrayIntegerStack
,有什么不同?(不要出现大段代码) 答:不同之处在于前者使用了ArrayList的动态数组,不需要判断是否栈满,直接使用ArrayList内部的方法,后者是已经定义了数组的长度,纯粹就是对数组的操作。
3.2 简单描述接口的好处. 答:对本题来说,两个ArrayIntegerStack方法同名,却是对IntegerStack接口进行不同的实现。所以可以看出接口的好处之一是对要完成功能相似而具体实现方法不同的情况来说,可以用相同的方法名,不同的实现,来根据需求通过不同的方式来实现。
4.Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
package huiwen;
import java.util.Scanner;
class StackString {
public int maxSize;
private char[] array;
private int top;
public StackString(int maxSize) {
this.maxSize = maxSize;
array = new char[maxSize];
top = -1;
}
public void push(char i) {
array[++top] = i;
}
public char pop() {
return (array[top--]);
}
public int peak() {
return (array[top]);
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
}
public class Main201521123086 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = scanner.next();
StackString stack = new StackString(s.length());
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
stack.push(c[i]);
}
System.out.println();
boolean b = true;
for (int i = 0; i < stack.maxSize; i++) {
if (c[i] != stack.pop()) {
b = false;
break;
}
}
if (b)
System.out.println("该字符串是回文!");
else
System.out.println("该字符串不是回文!");
}
}
5.统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合
之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
while (input.hasNextLine()) {
String str = input.next();
if (str.equals("!!!!!")){
break;}
else if (!str.contains(str))
str.add(str);
}
5.1 实验总结:这题关键就是使用了Set的自然排序实现类TreeSet,此类可以对添加的对象进行默认排序。
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
3.2. PTA实验