项目html |
内容java |
这个做业属于哪一个课程程序员 |
https://www.cnblogs.com/nwnu-daizh/web |
这个做业的要求在哪里编程 |
https://www.cnblogs.com/nwnu-daizh/p/11435127.htmlwindows |
做业学习目标数组 |
(1) 掌握Vetor、Stack、Hashtable三个类的用途及经常使用API;架构 (2) 掌握ArrayList、LinkList两个类的用途及经常使用API;框架 (3) 了解java集合框架体系组成;dom (4) 掌握Java GUI中框架建立及属性设置中经常使用类的API; (5) 了解Java GUI中2D图形绘制经常使用类的API; |
第一部分:总结第九章、第十章理论知识
1、 Collection集合
1.1 集合概述
在前面基础班咱们已经学习过并使用过集合ArrayList<E> ,那么集合究竟是什么呢?
* **集合**:集合是java中提供的一种容器,能够用来存储多个数据。
集合和数组既然都是容器,它们有啥区别呢?
* 数组的长度是固定的。集合的长度是可变的。
* 数组中存储的是同一类型的元素,能够存储基本数据类型值。集合存储的都是对象。并且对象的类型能够不一致。在开发中通常当对象多的时候,使用集合进行存储。
1.2 集合框架
JAVASE提供了知足各类需求的API,在使用这些API前,先了解其继承与接口操做架构,才能了解什么时候采用哪一个类,以及类之间如何彼此合做,从而达到灵活应用。
集合按照其存储结构能够分为两大类,分别是单列集合`java.util.Collection`和双列集合`java.util.Map`,今天咱们主要学习`Collection`集合,在day04时讲解`Map`集合。
* **Collection**:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是`java.util.List`和`java.util.Set`。其中,`List`的特色是元素有序、元素可重复。`Set`的特色是元素无序,并且不可重复。`List`接口的主要实现类有`java.util.ArrayList`和`java.util.LinkedList`,`Set`接口的主要实现类有`java.util.HashSet`和`java.util.TreeSet`。
从上面的描述能够看出JDK中提供了丰富的集合类库,为了便于初学者进行系统地学习,接下来经过一张图来描述整个集合类的继承体系。
其中,橙色框里填写的都是接口类型,而蓝色框里填写的都是具体的实现类。这几天将针对图中所列举的集合类进行逐一地讲解。
集合自己是一个工具,它存放在java.util包中。在`Collection`接口定义着单列集合框架中最最共性的内容。
1.3 Collection 经常使用功能
Collection是全部单列集合的父接口,所以在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操做全部的单列集合。方法以下:
* `public boolean add(E e)`: 把给定的对象添加到当前集合中 。
* `public void clear()` :清空集合中全部的元素。
* `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
* `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
* `public boolean isEmpty()`: 判断当前集合是否为空。
* `public int size()`: 返回集合中元素的个数。
* `public Object[] toArray()`: 把集合中的元素,存储到数组中。
方法演示:
~~~java
import java.util.ArrayList;
import java.util.Collection;
public class Demo1Collection {
public static void main(String[] args) {
// 建立集合对象
// 使用多态形式
Collection<String> coll = new ArrayList<String>();
// 使用方法
// 添加功能 boolean add(String s)
coll.add("小李广");
coll.add("扫地僧");
coll.add("石破天");
System.out.println(coll);
// boolean contains(E e) 判断o是否在集合中存在
System.out.println("判断 扫地僧 是否在集合中"+coll.contains("扫地僧"));
//boolean remove(E e) 删除在集合中的o元素
System.out.println("删除石破天:"+coll.remove("石破天"));
System.out.println("操做以后集合中元素:"+coll);
// size() 集合中有几个元素
System.out.println("集合中有"+coll.size()+"个元素");
// Object[] toArray()转换成一个Object数组
Object[] objects = coll.toArray();
// 遍历数组
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
// void clear() 清空集合
coll.clear();
System.out.println("集合中内容为:"+coll);
// boolean isEmpty() 判断是否为空
System.out.println(coll.isEmpty());
}
}
~~~
> tips: 有关Collection中的方法可不止上面这些,其余方法能够自行查看API学习。
2、Iterator迭代器
2.1 Iterator接口
在程序开发中,常常须要遍历集合中的全部元素。针对这种需求,JDK专门提供了一个接口`java.util.Iterator`。`Iterator`接口也是Java集合中的一员,但它与`Collection`、`Map`接口有所不一样,`Collection`接口与`Map`接口主要用于存储元素,而`Iterator`主要用于迭代访问(即遍历)`Collection`中的元素,所以`Iterator`对象也被称为迭代器。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操做,下面介绍一下获取迭代器的方法:
* `public Iterator iterator()`: 获取集合对应的迭代器,用来遍历集合中的元素的。
下面介绍一下迭代的概念:
* **迭代**:即Collection集合元素的通用获取方式。在取元素以前先要判断集合中有没有元素,若是有,就把这个元素取出来,继续在判断,若是还有就再取出出来。一直把集合中的全部元素所有取出。这种取出方式专业术语称为迭代。
Iterator接口的经常使用方法以下:
* `public E next()`:返回迭代的下一个元素。
* `public boolean hasNext()`:若是仍有元素能够迭代,则返回 true。
接下来咱们经过案例学习如何使用Iterator迭代集合中元素:
~~~java
public class IteratorDemo {
public static void main(String[] args) {
// 使用多态方式 建立对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//遍历
//使用迭代器 遍历 每一个集合对象都有本身的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
}
}
~~~
> tips::在进行集合元素取出时,若是集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。
2.2 迭代器的实现原理
咱们在以前案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先经过调用t集合的iterator()方法得到迭代器对象,而后使用hashNext()方法判断集合中是否存在下一个元素,若是存在,则调用next()方法将元素取出,不然说明已到达了集合末尾,中止遍历元素。
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工做原理,接下来经过一个图例来演示Iterator对象迭代元素的过程:
在调用Iterator的next方法以前,迭代器的索引位于第一个元素以前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
2.3 加强for
加强for循环(也称for each循环)是**JDK1.5**之后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理实际上是个Iterator迭代器,因此在遍历的过程当中,不能对集合中的元素进行增删操做。
格式:
~~~java
for(元素的数据类型 变量 : Collection集合or数组){
//写操做代码
}
~~~
它用于遍历Collection和数组。一般只进行遍历元素,不要在遍历的过程当中对集合元素进行增删操做。
练习1:遍历数组
~~~java
public class NBForDemo1 {
public static void main(String[] args) {
int[] arr = {3,5,6,87};
//使用加强for遍历数组
for(int a : arr){//a表明数组中的每一个元素
System.out.println(a);
}
}
}
~~~
练习2:遍历集合
~~~java
public class NBFor {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("小河神");
coll.add("老河神");
coll.add("神婆");
//使用加强for遍历
for(String s :coll){//接收变量s表明 表明被遍历到的集合元素
System.out.println(s);
}
}
}
~~~
> tips: 新for循环必须有被遍历的目标。目标只能是Collection或者是数组。新式for仅仅做为遍历操做出现。
3、 List集合
3.1 List接口介绍
`java.util.List`接口继承自`Collection`接口,是单列集合的一个重要分支,习惯性地会将实现了`List`接口的对象称为List集合。在List集合中容许出现重复的元素,全部的元素是以一种线性方式进行存储的,在程序中能够经过索引来访问集合中的指定元素。另外,List集合还有一个特色就是元素有序,即元素的存入顺序和取出顺序一致。
看完API,咱们总结一下:
List接口特色:
1. 它是一个元素存取有序的集合。例如,存元素的顺序是十一、2二、33。那么集合中,元素的存储就是按照十一、2二、33的顺序完成的)。
2. 它是一个带有索引的集合,经过索引就能够精确的操做集合中的元素(与数组的索引是一个道理)。
3. 集合中能够有重复的元素,经过元素的equals方法,来比较是否为重复的元素。
> tips:咱们在基础班的时候已经学习过List接口的子类java.util.ArrayList类,该类中的方法都是来自List中定义。
3.2 List接口中经常使用方法
List做为Collection集合的子接口,不但继承了Collection接口中的所有方法,并且还增长了一些根据元素索引来操做集合的特有方法,以下:
- `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
- `public E get(int index)`:返回集合中指定位置的元素。
- `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
- `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
List集合特有的方法都是跟索引相关,咱们在基础班都学习过,那么咱们再来复习一遍吧:
```java
public class ListDemo {
public static void main(String[] args) {
// 建立List集合对象
List<String> list = new ArrayList<String>();
// 往 尾部添加 指定元素
list.add("图图");
list.add("小美");
list.add("不高兴");
System.out.println(list);
// add(int index,String s) 往指定位置添加
list.add(1,"没头脑");
System.out.println(list);
// String remove(int index) 删除指定位置元素 返回被删除元素
// 删除索引位置为2的元素
System.out.println("删除索引位置为2的元素");
System.out.println(list.remove(2));
System.out.println(list);
// String set(int index,String s)
// 在指定位置 进行 元素替代(改)
// 修改指定位置元素
list.set(0, "三毛");
System.out.println(list);
// String get(int index) 获取指定位置元素
// 跟size() 方法一块儿用 来 遍历的
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//还可使用加强for
for (String string : list) {
System.out.println(string);
}
}
}
```
4、List的子类
4.1 ArrayList集合
`java.util.ArrayList`集合数据存储的结构是数组结构。元素增删慢,查找快,因为平常开发中使用最多的功能为查询数据、遍历数据,因此`ArrayList`是最经常使用的集合。
许多程序员开发时很是随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
4.2 LinkedList集合
`java.util.LinkedList`集合数据存储的结构是链表结构。方便元素添加、删除的集合。
> LinkedList是一个双向链表,那么双向链表是什么样子的呢,咱们用个图了解下
实际开发中对一个集合元素的添加与删除常常涉及到首尾操做,而LinkedList提供了大量首尾操做的方法。这些方法咱们做为了解便可:
* `public void addFirst(E e)`:将指定元素插入此列表的开头。
* `public void addLast(E e)`:将指定元素添加到此列表的结尾。
* `public E getFirst()`:返回此列表的第一个元素。
* `public E getLast()`:返回此列表的最后一个元素。
* `public E removeFirst()`:移除并返回此列表的第一个元素。
* `public E removeLast()`:移除并返回此列表的最后一个元素。
* `public E pop()`:今后列表所表示的堆栈处弹出一个元素。
* `public void push(E e)`:将元素推入此列表所表示的堆栈。
* `public boolean isEmpty()`:若是列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可使用,这里就不作详细介绍,咱们只须要了解LinkedList的特有方法便可。在开发时,LinkedList集合也能够做为堆栈,队列的结构使用。(了解便可)
方法演示:
~~~java
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
System.out.println(link);
// 获取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while (!link.isEmpty()) { //判断集合是否为空
System.out.println(link.pop()); //弹出集合中的栈顶元素
}
System.out.println(link);
}
}
~~~
5、Set接口
`java.util.Set`接口和`java.util.List`接口同样,一样继承自`Collection`接口,它与`Collection`接口中的方法基本一致,并无对`Collection`接口进行功能上的扩充,只是比`Collection`接口更加严格了。与`List`接口不一样的是,`Set`接口中元素无序,而且都会以某种规则保证存入的元素不出现重复。
`Set`集合有多个子类,这里咱们介绍其中的`java.util.HashSet`、`java.util.LinkedHashSet`这两个集合。
> tips:Set集合取出元素的方式能够采用:迭代器、加强for。
5.1 HashSet集合介绍
`java.util.HashSet`是`Set`接口的一个实现类,它所存储的元素是不可重复的,而且元素都是无序的(即存取顺序不一致)。`java.util.HashSet`底层的实现实际上是一个`java.util.HashMap`支持,因为咱们暂时还未学习,先作了解。
`HashSet`是根据对象的哈希值来肯定元素在集合中的存储位置,所以具备良好的存取和查找性能。保证元素惟一性的方式依赖于:`hashCode`与`equals`方法。
咱们先来使用一下Set集合存储,看下现象,再进行原理的讲解:
~~~java
public class HashSetDemo {
public static void main(String[] args) {
//建立 Set集合
HashSet<String> set = new HashSet<String>();
//添加元素
set.add(new String("cba"));
set.add("abc");
set.add("bac");
set.add("cba");
//遍历
for (String name : set) {
System.out.println(name);
}
}
}
~~~
输出结果以下,说明集合中不能存储重复元素:
~~~
cba
abc
bac
~~~
> tips:根据结果咱们发现字符串"cba"只存储了一个,也就是说重复的元素set集合不存储。
2.2 HashSet集合存储数据的结构(哈希表)
什么是哈希表呢?
在**JDK1.8**以前,哈希表底层采用数组+链表实现,即便用链表处理冲突,同一hash值的链表都存储在一个链表里。可是当位于一个桶中的元素较多,即hash值相等的元素较多时,经过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减小了查找时间。
简单的来讲,哈希表是由数组+链表+红黑树(JDK1.8增长了红黑树部分)实现的,以下图所示。
看到这张图就有人要问了,这个是怎么存储的呢?
为了方便你们的理解咱们结合一个存储流程图来讲明一下:
总而言之,**JDK1.8**引入红黑树大程度优化了HashMap的性能,那么对于咱们来说保证HashSet集合元素的惟一,其实就是根据对象的hashCode和equals方法来决定的。若是咱们往集合中存放自定义的对象,那么保证其惟一,就必须复写hashCode和equals方法创建属于当前对象的比较方式。
5.3 HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,须要重写对象中的hashCode和equals方法,创建本身的比较方式,才能保证HashSet集合中的对象惟一
建立自定义Student类
~~~java
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
~~~
~~~java
public class HashSetDemo2 {
public static void main(String[] args) {
//建立集合对象 该集合中存储 Student类型对象
HashSet<Student> stuSet = new HashSet<Student>();
//存储
Student stu = new Student("于谦", 43);
stuSet.add(stu);
stuSet.add(new Student("郭德纲", 44));
stuSet.add(new Student("于谦", 43));
stuSet.add(new Student("郭麒麟", 23));
stuSet.add(stu);
for (Student stu2 : stuSet) {
System.out.println(stu2);
}
}
}
执行结果:
Student [name=郭德纲, age=44]
Student [name=于谦, age=43]
Student [name=郭麒麟, age=23]
~~~
5.3 LinkedHashSet
咱们知道HashSet保证元素惟一,但是元素存放进去是没有顺序的,那么咱们要保证有序,怎么办呢?
在HashSet下面有一个子类`java.util.LinkedHashSet`,它是链表和哈希表组合的一个数据存储结构。
演示代码以下:
~~~java
public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
结果:
bbb
aaa
abc
bbc
~~~
5.9 可变参数
在**JDK1.5**以后,若是咱们定义一个方法须要接受多个参数,而且多个参数类型一致,咱们能够对其简化成以下格式:
```
修饰符 返回值类型 方法名(参数类型... 形参名){ }
```
其实这个书写彻底等价与
```
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
```
只是后面这种定义,在调用时必须传递数组,而前者能够直接传递数据便可。
**JDK1.5**之后。出现了简化操做。**...** 用在参数上,称之为可变参数。
一样是表明数组,可是在调用这个带有可变参数的方法时,不用建立数组(这就是简单之处),直接将数组中的元素做为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动做都在编译.class文件时,自动完成了。
代码演示:
```java
public class ChangeArgs {
public static void main(String[] args) {
int[] arr = { 1, 4, 62, 431, 2 };
int sum = getSum(arr);
System.out.println(sum);
// 6 7 2 12 2121
// 求 这几个元素和 6 7 2 12 2121
int sum2 = getSum(6, 7, 2, 12, 2121);
System.out.println(sum2);
}
/*
* 完成数组 全部元素的求和 原始写法
public static int getSum(int[] arr){
int sum = 0;
for(int a : arr){
sum += a;
}
return sum;
}
*/
//可变参数写法
public static int getSum(int... arr) {
int sum = 0;
for (int a : arr) {
sum += a;
}
return sum;
}
}
```
> tips: 上述add方法在同一个类中,只能存在一个。由于会发生调用的不肯定性
> 注意:若是在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数必定要写在参数列表的末尾位置。
第十章图形程序设计知识点总结:
一、swing概述:swing基于AWT架构之上,Swing是指被绘制的用户界、面类,AWT是指像事件处理这样的窗口工具箱的底层机制,Swing可让用户随意的选择喜欢的感官。
二、框架:没有包含在其余窗口中的窗口被称为框架(frame),在AWT中有一个Frame类,是用来描述框架的,这个类在Swing版本中是JFrame(绝大数的Swing组件都有J开头),它是极少数几个不绘制在画布上的Swing组件之一,它的修饰部件(如按钮,标题栏,图标等)由用户的窗口系统绘制,而不是由Swing绘制,Swing用来绘制框架里的内容。
JFrame.setVisible(true)方法可让框架可见,
JFrame.show()可让框架可见而且置于其余窗口的前面。
JFrame.setDefaultCloseOperation(int i)能够定义关闭这个框架时候的响应动做,让程序退出的常量是JFrame.EXIT_ON_CLOSE。(以上方法都不是静态方法!)在初始化完后,main方法退出,这个时候程序并无终止,终止的只是主线程,事件调度线程保持程序处于激活状态,直到关闭框架或者调用System.exit。
三、改变框架:
3.一、Component类:setVisible(boolean bool)设置窗口是否显示;
set||getSize(int w,int h||Dimension d)设置/获取大小;
set||getLocation(int x,int y)设置获取位置,setBounds(int x,int y,int w,int h)设置位置和大小。
3.二、windows类:toBack()将窗口移动到桌面窗口栈的后面 ;
toFront()将窗口移动到桌面的前面;
setLocationByPlatfrom(boolean bool)由平台选择一个合适的位置显示窗口。
3.三、Frame类: isResizable(boolean bool)是否可让用户改变大小;
setTitle(String str)设置标题;
setIconImage(Image img)设置框架的图标。
setUndecorate(boolean bool)框架显示中的标题栏以及关闭按钮这些是否显示;
setExtendedState(int state)设置窗口的状态,如Frame.ICONIFIED可让窗口最小化。
3.四、Toolkit类:getDefaultToolkit()返回一个默认的工具箱;
Dimension getScreen()返回用户屏幕的尺寸;
Image getImage(String filename)加载获得一个指定的图像对象。
四、绘制组件:绘制一个组件,须要定义一个扩展JComponent的类,并覆盖其中的paintComponent(Graphics g)方法,在JAVA中,全部的绘制都必须使用Craphics对象。只要窗口须要从新绘图时,事件处理器就会通告组件,从而执行全部组件的paintComponent方法。不用本身调用paintComponent方法,在应用程序须要从新绘图的时候,这个方法会自动的被调用,若是须要强制从新绘制组件,那么要调用的是repaint方法,他将引起采用相应配置的Graphics对象调用全部组件的paintComponent方法。
4.一、JFrame类:getContentPane()返回框架里的内容窗口;
add(Component comp)将一个给定的组件添加到该框架的内容窗口中。
4.二、Component类:repaint()从新绘制组件。
4.三、JPanel类是一个能够包含其余组件的容器,但一样也能够在其上面进行绘制。
五、绘制2D图形:主要是用java.awt.Graphics2D类去绘制图形的。图形的类主要在java.awt.geom里。要掌握这些之间的关系。
paintComponent方法能够自动得到一个Graphics对象,能够把他强制转型成Graphics2D对象。
第二部分:实验部分
1、实验目的与要求
(1) 掌握Vetor、Stack、Hashtable三个类的用途及经常使用API;
(2) 掌握ArrayList、LinkList两个类的用途及经常使用API。
(3) 掌握Java GUI中框架建立及属性设置中经常使用类的API;
(4) 应用结对编程(Pair programming),体验程序开发中的两人合做。
2、实验内容和步骤
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
l 使用JDK命令运行编辑、运行如下三个示例程序,结合运行结果理解程序;
掌握Vetor、Stack、Hashtable三个类的用途及经常使用API
//示例程序1 import java.util.Vector; class Cat { private int catNumber; Cat(int i) { catNumber = i; } void print() { System.out.println("Cat #" + catNumber); } } public class Cats{ public static void main(String[] args){ Vector<Cat> cats= new Vector<Cat>(); for(int i=0; i<7; i++) cats.addElement(new Cat(i)); for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); } }
运行结果:
//示例程序2
package 集合; import java.util.Stack; public class Stacks { static String[] months = { "金", "银", "铜", "铁" }; public static void main(String[] args) { Stack<String> stk = new Stack<String>(); for (int i = 0; i < months.length; i++) stk.push(months[i]); System.out.println(stk); System.out.println("element2=" + stk.elementAt(2)); while (!stk.empty()) { System.out.println(stk.pop()); } } }
运行结果:
//示例程序3 import java.util.*; class Counter { int i = 1; public String toString() { return Integer.toString(i); } } public class Statistics { public static void main(String[] args) { Hashtable ht = new Hashtable(); for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20)); if(ht.containsKey(r)) ((Counter)ht.get(r)).i++; else ht.put(r, new Counter()); } System.out.println(ht); }
运行结果:
测试程序2:
l 使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { ArrayList al = new ArrayList(); // Add lots of elements to the ArrayList... al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // First print them out using a for loop. System.out.println("Retrieving by index:"); for (int i = 0; i < al.size(); i++) { System.out.println("Element " + i + " = " + al.get(i)); } } }
运行结果:
package 集合; import java.util.LinkedList; import java.util.ListIterator; public class LinkedListDemo { public static void main(String[] argv) { LinkedList l = new LinkedList(); l.add(new Object()); l.add("Hello"); l.add("zhangsan"); ListIterator li=l.listIterator(0);// listIterator(int index) 构造器,能够从指定下标处开始遍历 while(li.hasNext()) System.out.println(li.next()); if(l.indexOf("Hello")<0)//public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,若是此字符串中没有这样的字符,则返回 -1。 System.out.println("Lookup does not work"); else System.out.println("Lookup works"); } }
运行结果:
l 在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
l 掌握ArrayList、LinkList两个类的用途及经常使用API。
package 集合; import java.util.*; /** * This program demonstrates operations on linked lists. * @version 1.12 2018-04-10 * @author Cay Horstmann */ public class LinkedListTest { public static void main(String[] args) { var a = new LinkedList<String>(); a.add("Amy"); a.add("Carl"); a.add("Erica"); var b = new LinkedList<String>(); b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); // merge the words from b into a ListIterator<String> aIter = a.listIterator(); Iterator<String> bIter = b.iterator(); while (bIter.hasNext()) { if (aIter.hasNext()) aIter.next(); aIter.add(bIter.next()); } System.out.println(a); // remove every second word from b bIter = b.iterator(); while (bIter.hasNext()) { bIter.next(); // skip one element if (bIter.hasNext()) { bIter.next(); // skip next element bIter.remove(); // remove that element } } System.out.println(b); // bulk operation: remove all words in b from a a.removeAll(b); System.out.println(a); } }
运行结果:
实验2:导入第10章示例程序,测试程序并进行代码注释。
测试程序1:
l 运行下列程序,观察程序运行结果。
package 集合; import javax.swing.JFrame; public class SimpleFrameTest { public static void main(String[] args) { JFrame frame=new JFrame(); frame.setBounds(0,0,300,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
运行结果:
l 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
l 掌握空框架建立方法;
l 了解主线程与事件分派线程概念;
l 掌握GUI顶层窗口建立技术。
package 图像程序设计; import java.awt.EventQueue; import javax.swing.JFrame; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(()-> { SimpleFrame frame=new SimpleFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//是设置用户在此窗体上发起 "close" 时默认执行的操做。必须指定如下选项之一: frame.setVisible(true);//setVisible方法:程序框是否是在界面可见的 frame.setTitle("Hello world");//用于改变标题栏的文字 }); } }
运行结果:
测试程序2:
l 在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;
l 掌握肯定框架经常使用属性的设置方法。
package 图像程序设计; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Image; import java.awt.Toolkit; import javax.swing.ImageIcon; import javax.swing.JFrame; public class SizedFrameTest{ public static void main(String[] args) { EventQueue.invokeLater(()-> { JFrame frame=new SizedFrame(); frame.setTitle("SizedFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } class SizedFrame extends JFrame{ public SizedFrame() { //get screen dimensions Toolkit kit=Toolkit.getDefaultToolkit();//调用Toolkit类的静态方法,getDefaultTookit获得Tookit对象 Dimension screenSize=kit.getScreenSize();//获得屏幕的尺寸 int screenHeight=screenSize.height; int screenWidth=screenSize.width; setSize(screenWidth/2,screenHeight/2); setLocationByPlatform(true); //set frame icon Image img=new ImageIcon("F:\\照片\\2019-05\\3e22741e711cf0b01c0e52dc4efc587b.jpg").getImage(); setIconImage(img); } }
运行结果:
测试程序3:
l 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
l 掌握在框架中添加组件;
l 掌握自定义组件的用法。
package 图像程序设计; import java.awt.EventQueue; import javax.swing.JFrame; public class NotHelloWorld { public static void main(String[] args) { EventQueue.invokeLater(()-> { JFrame frame=new NotHelloWorldFrame(); frame.setTitle("NotHelloWorld"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
package 图像程序设计; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JComponent; public class NotHelloWorldComponent extends JComponent { public static final int MESSAGE_X=75; public static final int MESSAGE_Y=100; private static final int DFFAULT_WIDTH=300; private static final int DFFAULT_HEIGHT=300; public void paintComponent(Graphics g) { g.drawString("Not a Hello,World program", MESSAGE_X, MESSAGE_Y); } public Dimension getPreferredSize() { return new Dimension( DFFAULT_WIDTH,DFFAULT_HEIGHT); } }
package 图像程序设计; import javax.swing.JFrame; public class NotHelloWorldFrame extends JFrame { public NotHelloWorldFrame() { add(new NotHelloWorldComponent()); pack(); } }
运行结果:
关于结对编程:
l 如下图片是一个结对编程场景:两位学习伙伴坐在一块儿,面对着同一台显示器,使用着同一键盘,同一个鼠标,他们一块儿思考问题,一块儿分析问题,一块儿编写程序
l 关于结对编程的阐述可参见如下连接:
http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html
http://en.wikipedia.org/wiki/Pair_programming
l 对于结对编程中代码设计规范的要求参考:
http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
实验总结:
个人感觉:本周主要学习了Vetor、Stack、Hashtable三个类的用途及经常使用API,ArrayList、LinkList两个类的用途及经常使用API,同时对于集合的知识进行了更加深刻的学习,同时也学习了图形用户界面设计有关的知识,经过本章的学习我了解了如何用一些组件去画字,图形。了解了建立框架时的一些经常使用API,图形用户界面的一些基础的设计操做,好比窗口显示不一样图形,文字等等,以为颇有意思;但实际用这些知识本身去设计图形仍是会有必定的难度。经过练习题集练习学过的内容,对学过的知识进行了再巩固,加深了理解。