201871010134-周英傑 《面向對象程序設計(java)》第十二週學習總結html
項目 | 內容 |
這個做業屬於哪一個課程 | https://www.cnblogs.com/nwnu-daizh/ |
這個做業要求在哪裏 | https://www.cnblogs.com/lily-2018/p/11441372.html |
做業學習目標 | (1) 掌握Vetor、Stack、Hashtable三個類的用途及經常使用API;java (2) 掌握ArrayList、LinkList兩個類的用途及經常使用API。程序員 (3) 掌握Java GUI中框架建立及屬性設置中經常使用類的API;算法 (4) 應用結對編程(Pair programming),體驗程序開發中的兩人合做。編程
|
第一部分:理論知識總結數組
第九章;數據結構
1.棧(Stack)也是一種特殊的線性表,是一種後進先出 (LIFO)的結構。棧是限定僅在表尾進行插入和刪除運算的線性表,表尾稱爲棧頂(top),表頭稱爲(bottom)。棧的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。架構
2.隊列(Queue)是限定全部的插入只能在表的一端進行 ,而全部的刪除都在表的另外一端進行的線性表。表中容許插入的一端稱爲隊尾(Rear),容許刪除的一端稱爲隊頭(Front)。隊列的操做是按先進先出(FIFO)的原則進行的。隊列的物理存儲能夠用順序存儲結構,也能夠用鏈式存儲結構。框架
3.通常將數據結構分爲兩大類:線性數據結構和非線性數據結構。線性數據結構:線性表、棧、隊列、串、數組和文件。非線性數據結構:樹和圖。線性表按其存儲結構可分爲順序表和鏈表;用順序存儲結構存儲的線性表稱爲順序表;順序表將線性表中的數據元素依次存放在某個存儲區域中。一維數組就是用順序方式存儲的線性表。用鏈式存儲結構存儲的線性表稱爲鏈表。dom
4.集合框架:JAVA集合類庫的統一架構。集合類的做用:Java的集合類提供了一些基本數據結構的支持。集合類的使用: Java的集合類包含在java.util包中。集合類的特色一:只容納對象。注意:數組能夠容納基本數據類型數據和對象。若是集合類中想使用基本數據類型,又想利用集合類的靈活性,能夠把基本數據類型數據封裝成該數據類型的包裝器對象,而後放入集合中處理。特色二:集合類容納的對象都是Object類的實例,一旦把一個對象置入集合類中,它的類信息將丟失,這樣設計的目的是爲了集合類的通用性。由於Object類是全部類的祖先,因此能夠在這些集合中存聽任何類的對象而不受限制,但在使用集合成員以前必須對它從新造型。
5.JAVA的集合框架實現對各類數據結構的封裝,以下降對數據管理與處理的難度。所謂框架就是一個類庫的集合,框架中包含不少超類,編程者建立這些超類的子類可較方便的設計設計程序所需的類。
6.Map接口用來維持不少「鍵-值」對,以便經過鍵來查找相應的值。HashMap基於散列表實現(替代Hashtable)。TreeMap在一個二叉樹的基礎上實現(map)是一個存儲關鍵字和值的關聯或關鍵字/值對的對象。給定一個關鍵字,能夠獲得它的值。關鍵字和值都是對象。關鍵字必須是惟一的。但值是能夠被複制的。Map接口映射惟一關鍵字到值。關鍵字(key)是之後用於檢索值的對象。給定一個關鍵字和一個值,能夠存儲這個值到一個Map對象中。當這個值被存儲之後,就可使用它的關鍵字來檢索它,Map循環使用兩個基本操做:get( )和put( )。使用 put( )方法能夠將一個指定了關鍵字和值的值加入映射。爲了獲得值能夠經過將關鍵字做爲參數來調用 get( )方法。調用返回該值。Map接口的實現類主要有HashMap,TreeMap,Hashtable,Properties。HashMap對key進行散TreeMap按照key進行排序。和Set相似,HashMap的速度一般都比TreeMap快,只有在須要排序的功能的時候,才使用TreeMap。
7.Vector類相似長度可變的數組。Vector中只能存放對象。Vector的元素經過下標進行訪問。 Vector類關鍵屬性:capacity表示集合最多能容納的元素個數。capacityIncrement表示每次增長多少容量。size表示集合當前元素個數。Stack類是Vector的子類。Stack類描述堆棧數據結構,即LIFO。Hashtable經過鍵來查找元素。Hashtable用散列碼(hashcode)來肯定鍵。全部對象都有一個散列碼,能夠經過Object類的hashCode()方法得到。
8.集合框架中的基本接口:Collection:集合層次中的根接口,JDK未提供這個接口的直接實現類。
Set:不能包含重複的元素。對象可能不是按存放的次序存放,也就是說不能像數組同樣按索引的方式進行訪問,SortedSet是一個按照升序排列元素的Set。List的明顯特徵是它的元素都有一個肯定的順序。實現它的類有ArrayList和LinkedList。ArrayList中的元素在內存中是順序存儲的。LinkedList中的元素在內存中是以鏈表方式存儲的。
TreeSet是一個有序集合,TreeSet中元素將照升序排列,缺省是按照天然順序進行排列,意味着TreeSet中元素要實現Comparable接口。能夠在構造TreeSet對象時,傳遞實現了 Comparator接口的比較器對象。HashSet是基於Hash算法實現的,其性能一般都優於TreeSet。一般使用HashSet,須要排序的功能時,使用TreeSet。
第十章:
1.Java的抽象口工具箱( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了許多用來設計GUI的組件類和容器類。
2.AWT庫處理用戶界面元素的方法:把圖形元素的建立和行爲委託給本地GUI工具箱進行處理。
3.Swing用戶界面庫是非基於對等體的GUI工具箱。Swing具備更豐富而且更方便的用戶界面元素集合。Swing對底層平臺的依賴不多,所以與平臺相關的bug不多。Swing會帶來交叉平臺上的統一視覺體驗。Swing類庫被放在 javax.swing 包裏。
4.大部分AWT組件都有其 Swing的等價組件。Swing組件的名字通常是在AWT組件名前面添加一個字母「J」,如:JButton,JFrame,JPanel等。
5.一般把由Component類的子類或間接子類建立的對象稱爲一個組件
6.Swing 組件層次關係
7..組件類的經常使用API
java.awt.Component 1.0
– boolean isVisible() 檢查組件是否可見
– void setVisible(boolean b) 設置組件可見
– void setSize(int width,int height) 把組件縮放到指定寬度和高度
– void setBounds(int x,int y,int width,int height) 移動並縮放組件
– Dimension getSize() 獲得組件的大小
– void setSize(Dimension d) 把組件縮放到指定的大小
– void setLocation(int x,int y)
8.容器是Java中能容納和排列組件的組件。經常使用的容器是框架(Frame,JFrame)。
Container類提供了一個方法add(),用來在容器類 組件對象中添加其餘組件。
容器自己也是一個組件,能夠把一個容器添加到 另外一個容器裏,實現容器嵌套。
框架定位:經常使用Component類的setLocation和setBounds方法。經常使用屬性:Title:框架標題;IconImage:框架圖標。
肯定框架大小:經過調用Toolkit類的方法來獲得屏幕尺寸信息。
Jframe的結構:它由根面板、層級面板、玻璃面板和內容面板(content pane)四層面板構成。
Swing程序員最關心的是內容面板,也稱爲內容窗格。
在AWT中可調用add()方法把組件直接添加到AWT Frame中,在Swing中組件則添加到內容窗格里。
其中內容窗格是用來添加組件的,添加代碼以下:Container contentPane = getContentPane(); Component c=…; contentPane.add(c);
用戶也能夠自行建立一個組件類,並在組件上進行繪製,此時須要重載paintComponent()。用戶的自建組件也可添加到內容窗格里。
paintComponent(Graphics g)定義在JComponent類中,該方法在窗口須要從新繪圖時(如擴大窗口或極小化窗口),被系統自動調用.
paintComponent()方法被調用時,系統就自動產生一個Graphics類型的參數,傳遞給paintComponent方法中的參數g。
第二部分:實驗部分
實驗1: 導入第9章示例程序,測試程序並進行代碼註釋。
測試程序1:
使用JDK命令運行編輯、運行如下三個示例程序,結合運行結果理解程序;
掌握Vetor、Stack、Hashtable三個類的用途及經常使用API。
1.示例程序1
代碼以下:
package demo; 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){ //建立了一個Cat類型的Vector對象集合 Vector<Cat> cats= new Vector<Cat>(); //使用addElement方法向及集合中添加7個元素 for(int i=0; i<7; i++) cats.addElement(new Cat(i)); //size()方法會返回集合中元素的個數 //elementAt()方法獲取指定位置上的元素 for(int i=0; i<cats.size(); i++) (cats.elementAt(i)).print(); } }
運行結果以下:
2.示例程序2
代碼以下:
package demo; import java.util.*; public class Stacks { static String[] months={"金","銀","銅","鐵"}; public static void main(String[] args){ //建立一個String類型的Stack對象集合 Stack<String> stk = new Stack<String>(); //將字符串數組中的元素壓入棧中 for(int i=0; i<months.length; i++) stk.push(months[i]); //輸出棧對象 System.out.println(stk); //取出棧中位置爲2的元素,此時棧中元素還是按照字符串數組中的順序排放 System.out.println("element 2=" + stk.elementAt(2)); //彈出棧中的全部元素 while(!stk.empty()) System.out.println(stk.pop()); } }
運行結果以下:
3.示例程序3
代碼以下:
package demo; 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)) //get():返回指定鍵映射到的值,將返回的值強制轉變爲Counter類對象,並將值+1; ((Counter)ht.get(r)).i++; else //映射指定的鍵處指定的值到哈希表裏 ht.put(r, new Counter()); } //System.out.println(ht); //使用forEach()輸出哈希表中的鍵值對 ht.forEach((k,v)-> System.out.println("key="+k+", value="+v)); } }
運行結果以下:
測試程序2:
● 使用JDK命令編輯運行ArrayListDemo和LinkedListDemo兩個程序,結合程序運行結果理解程序;
1>.ArrayListDemo類
package demo; import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { //建立一個ArrayList類對象 ArrayList al = new ArrayList(); // 增添一些元素到ArrayList類中 al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // 使用for循環輸出它們的值 System.out.println("Retrieving by index:"); for (int i = 0; i < al.size(); i++) { System.out.println("Element " + i + " = " + al.get(i)); } } }
運行結果以下:
2>.LinkedListDemo類
package demo; import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { //建立一個LinkedList對象 LinkedList l = new LinkedList(); l.add(new Object()); l.add("Hello"); l.add("zhangsan"); //LinkedList類的listIterator方法返回了一個實現ListIterator接口的迭代器對象 ListIterator li = l.listIterator(0); //遍歷鏈表中的每個元素 while (li.hasNext()) System.out.println(li.next()); //indexof()方法返回與指定元素相等的元素在列表中第一次出現的位置,若是沒有這樣的元素將返回-1 if (l.indexOf("Hello") < 0) //Hello在列表中出現的位置是1>0 System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }
運行結果以下:
●在Elipse環境下編輯運行調試教材360頁程序9-1,結合程序運行結果理解程序;
●掌握ArrayList、LinkList兩個類的用途及經常使用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"); // merge the words from b into a ListIterator<String> aIter = a.listIterator(); //LinkedList類的listIterator方法返回了一個實現ListIterator接口的迭代器對象 Iterator<String> bIter = b.iterator(); //LinkedList類的iterator方法返回了一個實現Iterator接口的迭代器對象 //將b中的每一個元素插入到a中相應元素的後面 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(); // skip next element bIter.remove(); // remove that element } } System.out.println(b); // 刪除a中全部的b元素 a.removeAll(b); System.out.println(a); } }
運行結果以下:
實驗2:導入第10章示例程序,測試程序並進行代碼註釋。
測試程序1:
運行下列程序,觀察程序運行結果。
● 在elipse IDE中調試運行教材407頁程序10-1,結合程序運行結果理解程序;與上面程序對比,思考異同;
● 掌握空框架建立方法;
● 瞭解主線程與事件分派線程概念;
● 掌握GUI頂層窗口建立技術。
1>示例程序:
代碼以下:
package demo; 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>教材程序
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:
● 在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() { // 獲取屏幕尺寸 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); } }
運行結果以下:
測試程序3:
● 在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方法而不是setSize方法*/ pack(); } } /** * 一個顯示消息的組件. */ 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; //paintComponent方法中有一個Graphics類型的參數,這個參數保存着用於繪製圖像和文本的設置 public void paintComponent(Graphics g) { //顯示文本是一種特殊的繪圖。在Graphics類中有一個drawString方法。 g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } //組件應該告訴用戶它有多大。覆蓋getPreferredSize方法,返回一個有首選寬度和高度的Dimension public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
運行結果以下:
實驗總結:
1.Vector類相似長度可變的數組。Vector中只能存放對象。Vector的元素經過下標進行訪問。 Vector類關鍵屬性:capacity表示集合最多能容納的元素個數。capacityIncrement表示每次增長多少容量。size表示集合當前元素個數。Stack類是Vector的子類。Stack類描述堆棧數據結構,即LIFO。Hashtable經過鍵來查找元素。Hashtable用散列碼(hashcode)來肯定鍵。全部對象都有一個散列碼,能夠經過Object類的hashCode()方法得到。
2. ArrayList:能夠將其看做是可以自動增加容量的數組。利用ArrayList的toArray()返回一個數組。Arrays.asList()返回一個列表。LinkedList是採用雙向循環鏈表實現的。利用LinkedList實現棧(stack)、隊列(queue)、雙向隊列 (double-ended queue )。ArrayList底層採用數組完成,而LinkedList則是以通常的雙向鏈表(double-linked list)完成,其內每一個對象除了數據自己外,還有兩個引用,分別指向前一個元素和後一個元素。若是常常在 List 中進行插入和刪除操做,應該使用LinkedList,不然,使用ArrayList將更加快速。
3. TreeSet是一個有序集合,TreeSet中元素將按照升序排列,缺省是按照天然順序進行排列,意味着TreeSet中元素要實現Comparable接口。能夠在構造TreeSet對象時,傳遞實現了 Comparator接口的比較器對象。HashSet是基於Hash算法實現的,其性能一般都優於TreeSet。一般使用HashSet,須要排序的功能時,使用TreeSet。
AWT(Abstract Window Toolkit)包括了不少類和接口,用於Java Application的GUI(Graphics User Interface)編程。使用AWT所涉及的類通常在java.awt包及其子包中,GUI的各類元素(如:窗口,按鈕,文本框等)由Java類來實現。Component類和Container類是AWT中的兩個核心類。Java的圖形用戶界面的最基本組成部分是Component類,Component類及其子類的對象用來描述以圖形化的方式顯示在屏幕上並能與用戶進行交互的GUI元素,例如,一個按鈕,一個標籤等。通常的Component類對象不能獨立地顯示出來,必須將放在某一的Container類對象中才能夠顯示出來Container類是Component抽象的子類,Container子類對象能夠容納別的Component對象。
Graphics2D類仍然保留Graphics類的繪圖方法,同時增長了許多新方法。新方法將幾何圖形(線段、圓等)做爲一個對象來繪製。在java.awt.geom包中聲明的一系列類,分別用於建立各類身體圖形對象。Font屬性:全部的文本都使用能表現文字的樣式圖形渲染。當前的字體決定了字體的形狀。使用繼java.awt.Graphics的getFont()方法和setFont()方法來操縱字體。儘管設置字體相對簡單的工做,Java 2D仍是爲文本描繪提供了豐富的選項。
要使用Java 2D庫繪製圖形,就須要得到一個Graphics2D類對象,它是Graphics類的子類。能夠在paintComponent方法中強轉得到一個Graphics2D的類對象。
個人感覺:本週主要學習了與圖形用戶界面設計有關的知識,經過本章的學習我瞭解瞭如何用一些組件去畫字,圖形。瞭解了建立框架時的一些經常使用API,圖形用戶界面的一些基礎的設計操做,好比窗口顯示不一樣圖形,文字等等,以爲頗有意思;但實際用這些知識本身去設計圖形仍是會有必定的難度。經過練習題集練習學過的內容,對學過的知識進行了再鞏固,加深了理解。