项目

内容

这个作业属于哪个课程

<任课教师博客主页链接>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:

使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;

掌握VetorStackHashtable三个类的用途及常用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>();//定义Vector类的泛型类cats
for(int i=0; i<7; i++)
//关键方法:添加元素
cats.addElement(new Cat(i)); //addElement(Object obj)把组件加到向量尾部,同时大小加1,向量容量比以前大1  
for(int i=0; i<cats.size(); i++)//cats.size:获得已有元素个数
//找到i处位置并输出元素
(cats.elementAt(i)).print();// E elementAt(int index)返回指定索引处的组件。此方法的功能与 get 方法的功能完全相同
}
}

运行如下:

//示例程序2

代码如下:

import java.util.*;
public class Stacks
{
static String[] months={"gold","silver","copper","iron"}; //定义静态字符串数组
public static void main(String[] args){
Stack<String> stk = new Stack<String> ();//定义Stack类的泛型类stk
for(int i=0; i<months.length; i++)
stk.push(months[i]);//压栈
System.out.println(stk);
System.out.println("element 2=" + stk.elementAt(2));//返回第3个位置元素的值
while(!stk.empty())
System.out.println(stk.pop());//出栈
}
}

运行如下:

//示例程序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

使用JDK命令编辑运行ArrayListDemoLinkedListDemo两个程序,结合程序运行结果理解程序;

代码如下:

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

Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;

掌握ArrayListLinkList两个类的用途及常用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内添加元素
a.add("Amy");
a.add("Carl");
a.add("Erica"); var b = new LinkedList<String>();
//在a内添加元素
b.add("Bob");
b.add("Doug");
b.add("Frances");
b.add("Gloria"); // 合并b和a ListIterator<String> aIter = a.listIterator();//listIterator接口是iterator的子接口
Iterator<String> 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:

运行下列程序,观察程序运行结果。

代码如下:

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图形界面程序设计的方法。对如何创建框架,以及如何生成一个绘制图形的面板 ,以及如何在面板上绘制图形有了一定的了解,以及如何设置窗口中的字体,以及窗口的背景,还有字体大小字体颜色有了一定了解,通过对源码的查看,对如何设计窗口,以及窗口中的一些属性有了进一步的理解。

201871010113-刘兴瑞《面向对象程序设计(java)》第十二周学习总结的更多相关文章

  1. 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试

    20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...

  2. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  3. 201521123061 《Java程序设计》第十二周学习总结

    201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...

  4. 201521123072《java程序设计》第十二周学习总结

    201521123072<java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象 ...

  5. 201521123038 《Java程序设计》 第十二周学习总结

    201521123038 <Java程序设计> 第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student ...

  6. 201521123122 《java程序设计》第十二周学习总结

    ## 201521123122 <java程序设计>第十二周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将St ...

  7. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  8. 201771010134杨其菊《面向对象程序设计java》第八周学习总结

    第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...

  9. 201771010134杨其菊《面向对象程序设计java》第七周学习总结

    第七周学习总结 第一部分:理论知识 1.继承是面向对象程序设计(Object Oriented Programming-OOP)中软件重用的关键技术.继承机制使用已经定义的类作为基础建立新的类定义,新 ...

  10. 201521123005 《Java程序设计》 第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

随机推荐

  1. C# get folder's Md5 generated by file's and filename's md5. get dictionary md5

    C# get dictionary md5 static string GetDicMD5(string dirFullName) { logBuilder = new StringBuilder() ...

  2. laravel开发大型电商网站之异常设计思路分析

    令人讨厌的异常 提起异常,大家都很反感,当信心满满的写完一段代码,刷新页面发现上面写着大大的 Exception 是最心烦的时候了.模块给领导演示的时候,如果报了异常,也是最让人崩溃的时候了. 在一般 ...

  3. 如何实现用户的历史记录功能(最多n条)

    使用容量为n的队列存储历史记录 使用标准库collections中的deque,它是一个双端循环队列 from collections import deque q = deque([], 5) #参 ...

  4. 编译原理之非确定的自动机NFA确定化为DFA

    1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1}  f(0,b)={0}  f(1,b)={2}  f(2,b)={3} 画出状态转换矩阵 ...

  5. ICMP和重定向攻击

    目录 ICMP数据报格式 smurf攻击 ICMP重定向攻击 基于libpcap的sniffer raw socket 定义包头 解析数据包 重定向 ICMP数据报格式 https://zhuanla ...

  6. MySQL数据库~~~~ 完整性约束

    1. not null 与 default not null : 不可空 default : 默认值 例: create table t1(id int not null default 2); 2. ...

  7. String判断为空的方式

    今天遇到的笔试题: //这样的判空方式是否正确 if(!str.equals("")&&str!=null) 之前我一直都是这么写的,哪知道有什么问题呀,然后面试官 ...

  8. Redhat Linx使用Centos yum源

    一.故障现象: 在安装了Read linux后,使用yum安装软件,出现如下提示:[root@localhost~]# yum install xxxLoaded plugins: product-i ...

  9. redis 开源客户端下载

    redis 开源客户端下载地址: https://github.com/qishibo/AnotherRedisDesktopManager/releases

  10. Tyvj 1953 Normal:多项式,点分治

    Decription: 某天WJMZBMR学习了一个神奇的算法:树的点分治! 这个算法的核心是这样的: 消耗时间=0 Solve(树 a) 消耗时间 += a 的 大小 如果 a 中 只有 1 个点, ...