项目

内容

这个作业属于哪个课程

<任课教师博客主页链接>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. 从零开始手写 dubbo rpc 框架

    rpc rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo. 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理. 前言 工作至今,接触 rpc 框架已经有很长时间. ...

  2. Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库

    摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Ma ...

  3. 操作MyBatis引发Error setting null for parameter #X with JdbcType OTHER .无效的列类型

    再用MyBatis操作Oracle的时候,传入null值而引发的错误 异常信息: org.springframework.jdbc.UncategorizedSQLException: Error s ...

  4. Prometheus学习系列(四)之Prometheus 配置说明

    前言 本文来自Prometheus官网手册 和 Prometheus简介 说明 Prometheus通过命令行和配置文件进行配置,命令行配置不能修改的系统参数(例如存储位置,要保留在磁盘和内存中的数据 ...

  5. C#通用查询器

    很多通用查询器,对查询条件中的AND及OR的支持度不是很好,要么全部是AND要么全部是OR.笔者通过一段时间的摸索,终于完成了一个自己较为满意的通用查询器, 可以实现多条件的AND及OR,现将实现过程 ...

  6. 如何修改PhpStorm快捷键

  7. 如何使用CAD删除命令?怎么删除图纸中线段

    大家经常使用CAD制图软件来绘制图纸,那在绘制图纸的过程中有时候会出现一些问题,就是图纸中不小心多绘制了一个线段,那要怎么办呢?如何使用CAD删除命令?怎么删除图纸中线段呢?那下面小编就来教教大家具体 ...

  8. [转]UiPath Build Data Table

    本文转自:https://docs.uipath.com/activities/docs/build-data-table UiPath.Core.Activities.BuildDataTable ...

  9. 网站如何免费升级到HTTPS?

    最近在做网站SSL升级,看似简单的操作还是会遇到各种问题,现在和大家分享一下. 证书申请: 公司是创业公司,为了省成本准备申请免费证书,对比了一些证书商,最后选择使用沃通wosign提供的证书服务,发 ...

  10. 通过程序调用微信公众号发消息api返回48001

    自己的订阅号,尝试通过写程序来给用户发消息.结果呢,接口返回报错:errcode=48001,errmsg = api unauthorized hint: [ZlPULa02942276!] 去微信 ...