It is the path you have chosen. Take pride in it. Kotomine Kirei

橘子哟

201871010113-刘兴瑞《面向对象程序设计(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;

 

第一部分:总结第九章、第十章理论知识

 第九章 集合

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

 

posted on 2019-11-18 18:13  201871010113-刘兴瑞  阅读(172)  评论(1编辑  收藏  举报

导航