zoukankan      html  css  js  c++  java
  • 201871010113刘兴瑞《面向对象程序设计(java)》第十二周学习总结 201871010113

     

    项目

    内容

    这个作业属于哪个课程

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

  • 相关阅读:
    (转)MVC 与三层架构
    (转)CentOS一键安装Nginx脚本
    (转)Python异常类的继承关系
    CMFCPropertyGridProperty用法
    C语言终极面试及答案分析
    C/C++函数指针(typedef简化定义)
    UNIX 家族及Linux
    Socket的综合应用总结
    Socket模型(二):完成端口(IOCP)
    socket通信中select函数的使用和解释
  • 原文地址:https://www.cnblogs.com/lxr0/p/11869242.html
Copyright © 2011-2022 走看看