第7周-集合
contains
源代码Answer
源代码:
如果列表中包含指定元素(下标>=0),则返回true;否则,(在indexOf中可以看到列表不包含指定元素返回-1)在contains()中返回false。
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),用于回收内存空间。
Answer
我认为不需要,只要不是存放基本数据类型。因为ArrayList<>中放入对象的类型直属于父类Object。
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);
将旧的数组数据复制到新容量的数组中。
private void rangeCheck(int index)
源代码,为什么该方法应该声明为private而不声明为public?Answer
(源代码在分析remove的时候已经贴过了,不重复。)
这个应该涉及之前学的封装性吧。作者认为用户没有必要也不可以修改rangeCheck()方法,用户只需要知道这个方法并会使用就可以了;还可以避免使用时不小心更改的情况。
Answer
(引用PPT)散列表用链表数组实现,每个列表被称为桶。
元素加入HashSet中则会调用hashCode()取得哈希码,并尝试放入对应的桶中;桶中没有对象就直接放入,有对象就要调用equals()进行比较;若为false则不是重复对象,可收集,若为true,则不予收集。 ****这里放上一个草图:
Answer
源代码:
本质是HashMap...(待续)
题集jmu-Java-05-集合之5-1
ArrayListIntegerStack
题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类
中的题目5-3自定义接口ArrayIntegerStack
,有什么不同?(不要出现大段代码)Answer
(1)实现形式:ArrayListIntegerStack使用动态数组;ArrayIntegerStack使用数组。
(2)关于栈满:ArrayIntegerStack会出现栈满的情况,因为它不可以自动扩容(入栈考虑是否栈满);ArrayListIntegerStack中动态数组会自动扩容。
Answer
(1)灵活:同样的接口,不同的实现方法。(ArrayListIntegerStack与ArrayIntegerStack都实现了IntegerStack接口)
(2)可扩展:上述例子看来,IntegerStack接口还可以有更多的实现方法,只要根据需求定义抽象类的话。
(3)节省空间,提高效率。
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类原因:效率慢
jmu-Java-05-集合之5-6
银行业务队列简单模拟。(不要出现大段代码)Answer
利用队列分别根据奇偶入队,注意Queue是接口,要用其具体方法。
题集jmu-Java-05-集合之5-2
统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
Answer
这题犯的错误是没有注意"!!!!!"也是字符串,要排除在外;使用TreeSet进行排序,迭代器进行排序后的输出。
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)
Answer
Answer
Answer
尝试使用表格界面(代码未完全实现)
编程5-1,编程5-2,编程5-3(选做),编程5-6
优质内容筛选与推荐>>