项目

内容

这个作业属于哪个课程

<任课教师博客主页链接>

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命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;

掌握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>();
       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命令编辑运行ArrayListDemoLinkedListDemo两个程序,结合程序运行结果理解程序;

 

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,结合程序运行结果理解程序;

 掌握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.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的使用。虽然有些代码刚开始有些不能理解,但通过不断的尝试与问同学,慢慢的理解相应代码。

posted on 2019-11-18 19:27  201871010108-高文利  阅读(159)  评论(1编辑  收藏  举报