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

java


1. 本周学习总结

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



2. 书面作业


Q1.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来修饰,那么该方法就可以被外界看到,并且能被任意调用。


Q2.HashSet原理

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

答:当向HashSet(散列集)中增加新对象时,首先根据哈希函数计算要增加对象的hashCode码,根据该值来得到一个位置用元素来存放当前对象。如果在该位置上没有东西的话,那么HashSet认为该元素在集合中不存在,直接增加进去。如果在该位置已经有一个元素了,接着将准备增加到集合中的元素与该位置上的元素用equals方法进行比较。如果该equals方法返回false,那么说明HashSet中不存在该元素,再进行一次散列,将该元素放到散列后计算出来的地址中。如果equals方法返回true,那么说明HashSet中已经存在该元素了,不再将该元素增加到HashSet中。此过程需要调用的是equals方法和insert方法。


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

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

答:在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3是定义了Integer[]来存放输入的数据,然后再用ArrayIntegerStack类来对输入的数据进行需要的操作;而题集jmu-Java-05-集合之5-1 ArrayListIntegerStack中用list来存放输入的数据,并直接使用list中的操作就可以满足题目中的要求了。

3.2 简单描述接口的好处。

答:接口的好处:能使整个结构清晰,类之间的通信简单易懂,扩展性好,提高复用性,我个人感觉,面向接口编程能够使整个代码都很有条理,在修改的时候很方便,这是切身体会!!而且采用面向接口编程的话,其他人一看你的代码就能明白你在写什么,大概想实现哪些功能,一目了然,便于查看。


Q4.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 Main201521123067 {

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("该字符串不是回文!");

}

}

以下是运行结果的截图:


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

实验总结:

●5-6这道题我主要是运用了栈的形式来处理,首先设立A和B两个栈,然后将偶数放入B栈,将奇数放入A栈,接着将它们按规定顺序一一出栈并输出就可以了。不过在这题中的格式要求比较严格,需要仔细思考一下才能想出来怎么做。


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

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

5.1 实验总结

●在5-2这题中,主要是需要学会用TreeSet,用JDK文档可以搜索到TreeSet的详细信息,看完之后就会使用它了。在此题中需要使用到TreeSet中的add(E e)方法、pollFirst()方法、size()方法,用上这些,这道题很快就能做出来了。


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

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

7.2 使用集合类改进大作业

与上次相比,我增加了许多功能,例如菜单栏和菜单项,还有将搜索框中的文字输出,具体的见下图:









3. 码云上代码提交记录及PTA实验总结

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

以上是 201521123067 《Java程序设计》第7周学习总结 的全部内容, 来源链接: utcz.com/z/391645.html

回到顶部