项目 |
内容 |
这个作业属于哪个课程 |
<任课教师博客主页链接> 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; |
第一部分:总结第九章、第十章理论知识(40分)
第九章:
1.集合是一种包含多个元素 并提供对所包含元素操作方法的类,其包含的元 素可以由同一类型的对象组成,也可以由不同类 型的对象组成。
2.集合框架:JAVA集合类库的统一架构。
框架就是一个类库,框架中包含一些通用接口和超类,实现这些接口或创建这些超类的子类就可方便的设计程序所需的类。
集合类的作用: Java的集合类提供了一些基本数据结构的支持。 例Vector、Hashtable、Stack等。
集合类的使用: Java的集合类包含在java.util包中。
集合类的特点:
1. 只容纳对象。 注意:数组可以容纳基本数据类型数据和对象。 如果集合类中想使用基本数据类型,又想利用 集合类的灵活性,可以把基本数据类型数据封 装成该数据类型的包装器对象,然后放入集合 中处理。
2. 集合类容纳的对象都是Object类的实例,一旦 把一个对象置入集合类中,它的类信息将丢失 ,这样设计的目的是为了集合类的通用性。 因为Object类是所有类的祖先,所以可以在这 些集合中存放任何类的对象而不受限制,但切 记在使用集合成员之前必须对它重新造型。
Vector类:
Vector类类似长度可变的数组。
Vector中只能存放对象。
Vector的元素通过下标进行访问。
Vector类关键属性: capacity表示集合多能容纳的元素个数。 capacityIncrement表示每次增加多少容量。 size表示集合当前元素个数。
Stack类:Stack类是Vector的子类。FILO
Hashtable类:
Hashtable通过键来查找元素。
Hashtable用散列码(hashcode)来确定键。所 有对象都有一个散列码,可以通过Object类的 hashCode()方法获得。
Math.random()方法的随机性。
集合框架中的基本接口:
Collection:集合层次中的根接口,JDK未提供这个 接口的直接实现类。
Set:不能包含重复的元素。对象可能不是按存放的 次序存放,也就是说不能像数组一样按索引的方式进 行访问,SortedSet是一个按照升序排列元素的Set。
List:是一个有序的集合,可以包含重复的元素。提 供了按索引访问的方式。 Map:包含了key-value对。Map不能包含重复的key 。
SortedMap是一个按照升序排列key的Map。
List:
List的明显特征是它的元素 都有一个确定的顺序。
LinkedList中的元素在内存 中是以链表方式存储的。 List的明显特征是它的元素 都有一个确定的顺序。
实现它的类有ArrayList和 LinkedList。
ArrayList中的元素在内存中 是顺序存储的。
LinkedList中的元素在内存 中是以链表方式存储的。
ArrayList和linkedList :
ArrayList:可以将其看作是能够自动增长容量的数组。利用ArrayList的toArray()返回一个数组。
Arrays.asList()返回一个列表。
LinkedList是采用双向循环链表实现的。
利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )。
ArrayList底层采用数组完成,而LinkedList则是以一般的 双向链表(double-linked list)完成,其内每个对象除了数据 本身外,还有两个引用,分别指向前一个元素和后一个元 素。
如果经常在 List 中进行插入和删除操作,应该使用LinkedList,否则,使用ArrayList将更加快速。
Set:
Set中的元素必须唯一。
添加到Set中的对象元素必须定义equals方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的唯一性。
实 现 Set 接口的类有HashSet,TreeSet
HashSet与TreeSet:
TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。
可以在构造 TreeSet 对象时,传递实现了Comparator接口的比较器对象。
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。通常使用HashSet,需要排序的功能时,使用TreeSet。
Map:
映射(map)是一个存储关键字和值的关联或关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值是 可以被复制的。
Map接口映射唯一关键字到值。关键字(key)是以 后用于检索值的对象。给定一个关键字和一个值,可 以存储这个值到一个Map对象中。当这个值被存储以 后,就可以使用它的关键字来检索它
Map循环使用两个基本操作:get( )和put( )。使用put( )方法可以将一个指定了关键字和值的值加入映 射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该值。
第十章:
Java的抽象窗口工具箱包含在java.awt包中,它提供了许 多用来设计GUI的组件类和容器类。
AWT库处理用户界面元素的方法:把图形元素的创 建和行为委托给本地GUI工具箱进行处理。
Swing:
Swing用户界面库是非基于对等体的GUI工具箱。
Swing具有更丰富并且更方便的用户界面元素集合。
Swing类库被放在javax.swing包里。
大部分AWT组件都有其Swing的等价组件。
Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等。
组件:构成图形用户界面的元素,拿来即用图形表示(能在屏幕上显示,能和用户进行交互)
通常把由Component类的子类或间接子类创建的 对象称为一个组件。
容器:容器是Java中能容纳和排列组件的组件。
常用的容器是框架(Frame,JFrame)
添加组件:
Container类提供了一个方法add(),用来在容器类 组件对象中添加其他组件。
容器本身也是一个组件,可以把一个容器添加到 另一个容器里,实现容器嵌套。
框架的创建:
创建空框架
在Java中,常采用框架(Frame)创建初始界面,即GUI的顶层窗口. AWT库中有一个基于对等体的Frame类。
. 该类的Swing版本为JFrame,JFrame是Frame子类。
定位:
常用Component类的setLocation和setBounds方法常用属性
Title:框架标题
IconImage:框架图标
java.awt.Component 1.0
boolean isVisible() 检查组件是否可见
void setVisible(boolean b) 设置组件可见
void setSize(int width,int height) 把组件缩放到指定宽度和高度
void setBounds(int x,int y,intwidth,int height) 移动并缩放组件
Dimension getSize() 得到组件的大小
void setSize(Dimension d) 把组件缩放到指定的大小
2D图形:
Java SE了包含一个Java 2D库,该库提供了一个非常强大的图形操作集。
Graphics 2D 类是Graphics 类的子类, Graphics2D类对象通常可用Graphics对象转换而来。
颜色
Graphics2D类的setPaint方法(Graphics类为setColor方法)用来设置颜色。
例:g2.setPaint(Color.RED);g2.drawString(“Set Color”,100,100);
(1)Color类中定义的13种标准颜色
BLACK、BLUE、CYAN、DARK_GRAY、GRAY、GREEN、
LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、
WHITE、YELLOW
6,字体的使用:
(1)AWT中定义的五种逻辑字体名
SanaSerif
Serif
Monospaced
Dialog
DialogInput
这些逻辑字体在不同语言和操作系统上映射为不同
的物理字体。
(2)字体风格
Font.PLAIN
Font.BOLD
Fond.ITALIC
Fond.BOLD + Font.ITALIC
(3)设置字体
Font serif=new Font(“Serif”,Font.BOLD,14);
g2.setFont(serif);
第二部分:实验部分
实验1:测试程序1(6分)
使用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 import java.util.*; 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("element 2=" + 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++) {//生成10000个随机数 Integer r = new Integer((int) (Math.random() * 20)); if(ht.containsKey(r))//确定 Hashtable 是否包含特定键。 ((Counter)ht.get(r)).i++;//计算key的hash值,匹配直到找到相对应key的value,若没有找到返回null else ht.put(r, new Counter()); } System.out.println(ht); } }
小结:
Vector类:类似长度可变的数组;只能存放对象;通过下标进行访问。
关键属性: capacity表示集合多能容纳的元素个数。 capacityIncrement表示每次增加多少容量。 size表示集合当前元素个数。
Stack类:Vector的子类。特点:FILO
Hashtable类:通过键来查找元素。用散列码(hashcode)来确定键。所 有对象都有一个散列码,可以通过Object类的 hashCode()方法获得。
Math.random()方法的随机性。get、put 方法的使用。
实验1:测试程序2(6分)
使用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)); } } }
import java.util.*; 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); while (li.hasNext())//存在可访问的元素 System.out.println(li.next());//返回将要访问的下一个元素 if (l.indexOf("Hello") < 0) //返回第一次出现的指定子字符串在此字符串中的索引 System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
掌握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<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"); // 把b中的元素合并到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(); //返回下一个要访问的元素 bIter.remove(); // 移出元素 } } System.out.println(b); a.removeAll(b);//删除a中删除b中存在的所有元素 System.out.println(a); } }
实验2:测试程序1(6分)
运行下列程序,观察程序运行结果。
import javax.swing.*; 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); //获取或设置Visible属性 ,组件可见 } }
在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
掌握空框架创建方法;
了解主线程与事件分派线程概念;
掌握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(() -> { var frame = new SimpleFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.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:测试程序2(6分)
在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;
掌握确定框架常用属性的设置方法。
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(() -> { var 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类的静态方法getDefaultToolkit得到一个Toolkit对象 Dimension screenSize = kit.getScreenSize();//调用getScreenSize方法,以Dimension对象形式返回屏幕大小 int screenHeight = screenSize.height;//屏幕高度 int screenWidth = screenSize.width;//屏幕宽度 // set frame width, height and let platform pick screen location setSize(screenWidth / 2, screenHeight / 2);//框架大小定义为取值的50% setLocationByPlatform(true);//告知窗口系统定位框架 // set frame icon Image img = new ImageIcon("icon.gif").getImage(); setIconImage(img); //图像设置为框架图标 } }
实验2:测试程序3(6分)
在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
掌握在框架中添加组件;
掌握自定义组件的用法。
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); }); } } /** * A frame that contains a message panel. */ class NotHelloWorldFrame extends JFrame { public NotHelloWorldFrame() { add(new NotHelloWorldComponent());//将给定组件添加到该框架的内容窗格中 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)//覆盖这个方法描述一个如何绘制自己的组件 { g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } public Dimension getPreferredSize() //覆盖这个方法,返回这个组件的首选大小 { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
实验总结:(19分)本周学习了第九、十章的内容。第九章主要学习了Vector类、Stack类、Hashtable类等遗留类的知识与API。ArrayList和linkedList的添加元素等方法的应用。第十章图像程序设计主要学习了添加组件与框架的创建。通过运行程序,并分析程序结果,理解代码相关知识以及API的使用。虽然有些代码刚开始有些不能理解,但通过不断的尝试与问同学,慢慢的理解相应代码。