201871010123-吴丽丽《面向对象程序设计(Java)》第十二周学习总结
201871010123-吴丽丽《面向对象程序设计(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; |
第一部分:总结第九章、第十章理论知识
第九章 集合
一、JAVA的集合框架
●JAVA的集合框架实现对各种数据结构的封装。
●所谓框架就是一个类库,框架中包含一些通用接口和超类,编程者实现这些接口或创建这些超类的子类就可方便的设计程序所需的类。
●集合(或称为容器)是一类包含多个元素并提供对所包含元
素操作方法的类,其包含的元素可以由同-类型的对象组成,也可以由不同类型的对象组成。
●集合框架: JAVA集合类库的统一 架构。.
图形说明:
1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
4. 实现类:8个实现类(实线表示),对接口的具体实现。
5. Collection 接口是一组允许重复的对象。
6. Set 接口继承 Collection,集合元素不重复。
7. List 接口继承 Collection,允许重复,维护元素插入顺序。
8. Map接口是键-值对象,与Collection接口没有什么关系。
9.Set、List和Map可以看做集合的三大类:
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
二、集合类
1、集合类的特点
只容纳对象。
注意:数组可以容纳基本数据类型数据和对象。
-如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。
2、JDK1.1版本的集合类包括Vector、Stack、Hashtable、BitSet
1)Vector类
●Vector类类似长度可变的数组。
●Vector中只能存放对象。
●Vector的元素通过下标进行访问。
●Vector类关键属性:
- capacity表示集合最多能容纳的元素个数。- capacityIncrement表示每次增加多少容量。
-size表示集合当前元素个数。Vector v = new Vector(100)
●Vector类的关键方法:
- void addElement(Object obj)
- void add(int index, Object element)
- Object elementAt(int index)
-void insertElementAt(Object obj, int index)
2).Stack类
●Stack类是Vector的子类。
●Stack类描述堆栈数据结构,即FILO。
●Stack类的关键方法:
- public void push(Object item) //把项压入栈顶
- public Object pop() //移除栈顶对象并作为此函数的值返回该对象
- public Object peek() //查看栈顶对象而不移除它
- public boolean empty() //测试堆栈是否为空
3).Hashtable类
●Hashtable类通过键值来查找元素
●Hashtable用散列码(hashcode)来确定键。所有对象都有一个散列码,可以通过Object类的hashCode()方法获得。
3.JDK1.2以后版本的集合类有
-Collection
-List
-Set
-Map
三、集合框架中的基本接口
1、Collection接口
a)Collection接口是处理对象集合的根接口,其中定义了很多对元素进行操作的方法。Collection接口有两个主要的子接口List和Set,注意Map不是Collection的子接口,这个要牢记。
b)Collection接口中的方法如下:
c)Collection中有一个iterator()函数,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。ListIterator是List接口所特有的,在List接口中,通过ListIterator()返回一个ListIterator对象。
2.List接口
a)List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
b)List接口继承于Collection接口,它可以定义一个允许重复的有序集合。因为List中的元素是有序的,所以我们可以通过使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
c)List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
d)实现List接口的集合主要有:ArrayList、LinkedList。
-ArrayList中的元素在内存中是顺序存储的。
-LinkedList中的元素在内存中是以链表方式存储的。
3.Set接口
a) Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样允许null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。
b)Set是一种不包含重复的元素的Collection,无序,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。需要注意的是:虽然Set中元素没有顺序,但是元素在set中的位置是由该元素的HashCode决定的,其具体位置其实是固定的。
c)实现Set接口的类有HashSet,TreeSet.
-TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。
-可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。
-HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。通常使用HashSet,需要排序的功能时,使用TreeSet。
4.Map接口
a)Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。
b)Map循环使用两个基本操作: get( )和put( )。 使用put( )方法可以将一个指定了”关键字和值”的值加入映射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该值。
c)Map接口的方法
●boolean containsKey(Object k) // 检查调用映射中是否包含关键字K
●boolean containsValue(Object v) //检查调用映射中是否包含值V
●Object get(Object k) //返回与关键字k相关联的值
● boolean isEmpty( ) //如果调用映射是空的,则返回true;否则返回flase
●Object put(Object k, Object v) //将一个键值对加入调用映射
●Object remove(Object k) //删除关键字等于k的键值对
●int size() //返回映射中关键字/值对的个数
●Set entrySet( ) //返回包含了映射中的项的集合(Set)。该集合包含了类型Map.Entry的对象。这个方法为调用映射提供了一个集合“视图“
●Set keySet( ) //返回一个包含调用映射中关键字的集合(Set) 。这个方法为调用映射的关键字提供了一个集合“视图“
●Collection values() //返回一个包含了映射中的值的类型。这个方法为映射中的值提供了一个类集“视图”
d)Map接口的实现类主要有:HashMap、TreeMap、Hashtable、Properties。
第十章 图形程序设计
10.1 AWT与Swing简介
1.用户界面(User Interface)
– 用户与计算机系统(各种程序)交互的接口
2.图形用户界面(Graphical User Interface)
– 以图形方式呈现的用户界面
3.AWT
a)Java 的 抽 象 窗 口 工 具 箱 ( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。
b)AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理。
c)应用AWT编写依赖于本地用户界面元素GUI会暴露出一些缺陷。例如:菜单、滚动条和文本域这些用户界面元素,在不同的平台上,操作行为上存在一些微妙的差异。
4.Swing
a)Swing用户界面库是非基于对等体的GUI工具箱。
b)Swing具有更丰富并且更方便的用户界面元素集合。
c)Swing对底层平台的依赖很少,因此与平台相关的bug很少。
d)Swing会带来交叉平台上的统一视觉体验。
e) Swing类库被放在javax.swing包里。
5.AWT与Swing的关系
a)大部分AWT组件都有其Swing的等价组件。
b) Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等
10.2 框架的创建
1.组件
a)构成图形用户界面的元素,拿来即用
b)用图形表示(能在屏幕上显示,能和用户进行交互)
– Button、Checkbox、Scrollbar、Choice、Frame
c)通常把由Component类的子类或间接子类创建的对象称为一组件
2.容器
a) 容器是Java中能容纳和排列组件的组件。
b)常用的容器是框架(Frame,JFrame)
3.添加组件
a)Container类提供了一个方法add(),用来在容器类组件对象中添加其他组件。
b)容器本身也是一个组件,可以把一个容器添加到另一个容器里,
4.框架(Frame)的创建
(1)创建空框架 :在Java中,常采用框架(Frame)创建初始界面, 即GUI的顶层窗口
AWT库中有一个基于对等体的Frame类。 该类的Swing版本为JFrame,JFrame是Frame子类。
(2)框架定位与框架属性
定位: 常用Component类的setLocation和setBounds方法 常用属性
Title:框架标题
IconImage:框架图标
(3)确定框架大小 : 通过调用Toolkit类的方法来得到屏幕尺寸信息。
Toolkit kit = Toolkit.getDefaultToolkit(); //生成 Toolkit对象
Dimension screenSize= kit.getScreenSize(); //返回 Dimension对象的屏幕大小
intscreenWidth= screenSize.width; //获得Dimension对 象屏幕的宽度
intscreenHeight=screenSize.height; //获得Dimension 对象屏幕的高度
在Java中,常采用框架(Frame)创建初始界面,即GUI的顶层窗口
10.3 框架的定位
1、框架定位与框架属性
定位:
一常用Component类的setLocation和setBounds方法常用属性
-Title: 框架标题
-IconImage: 框架图标
2、确定框架大小
●通过调用Toolkit类的方法来得到屏幕尺寸信息。
Toolkit kit = Toolkit. getDefaultToolkit0; //生成Toolkit对象
Dimension screenSize = kit. getScreenSize () ;//返回Dimension对象的屏幕大小
int screenWidth = screenSize. width;//获得Dimension对象屏幕的宽度
int screenHei ght=screenSize. height; ;//获得Dimension对象屏幕的高度
10.4在组件中显示信息
(1)Jframe的结构,它由根面板、层级面板、玻璃面板和内容面板(content pane)四层面板构成。
(2)Swing程序员最关心的是内容面板,也称为内容窗格。
Jframe的结构:
10.5 图形编程
1. 2D图形
a)2D库
b)坐标系
c)图形类
2.颜色的使用
a)Graphics2D类的setPaint方法(Graphics类为setColor方法)用来设置颜色。
例:g2.setPaint(Color.RED);g2.drawString(“Set Color”,100,100);
b)Color类中定义的13种标准颜色
BLACK、BLUE、CYAN、DARK_GRAY、GRAY、GREEN、
LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、
WHITE、YELLOW
3.字体的设置
(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);
10.6显示图像
(1)在Java应用程序中,一旦图像保存在本地或因 特网的某个位置上,就可以将它们直接读入到java 应用程序中。
String filename = “…”; Image image= ImageIcon(filename).getImage();
(2)完成将一个图像文件加载到程序中,再调用 Graphics类提供的DrawImage()显示它。
public void paintComponent(Graphics g)
{ … g.drawImage(image, x, y, null); }
第二部分:实验部分
实验十 集合与GUI初步
实验时间 2019-11-14
1、实验目的与要求
(1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API;
(2) 掌握ArrayList、LinkList两个类的用途及常用API。
(3) 掌握Java GUI中框架创建及属性设置中常用类的API;
(4) 应用结对编程(Pair programming),体验程序开发中的两人合作。
2、实验内容和步骤
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
1)使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
2)掌握Vetor、Stack、Hashtable三个类的用途及常用API。
示例1代码如下:
//示例程序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代码如下:
//示例程序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代码如下:
//示例程序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++) { Integer r = new Integer((int) (Math.random() * 20)); if(ht.containsKey(r)) ((Counter)ht.get(r)).i++; else ht.put(r, new Counter()); } System.out.println(ht); } }
运行结果如下:
测试程序2:
1)使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
ArrayListDemo.java代码如下:
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)); } } }
运行结果如下:
LinkedListDemo.java代码如下:
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"); } }
运行结果如下:
测试程序3:
1)在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
2)掌握ArrayList、LinkList两个类的用途及常用API。
LinkedListTest.java代码如下:
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) { List<String> a = new LinkedList<String>(); //创建一个对象变量,其中LinkedList implements List a.add("Amy"); //使用add方法添加元素 a.add("Carl"); a.add("Erica"); List<String> b = new LinkedList<String>(); b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); // merge the words from b into a ListIterator<String> aIter = a.listIterator(); //通过对象变量a来调用listIterator迭代器 Iterator<String> bIter = b.iterator(); //调用iterator方法,其中该方法用于返回一个实现Iterator接口的对象 while (bIter.hasNext()) //用迭代器的hasNext方法来作为判断语句 { if (aIter.hasNext()) aIter.next(); //调用迭代器的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(); // skip next element bIter.remove(); // remove that element } } System.out.println(b); // bulk operation: remove all words in b from a a.removeAll(b); //从a这个集合中删除b集合中存在的所有元素 System.out.println(a); } }
运行结果如下:
实验2:导入第10章示例程序,测试程序并进行代码注释。
测试程序1:
1)运行下列程序,观察程序运行结果。
程序代码如下:
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); } }
运行结果如下:
2) 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
3)掌握空框架创建方法;
4)了解主线程与事件分派线程概念;
5)掌握GUI顶层窗口创建技术。
SimpleFrameTest.java代码如下:
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); //Swing组件的事件分派线程 frame.setVisible(true); //组件是可见的 }); //使用lambdab表达式 } } class SimpleFrame extends JFrame //SimpleFrame继承Swing版本的JFrame框架 { private static final int DEFAULT_WIDTH = 300; //实例域并进行初始化 private static final int DEFAULT_HEIGHT = 200; public SimpleFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); //使用给定的宽度和高度,重新设置组件的大小 } }
运行结果如下:
测试程序2:
1) 在elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;
2)掌握确定框架常用属性的设置方法。
SizedFrameTest.java代码如下:
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); //设置组件可见 }); //事件分派线程中的执行代码(使用lambda表达式) } } class SizedFrame extends JFrame { public SizedFrame() { // get screen dimensions Toolkit kit = Toolkit.getDefaultToolkit(); //返回工具箱 Dimension screenSize = kit.getScreenSize(); //返回用户屏幕的尺寸 int screenHeight = screenSize.height; int screenWidth = screenSize.width; // set frame width, height and let platform pick screen location setSize(screenWidth / 2, screenHeight / 2); //给定宽度和高度 setLocationByPlatform(true); //设置locationByPlatform的属性 // set frame icon Image img = new ImageIcon("icon.gif").getImage(); //获取Image的属性 setIconImage(img); //设置iconImage属性 } }
运行结果如下:
测试程序3:
1)在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
2) 掌握在框架中添加组件;
3)掌握自定义组件的用法。
NotHelloWorld.java代码如下:
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"); //设置title属性,确定框架标题栏中的文字 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); //调用Graphics类中drawString方法 } public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); //覆盖getPreferredSize方法,返回一个有首选宽度和高度的Dimension对象 } }
运行结果如下:
第三部分:实验总结
在本周的学习中,我们主要学了集合与图形程序设计,基本上掌握了java中集合的概念,了解到了集合类的特点以及使用集合的好处,学习了集合的知识以及使用方法,同时了解了新旧集合类的不同之处、集合框架,了解HashMap、TreeMap两个类的用途及常用API。掌握了Vetor、Stack、Hashtable三个类的用途及常用API。第十章以图形界面的知识为主,我了解了Java GUI中框架创建及属性设置中常用类的API; GUI中2D图形绘制常用类的API;GUI中2D图形中字体与颜色的设置方法;GUI中2D图形中字体与颜色的设置方法;同时通过老师给我们那关于结对编程的阐述和结对编程中代码设计规范的要求的网址,让我对结对编程有了更多的了解,同时也从中意识到了自己上次的结对编程的不足之处,在之后的学习中还是要不断的努力。