201521123002《Java程序设计》第7周学习总结
1. 本周学习总结
以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
2. 书面作业
1.ArrayList代码分析
1.1 解释ArrayList的contains
源代码
先查看源代码
contains调用indexOf方法,indexOf遍历数组如果是null就查看是否有null的项返回i,如果o与数组中的元素equals就返回i如果没找到就放回-1,所以如果结果大于等于0就包含该o。
1.2 解释E remove(int index)
源代码
首先判断是否越界如果越界抛出异常,如果没有则就把其后的元素向前移,并把最后一个元素置为null然后用GC清楚元素。
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
只要不是基本数据类型就都可以,因为Arraylist是用object数组实现的,根据多态我们知道可以保存任何类型。
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
首先确保内博有size+1的容量,如果超出容量调用grow方法,增加用来容量的一半,那么新的数组的容量是原来的1.5倍,之后再把旧的数组里的内容拷贝的新的数组里。
1.5 分析private void rangeCheck(int index)
源代码,为什么该方法应该声明为private而不声明为public?
用private修饰表示给方法不希望被外部引用,而且这个方法只在内部使用,用public没什么意义。使用用private修饰就可以了。
2.HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
这边需要调用到hashCode与equals方法,
首先根据hashCode算出散列码找到对应的列表,这时如果其中没有其他元素就直接加入,如果已经有其他元素了就调用equals方法逐一比较,如果比较结果为假就加入,如果为真就用新的元素代替旧的元素。
3.ArrayListIntegerStack
题集jmu-Java-05-集合
之5-1ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类
中的题目5-3自定义接口ArrayIntegerStack
,有什么不同?(不要出现大段代码)
前者用内部使用ArrayList对象存储,后者用内部使用数组实现。这里的区别就是ArrayList有很多自带发方法了,我们在我们实现接口的方法是很多地方可以直接调用ArrayList的方法,这样非常快代码也很简洁。
3.2 简单描述接口的好处.
经过这段时间的学习和pta的实践,首先先从上面这题入手,你看如果有一个接口,我们就可以根据不同的需要用不同的方法进行实现非常的灵活不会固定死代码,
其二就是如果我们在还不知道具体怎么实现时,先把自己想实现的方法先声明出来,这样如果你和他人合作时,别人可以根据你的需求进行写代码。
4.Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack
类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号
。
public class Main201521123002 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayListIntegerStack stack=new ArrayListIntegerStack();
Scanner sc = new Scanner(System.in);
String s=sc.next();
for(int i=0;i<s.length();i++){
stack.push(s.charAt(i));
}
boolean f=true;
for(int i=0;i<s.length();i++)
if(stack.pop()!=s.charAt(i)){
f=false;
break;
}
if(f)
System.out.println("yes");
else
System.out.println("no");
}
}
这里只是截取关键代码,上面的ArrayListIntegerStack就是我们pta上面的题目只是把Integer改为Character
4.2 题集jmu-Java-05-集合
之5-6 银行业务队列简单模拟。(不要出现大段代码)
Queue<Integer> A= new LinkedList<Integer>();
Queue<Integer> B= new LinkedList<Integer>();
ArrayList<Integer> C=new ArrayList<Integer>();
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x%2==0){
B.offer(x);
}
else
A.offer(x);
}
while(!A.isEmpty()&&!B.isEmpty()){
for(int i=0;i<2&&!A.isEmpty();i++){
C.add(A.poll());
}
C.add(B.poll());
}
if(!A.isEmpty())
C.addAll(A);
else if(!B.isEmpty())
C.addAll(B);
int i;
for(i=0;i<n-1;i++)
System.out.print(C.get(i)+" ");
System.out.print(C.get(i));
}
}
5.统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合
之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)
package chpt06;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main1 {
public static void main(String[] args) {
ArrayList<String> str=new ArrayList();
Set<String> set= new TreeSet();
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.next();
if(s.equals("!!!!!"))
break;
str.add(s);
}
for(String e:str){
set.add(e);
}
System.out.println(set.size());
int i=0;
for(String e:set){
if(i==10)
break;
System.out.println(e);
i++;
}
}
}
5.1 实验总结
这题主要就是学会用TreeSet,TreeSet会自动把add进去的string按照顺序排序,然后输入这个地方的代码要注意一下,最后输出部分其实可以用迭代器。
7.面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
7.2 使用集合类改进大作业
import java.util.ArrayList;
public class Cart {
ArrayList<Book> item = new ArrayList<Book>();
public void add(Book e) {
if(item.contains(e)){
item.get(item.indexOf(e)).num+=e.num;
}
else item.add(e);
}
public void delete(Book e) {
item.remove(e);
}
public void clear() {
if (item.size() != 0) {
item.clear();
}
}
public void display() {
if (item.isEmpty()) {
System.out.println("您的购物车没有东西,快去买买买吧!");
}
else {
System.out.println("你的购物列表");
for (Book e : item) {
System.out.println(e);
}
}
}
public void totalPrice() {
double sum = 0;
for (Book e : item) {
sum += e.getPrice() * e.getNum();
}
System.out.println("总计为"+sum+"元");
}
}
参考资料:
JTable参考项目
3. 使用码云管理Java代码
4. 实验总结
实验总结已经在作业中体现,不用写。