201871010102-常龙龙《面向对象程序设计(java)》第十二周学习总结
项目 |
内容 |
这个作业属于哪个课程 |
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分)
一、集合
集合框架中的基本接口
●Collection: 集合层次中的根接口。
●Set: 不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一-样按索引的方式进行访问,SortedSet是- 一个按照升序排列元素的Set.
●List: 是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。
●Map:包含了key-value对, 不能包含重复的key。
●SortedMap是一个按照升序排列key的Map。
1.Vector类
●Vector类类似长度可变的数组。
●Vector中只能存放对象。
●Vector的元素通过下标进行访问。
●Vector类关键属性:
- capacity表示集合最多能容纳的元素个数。
- capacityIncrement表示每次增加多少容量。
- size表示集合当前元素个数。
Vector v = new Vector(100)
●Vector类的关键方法:
- void addElement(Object obj)
- void add(int index, Object element)
- Object elementAt(int index)
- void insertElementAt(Object obj, int index)
2.Stack类
●Stack类是Vector的子类。
●Stack类描述堆栈数据结构,即FILO。
●Stack类的关键方法:
- public void push(Object item) // 把项压入栈顶
- public Object pop() //移除栈顶对象并作为此函数的值返回该对象
- public Object peek() //查看栈顶对象而不移除它
- public boolean empty() // 测试堆栈是否为空
3.Hashtable类
●Hashtable通过键来查找元素。
●Hashtable用散列码( hashcode)来确定键。所有对象都有一个散列码,可以通过0bject类的hashCode()方法获得。
4.List类
●List的明显特征是它的元素都有一个确定的顺序。
●实现它的类有ArrayList和LinkedList。
- ArrayList中的元素在内存中是顺序存储的。
- LinkedList中的元素在内存中是以链表方式存储的。
●ArrayList: 可以将其看作是能够自动增长容量的数组。
●利用ArrayList的toArray()返 回一个数组。
●Arrays.asList()返 回一个列表。
●LinkedList是采用双向循环链表实现的。
●利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )。
●LinkedList的底层数据采用双向链表(double-linked list)_类内除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。
●如果经常在List中进行插入和删除操作,应该使用LinkedList,否则,使用ArrayList将更加快速。
5.map
●Map接口用来处理“键-值”对,以便通过键来查找相应的值。
●HashMap基于散列表实现(替代Hashtable)。
●TreeMap在一个二 叉树的基础上实现。
●Map接口映射唯一关键字到值。 关键字(key) 是以后用于检索值的对象。给定-一个关键字和一个值,可以存储这个值到-一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它
●Map循环使用两个基本操作: get( )和put( )。使用put( )方法可以将-一个指定了"关键字和值”的值加入映射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该值。
●Map接口的方法
●boolean containsKey(Object k)检查调用映射中是否包含关键字K
●boolean containsValue(Object v)检查调用映射中是否包含值V
●Object get(Object k)返回与关键字k相关联的值
●boolean isEmpty( )如果调用映射是空的,则返回true; 否则返回false
●Object put(Object k, Object v)将一个 键值对加入调用映射
●Object remove(Object k)删除关键字等于k的键值对
●int size( )返回映射中关键字/值对的个数
●Set entrySet( )返回包含了映射中的项的集合(Set)函类塑Map.Enry的对象.这个方法为调用映射提供了一个集合“视图”。
●Set keySet( )返回一一个包含调用映射中关键字的集合(Set) 。这个方法为调用映射的关键字提供了-一个集合“视图”
●Collection values( )返回-一个包含了映射中的值的类集。这个方法为映射中的值提供了一个类集“视图”
二、GUI
1.框架创建
●通常把由Component类的子类或间接子类创建的对象称为-一个组件。
●例: Button button = new Button() ;
例: TextField textField = new TextField() ;
例: Label label = new Label() ;
●组件类的常用API
- boolean isVisible() 检查组件是否可见.
- void setVisible (boolean b) 设置组件可见
- void setSize (int width, int height)把组件缩放到指定宽度和高度
- void setBounds (int x, int y, int width, int height) 移动并缩放组件
- Dimension getSize() 得到组件的大小
- void setSize (Dimension d) 把组件缩放到指定的大小
- void setLocation(int x, int y) .
●添加组件
●Container类提供了-一个方法add(),用来在容器类组件对象中添加其他组件。
例: fra. add (button) ;
fra. add (textField) ;
●创建空框架
import javax .swing.*;
public class SimpleFrameTest
{
public static void main(StringD args)
{
JFrame frame = new JFrame();
frame.setBounds(, 0,300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ ON_ CLOSE);
frame.setVisible(true);
}
}
●创建框架时的常用类及API
●java. awt. Component 1. 0
- boolean isVisible() 检查组件是否可见
- void setVisible (boolean b) 设置组件可见
- void setSize (int width, int height) 把组件缩放到指定宽度和高度
- void setBounds(int x, int y, int width, int height) 移动并缩放组件
- Dimension getSize()得到组件的大小
- void setSize (Dimension d) 把组件缩放到指定的大小
●java. awt. Window 1. 0
- void toFront( 放在其它窗口前面- void toBack( 放在其它窗口后面
- void setLocationByPlatform (boolean b) 由平台选择一个合适的位置
●java. awt. Frame 1. 0
- void setResi zable (boolean b)缩放框架
-void setTitle(String s) 设置框架标题
- void setIconImage (Image image) 将Image用作框架图标
●java. awt. Toolkit 1. 0
- static Toolkit getDefaultToolkit() 返回默认工具箱
- Dimension getScreenSize()得到用户屏幕大小
2.2D图形
1) 2D库
●2D库提供了一个非常强大的图形操作库集。
●2D库的类是Graphics类的子类,2D类对象通常可用Graphics对象转换而来。
例: public void paintComponent(Graphics g){
graphics2D g2=(graphics 2D)g;
}
(2)坐标系
●2D图形类使用浮点数坐标系。
●存在的问题:
Retangle2D r....
float f=r.getWidth(); //Error
getWidth ()返回double值,应进行转换;
float f=(float)r .getWidth();
(3)图形类
●2D库为每个图形类提供两个版本的静态内部类:
- Retangle2D. Float
- Retangle2D. Double
(4) 常用2D图形类的API
●java.awt.geom.Retangle2D.Double 1.2
- Retangle2D.Double(double x,double y,double w,double h).
● java.awt.geom.Retangle2D.Float 1.2
- Retangle2D.Float(float x,float y,float w, float h).
●java.awt.geom. Ellipse2D.Double 1.2
- Ellipse2D.Double(double x,double y,double w,double h).
● java.awt. geom.Point2D.Double 1.2
- PointZD.Doubleldouble x,double y).
●java.awt. geom.Line2D.Double 1.2
- Line2D,doublelPoint2D start,Point2D end)
- Line2D.doubleldouble startX,double startY,double endX,double endY)
- fillGraphics2D rec) 填充颜色
- drawlGraphics2D rec) 绘制图形rec
●java.awt.Graphic2D 1.2
- void drawStringlString str, int x, int y);
- void drawShape s);
第二部分:实验部分
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
掌握Vetor、Stack、Hashtable三个类的用途及常用API。
1.示例程序1
代码如下:
package demo; 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){ //创建了一个Cat类型的Vector对象集合 Vector<Cat> cats= new Vector<Cat>(); //使用addElement方法向及集合中添加7个元素 for(int i=0; i<7; i++) cats.addElement(new Cat(i)); //size()方法会返回集合中元素的个数 //elementAt()方法获取指定位置上的元素 for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); } }
运行结果如下:
2.示例程序2
代码如下:
package demo; import java.util.*; public class Stacks { static String[] months={"金","银","铜","铁"}; public static void main(String[] args){ //创建一个String类型的Stack对象集合 Stack<String> stk = new Stack<String>(); //将字符串数组中的元素压入栈中 for(int i=0; i<months.length; i++) stk.push(months[i]); //输出栈对象 System.out.println(stk); //取出栈中位置为2的元素,此时栈中元素仍是按照字符串数组中的顺序排放 System.out.println("element 2=" + stk.elementAt(2)); //弹出栈中的所有元素 while(!stk.empty()) System.out.println(stk.pop()); } }
运行结果如下:
3.示例程序3
代码如下:
package demo; 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)) //get():返回指定键映射到的值,将返回的值强制转变为Counter类对象,并将值+1; ((Counter)ht.get(r)).i++; else //映射指定的键处指定的值到哈希表里 ht.put(r, new Counter()); } //System.out.println(ht); //使用forEach()输出哈希表中的键值对 ht.forEach((k,v)-> System.out.println("key="+k+", value="+v)); } }
运行结果如下:
测试程序2:
● 使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
1>.ArrayListDemo类
package demo; import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { //创建一个ArrayList类对象 ArrayList al = new ArrayList(); // 增添一些元素到ArrayList类中 al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // 使用for循环输出它们的值 System.out.println("Retrieving by index:"); for (int i = 0; i < al.size(); i++) { System.out.println("Element " + i + " = " + al.get(i)); } } }
运行结果如下:
2>.LinkedListDemo类
package demo; import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { //创建一个LinkedList对象 LinkedList l = new LinkedList(); l.add(new Object()); l.add("Hello"); l.add("zhangsan"); //LinkedList类的listIterator方法返回了一个实现ListIterator接口的迭代器对象 ListIterator li = l.listIterator(0); //遍历链表中的每一个元素 while (li.hasNext()) System.out.println(li.next()); //indexof()方法返回与指定元素相等的元素在列表中第一次出现的位置,如果没有这样的元素将返回-1 if (l.indexOf("Hello") < 0) //Hello在列表中出现的位置是1>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"); // merge the words from b into a ListIterator<String> aIter = a.listIterator(); //LinkedList类的listIterator方法返回了一个实现ListIterator接口的迭代器对象 Iterator<String> bIter = b.iterator(); //LinkedList类的iterator方法返回了一个实现Iterator接口的迭代器对象 //将b中的每个元素插入到a中相应元素的后面 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); // 删除a中所有的b元素 a.removeAll(b); System.out.println(a); } }
运行结果如下:
实验2:导入第10章示例程序,测试程序并进行代码注释。
测试程序1:
运行下列程序,观察程序运行结果。
● 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
● 掌握空框架创建方法;
● 了解主线程与事件分派线程概念;
● 掌握GUI顶层窗口创建技术。
1>示例程序:
代码如下:
package demo; 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); } }
运行结果如下:
2>教材程序
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:
● 在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() { // 获取屏幕尺寸 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); } }
运行结果如下:
测试程序3:
● 在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方法而不是setSize方法*/ pack(); } } /** * 一个显示消息的组件. */ 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; //paintComponent方法中有一个Graphics类型的参数,这个参数保存着用于绘制图像和文本的设置 public void paintComponent(Graphics g) { //显示文本是一种特殊的绘图。在Graphics类中有一个drawString方法。 g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } //组件应该告诉用户它有多大。覆盖getPreferredSize方法,返回一个有首选宽度和高度的Dimension public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
运行结果如下:
实验总结:(19分)
通过本周的学习我掌握Vetor、Stack、Hashtable三个类的用途及常用API, 掌握ArrayList、LinkList两个类的用途及常用API,了解java集合框架体系组成,掌握Java GUI中框架创建及属性设置中常用类的API, 了解Java GUI中2D图形绘制常用类的API。在命令行的运行过程中,我掌握了带有包的程序运行的方式。此外我觉得现在在老师及助教的随时提醒下,我测试代码不再是只将代码复制在eclipse上运行出来截图这样做了,现在我会把代码在书上找到每句代码都理解之后再写上代码注释后再截图,这样我对代码的理解越来越深,我相信以后我会坚持下去,并且争取最终取到好成绩。