项目 |
内容 |
这个作业属于哪个课程 |
<任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
<作业链接地址>https://www.cnblogs.com/nwnu-daizh/p/11867214.html |
作业学习目标 |
(1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API; (2) 掌握ArrayList、LinkList两个类的用途及常用API; (3) 了解java集合框架体系组成; (4) 掌握Java GUI中框架创建及属性设置中常用类的API; (5) 了解Java GUI中2D图形绘制常用类的API; |
第一部分:总结第九章、第十章理论知识
第九章 集合
1.JAVA的集合框架
- JAVA的集合框架实现对各种数据结构的封装,以降低对数据管理与处理的难度。
- 所谓框架就是一个类库的集合,框架中包含很多超类,编程者创建这些超类的子类可较方便的设计设计程序所需的类。例如:Swing类包
- 集合(或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成。
- 集合框架:JAVA集合类库的统一架构。
- 集合类的作用: Java的集合类提供了一些基本数据结构的支持。例如Vector、Hashtable、Stack等。
- 集合类的使用:Java的集合类包含在java.util包中。 import java.util.*;
- 集合类的特点:只容纳对象。注意:数组可以容纳基本数据类型数据和对象。 如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。
- 新旧集合类:Vector(矢量),Hashtable(哈希表),Stack(堆栈),Properties(属性集)。
2.JDK1.1版本中的集合类
- Vector类
Vector类类似长度可变的数组。
Vector中只能存放对象。
Vector的元素通过下标进行访问。
Vector类关键属性:capacity表示集合最多能容纳的元素个数;capacityIncrement表示每次增加多少容量;size表示集合当前元素个数。
Vector类的关键方法:(1)void addElement(Object obj);(2)void add(int index,Object element);(3)Object elementAt(int index);(4)void insertElementAt(Object obj,int index)
Vector类举例:实验一测试程序一示例一。
- Stack类
Stack类是Vector的子类。
Stack类描述堆栈数据结构,即LIFO。
Stack类的关键方法:(1)public void push(Object item);(2)public Object pop();(3)public Object peek();(4)public boolean empty()。
Stack类举例:实验一测试程序一示例二。
- Hashtable类
Hashtable通过键来查找元素。
Hashtable用散列码(hashcode)来确定键。所有对象都有一个散列码,可以通过Object类的hashCode()方法获得。
Hashtable类举例:实验一测试程序一示例三。
3.JDK1.2以后版本中的集合类
- 集合框架中的基本接口:
Collection:集合层次中的根接口。
Set:不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set。
List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。
Map:包含了key-value对。Map不能包含重复的key。
SortedMap是一个按照升序排列key的Map。
- 集合框架中的类
Collection接口:构造类集框架的基础。
List的明显特征是它的元素都有一个确定的顺序。
实现它的类有ArrayList和LinkedList。ArrayList中的元素在内存中是顺序存储的。LinkedList中的元素在内存中是以链表方式存储的。
ArrayList:可以将其看作是能够自动增长容量的数组。
利用ArrayList的toArray()返回一个数组。
Arrays.asList()返回一个列表。
LinkedList是采用双向循环链表实现的。
利用LinkedList实现栈(stack)、队列(queue)、双向队列 (double-ended queue )。
LinkedList的底层数据采用双向链表(double-linked list)完成,每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。
如果经常在 List 中进行插入和删除操作,应该使用LinkedList,否则,使用ArrayList将更加快速。
ArrayList举例:实验一测试程序二。
LinkedList类举例:实验一测试程序二。
Set中的元素必须唯一。
添加到Set中的对象元素必须定义equals方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的唯一性。
实现Set接口的类有HashSet,TreeSet。
TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。
可以在构造TreeSet对象时,传递实现了 Comparator接口的比较器对象。
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。通常使用HashSet,需要排序的功能时,使用TreeSet。
Map接口用来维持很多“键-值”对,以便通过键来查找相应的值。
HashMap基于散列表实现(替代Hashtable)。
TreeMap在一个二叉树的基础上实现。
Map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它
Map循环使用两个基本操作:get( )和put( )。使用 put( )方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用 get( )方法。调用返回该值。
Map接口的实现类主要有HashMap,TreeMap,Hashtable,Properties。HashMap对key进行散列。TreeMap按照key进行排序。和Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap。
第十章:图形程序设计
- AWT
Java的抽象窗口工具箱(AbstractWindow Toolkit,AWT)包含在java.awt包中,它提供了许 多用来设计GUI的组件类和容器类。
AWT库处理用户界面元素的方法:把图形元素的创 建和行为委托给本地GUI工具箱进行处理。
AWT库使用缺陷。菜单,滚动条,文本域等用户界面元素,在不同的平台上,操作行为上从在一些微妙的差异。
- Swing:
Swing用户界面库是非基于对等体的GUI工具箱。
Swing具有更丰富并且更方便的用户界面元素集合。
Swing类库被放在javax.swing包里。WT和Swing的关系
大部分AWT组件都有其Swing的等价组件。
Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等。
- 创建框架
组件:构成图形用户界面的元素,拿来即用 用图形表示(能在屏幕上显示,能和用户进行交互)
通常把由Component类的子类或间接子类创建的 对象称为一个组件。
容器:容器是Java中能容纳和排列组件的组件。
常用的容器是框架(Frame,JFrame)
添加组件:
Container类提供了一个方法add(),用来在容器类 组件对象中添加其他组件。
容器本身也是一个组件,可以把一个容器添加到 另一个容器里,实现容器嵌套。
框架的创建:
(1)创建空框架
在Java中,常采用框架(Frame)创建初始界面, 即GUI的顶层窗口。
AWT库中有一个基于对等体的Frame类。
该类的Swing版本为JFrame,JFrame是Frame子类。
(2)框架定位与框架属性
定位: 常用Component类的setLocation和setBounds方法
常用属性 :Title:框架标题 IconImage:框架图标
(4)确定框架大小
通过调用Toolkit类的方法来得到屏幕尺寸信息。
在组件中显示信息:在AWT中可调用add()方法把组件直接添加到AWT Frame中,在Swing中组件则添加到内容窗格里。
第二部分:实验部分
实验1:导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
l 使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
l 掌握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){ Vectorcats= new Vector ();//定义Vector类的泛型类cats for(int i=0; i<7; i++) //关键方法:添加元素 cats.addElement(new Cat(i)); //addElement(Object obj)把组件加到向量尾部,同时大小加1,向量容量比以前大1 for(int i=0; i
运行如下:
//示例程序2
代码如下:
import java.util.*; public class Stacks { static String[] months={"gold","silver","copper","iron"}; //定义静态字符串数组 public static void main(String[] args){ Stackstk = new Stack ();//定义Stack类的泛型类stk for(int i=0; i
运行如下:
//示例程序3
代码如下:
class Counter { int i = 1; //toString方法 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));//产生1000个[0,20)的整型数值 //Math.random()产生 >=0.0,<1.0带正号的double值 if(ht.containsKey(r))//containsKey方法,是否包含r ((Counter)ht.get(r)).i++;//强制转换ht为Counter类,get方法让次数加1 else ht.put(r, new Counter());//否则创建新的类对象 } System.out.println(ht); } }
程序运行如下:
小结:
Vector类类似长度可变的数组。Vector类的关键方法:(1)void addElement(Object obj);(2)void add(int index,Object element);(3)Object elementAt(int index);(4)void insertElementAt(Object obj,int index)
Stack类描述堆栈数据结构,即LIFO。Stack类的关键方法:(1)public void push(Object item);(2)public Object pop();(3)public Object peek();(4)public boolean empty()。
Hashtable通过键来查找元素。Hashtable用散列码(hashcode)来确定键。所有对象都有一个散列码,可以通过Object类的hashCode()方法获得。
实验1:测试程序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... 在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++) {//for循环输出小于al的元素 System.out.println("Element " + i + " = " + al.get(i)); } } }
程序运行如下:
代码如下:
import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { LinkedList l = new LinkedList(); //调用add方法添加元素 l.add(new Object()); l.add("Hello"); l.add("zhangsan"); ListIterator li = l.listIterator(0); while (li.hasNext())//当li中还有元素时输出下一个元素 System.out.println(li.next()); if (l.indexOf("Hello") < 0) //找不到“Hello”时返回下面的语句 System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
程序运行如下:
实验1:测试程序3
l 在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
l 掌握ArrayList、LinkList两个类的用途及常用API。
代码如下:
package linkedList; 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(); //在a内添加元素 a.add("Amy"); a.add("Carl"); a.add("Erica"); var b = new LinkedList (); //在a内添加元素 b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); // 合并b和a ListIterator aIter = a.listIterator();//listIterator接口是iterator的子接口 Iterator bIter = b.iterator(); while (bIter.hasNext()) { if (aIter.hasNext()) aIter.next();//hasNext()方法 aIter.add(bIter.next());//将bIter的下一个元素添加至aIter中 } System.out.println(a); // 移除b中的每两个单词 bIter = b.iterator(); while (bIter.hasNext()) { bIter.next(); //跳过一个元素 if (bIter.hasNext()) { bIter.next(); // 跳过下一个元素 bIter.remove(); //移除元素 } } System.out.println(b); //批量操作:移除a中所有的b元素 a.removeAll(b); System.out.println(a); } }
程序运行如图:
小结:
ArrayList:可以将其看作是能够自动增长容量的数组。利用ArrayList的toArray()返回一个数组。
LinkedList的底层数据采用双向链表(double-linked list)完成,每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。
如果经常在 List 中进行插入和删除操作,应该使用LinkedList,否则,使用ArrayList将更加快速。
实验2:导入第10章示例程序,测试程序并进行代码注释。
测试程序1:
l 运行下列程序,观察程序运行结果。
代码如下:
import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setBounds(0, 0,300, 200);//setBounds方法定义像素初始位置,宽度和长度 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setDefaultCloseOperation()方法:可关闭 frame.setVisible(true); } }
程序运行如图:
l 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
l 掌握空框架创建方法;
l 了解主线程与事件分派线程概念;
l 掌握GUI顶层窗口创建技术。
代码如下:
package simpleframe; import java.awt.*; import javax.swing.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(() -> //lambda表达式 { var frame = new SimpleFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setDefaultCloseOperation()定义一个用户关闭这个框架时的响应动作 frame.setVisible(true);//setVisible(true)方法:显示一个组件 }); } } class SimpleFrame extends JFrame { //设置框架大小 private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; public SimpleFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
程序运行如图:
实验2:
l 在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;
l 掌握确定框架常用属性的设置方法。
代码如下:
package sizedFrame; import java.awt.*; import javax.swing.*; /** * @version 1.35 2018-04-10 * @author Cay Horstmann */ public class SizedFrameTest { public static void main(String[] args) { EventQueue.invokeLater(() -> //lambda表达式 { var frame = new SizedFrame(); frame.setTitle("SizedFrame");//setTitle()方法:设置标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setDefaultCloseOperation()方法:定义一个用户关闭这个框架时的响应动作 frame.setVisible(true);//setVisible(ture)方法:窗口是否可见 }); } } class SizedFrame extends JFrame//创建了一个JFrame继承类 { public SizedFrame() { //得到屏幕尺寸 Toolkit kit = Toolkit.getDefaultToolkit();//通过类名调用了方法 Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height;//得到屏幕高度 int screenWidth = screenSize.width; // 设置屏幕宽和高,并选择屏幕位置 setSize(screenWidth / 2, screenHeight / 2);//设置屏幕大小 setLocationByPlatform(true); //设置框架图标 Image img = new ImageIcon("icon.gif").getImage();//设置灰度 setIconImage(img); } }
程序运行如图:
实验2:
l 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
l 掌握在框架中添加组件;
掌握自定义组件的用法。
代码如下:
package notHelloWorld; import javax.swing.*; import java.awt.*; /** * @version 1.34 2018-04-10 * @author Cay Horstmann */ public class NotHelloWorld { public static void main(String[] args) { EventQueue.invokeLater(() -> { var frame = new NotHelloWorldFrame(); frame.setTitle("NotHelloWorld");//设置标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//定义一个用户关闭这个框架时的响应动作 frame.setVisible(true);////setVisible()方法:窗口是否可见 }); } } /** * A frame that contains a message panel. */ class NotHelloWorldFrame extends JFrame//创建子类 { public NotHelloWorldFrame() { add(new NotHelloWorldComponent()); pack();//pack()方法:框架中填入的组件的首选大小 } } /** * A component that displays a message. */ class NotHelloWorldComponent extends JComponent { public static final int MESSAGE_X = 75; public static final int MESSAGE_Y = 100; private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; public void paintComponent(Graphics g) { //在原始窗口大约水平1/4,垂直1/2的位置显示字符串Not a Hello, World program g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); //drawString()方法:显示文本是一种特殊的绘图。 } public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
程序运行如下:
实验总结:
通过本次实验我掌握了Vetor、Stack、Hashtable三个类的用途及常用的API;了解了java集合框架体系的组成;掌握了ArrayList、LinkList两个类的用途及常用的API;了解了HashSet类、TreeSet类的用途及常用的API;还了解了HashMap、TreeMap两个类的用途及常用的API。还有Java中开发图形应用程序的常用控件、 熟悉了JAVA SWING中的容器、组件、布局以及事件监视器和事件接口的使用。通过该实验掌握了JAVA图形界面程序设计的方法。对如何创建框架,以及如何生成一个绘制图形的面板 ,以及如何在面板上绘制图形有了一定的了解,以及如何设置窗口中的字体,以及窗口的背景,还有字体大小字体颜色有了一定了解,通过对源码的查看,对如何设计窗口,以及窗口中的一些属性有了进一步的理解。