201871010114-李巖鬆《面向對象程序設計(java)》第十二週學習總結

項目html

內容java

這個做業屬於哪一個課程程序員

https://www.cnblogs.com/nwnu-daizh/web

這個做業的要求在哪裏編程

https://www.cnblogs.com/nwnu-daizh/p/11435127.htmlwindows

做業學習目標數組

(1) 掌握Vetor、Stack、Hashtable三個類的用途及經常使用API;架構

(2)  掌握ArrayList、LinkList兩個類的用途及經常使用API;框架

(3) 瞭解java集合框架體系組成;dom

(4) 掌握Java GUI中框架建立及屬性設置中經常使用類的API;

(5) 瞭解Java GUI中2D圖形繪製經常使用類的API;

第一部分:總結第九章、第十章理論知識

1、 Collection集合

 1.1 集合概述

在前面基礎班咱們已經學習過並使用過集合ArrayList<E> ,那麼集合究竟是什麼呢?

**集合**:集合是java中提供的一種容器,能夠用來存儲多個數據。

集合和數組既然都是容器,它們有啥區別呢?

數組的長度是固定的。集合的長度是可變的。
數組中存儲的是同一類型的元素,能夠存儲基本數據類型值。集合存儲的都是對象。並且對象的類型能夠不一致。在開發中通常當對象多的時候,使用集合進行存儲。

1.2  集合框架

JAVASE提供了知足各類需求的API,在使用這些API前,先了解其繼承與接口操做架構,才能瞭解什麼時候採用哪一個類,以及類之間如何彼此合做,從而達到靈活應用。

集合按照其存儲結構能夠分爲兩大類,分別是單列集合`java.util.Collection`和雙列集合`java.util.Map`,今天咱們主要學習`Collection`集合,在day04時講解`Map`集合。

**Collection**:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是`java.util.List``java.util.Set`。其中,`List`的特色是元素有序、元素可重複。`Set`的特色是元素無序,並且不可重複。`List`接口的主要實現類有`java.util.ArrayList``java.util.LinkedList``Set`接口的主要實現類有`java.util.HashSet``java.util.TreeSet`

從上面的描述能夠看出JDK中提供了豐富的集合類庫,爲了便於初學者進行系統地學習,接下來經過一張圖來描述整個集合類的繼承體系。



其中,橙色框裏填寫的都是接口類型,而藍色框裏填寫的都是具體的實現類。這幾天將針對圖中所列舉的集合類進行逐一地講解。

集合自己是一個工具,它存放在java.util包中。在`Collection`接口定義着單列集合框架中最最共性的內容。

1.3 Collection 經常使用功能

Collection是全部單列集合的父接口,所以在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用於操做全部的單列集合。方法以下:

`public boolean add(E e)`:  把給定的對象添加到當前集合中 。
`public void clear()` :清空集合中全部的元素。
`public boolean remove(E e)`: 把給定的對象在當前集合中刪除。
`public boolean contains(E e)`: 判斷當前集合中是否包含給定的對象。
`public boolean isEmpty()`: 判斷當前集合是否爲空。
`public int size()`: 返回集合中元素的個數。
`public Object[] toArray()`: 把集合中的元素,存儲到數組中。

方法演示:

~~~java
import java.util.ArrayList;
import java.util.Collection;

public class Demo1Collection {
    public static void main(String[] args) {
        // 建立集合對象 
        // 使用多態形式
        Collection<String> coll = new ArrayList<String>();
        // 使用方法
        // 添加功能  boolean  add(String s)
        coll.add("小李廣");
        coll.add("掃地僧");
        coll.add("石破天");
        System.out.println(coll);

        // boolean contains(E e) 判斷o是否在集合中存在
        System.out.println("判斷  掃地僧 是否在集合中"+coll.contains("掃地僧"));

        //boolean remove(E e) 刪除在集合中的o元素
        System.out.println("刪除石破天:"+coll.remove("石破天"));
        System.out.println("操做以後集合中元素:"+coll);
        
        // size() 集合中有幾個元素
        System.out.println("集合中有"+coll.size()+"個元素");

        // Object[] toArray()轉換成一個Object數組
        Object[] objects = coll.toArray();
        // 遍歷數組
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }

        // void  clear() 清空集合
        coll.clear();
        System.out.println("集合中內容爲:"+coll);
        // boolean  isEmpty()  判斷是否爲空
        System.out.println(coll.isEmpty());      
    }
}
~~~

> tips: 有關Collection中的方法可不止上面這些,其餘方法能夠自行查看API學習。

2、Iterator迭代器

 2.1 Iterator接口

在程序開發中,常常須要遍歷集合中的全部元素。針對這種需求,JDK專門提供了一個接口`java.util.Iterator``Iterator`接口也是Java集合中的一員,但它與`Collection``Map`接口有所不一樣,`Collection`接口與`Map`接口主要用於存儲元素,而`Iterator`主要用於迭代訪問(即遍歷)`Collection`中的元素,所以`Iterator`對象也被稱爲迭代器。

想要遍歷Collection集合,那麼就要獲取該集合迭代器完成迭代操做,下面介紹一下獲取迭代器的方法:

`public Iterator iterator()`: 獲取集合對應的迭代器,用來遍歷集合中的元素的。

下面介紹一下迭代的概念:

**迭代**:即Collection集合元素的通用獲取方式。在取元素以前先要判斷集合中有沒有元素,若是有,就把這個元素取出來,繼續在判斷,若是還有就再取出出來。一直把集合中的全部元素所有取出。這種取出方式專業術語稱爲迭代。

Iterator接口的經常使用方法以下:

`public E next()`:返回迭代的下一個元素。
`public boolean hasNext()`:若是仍有元素能夠迭代,則返回 true。

接下來咱們經過案例學習如何使用Iterator迭代集合中元素:

~~~java
public class IteratorDemo {
      public static void main(String[] args) {
        // 使用多態方式 建立對象
        Collection<String> coll = new ArrayList<String>();

        // 添加元素到集合
        coll.add("串串星人");
        coll.add("吐槽星人");
        coll.add("汪星人");
        //遍歷
        //使用迭代器 遍歷   每一個集合對象都有本身的迭代器
        Iterator<String> it = coll.iterator();
        //  泛型指的是 迭代出 元素的數據類型
        while(it.hasNext()){ //判斷是否有迭代元素
            String s = it.next();//獲取迭代出的元素
            System.out.println(s);
        }
      }
}
~~~

> tips::在進行集合元素取出時,若是集合中已經沒有元素了,還繼續使用迭代器的next方法,將會發生java.util.NoSuchElementException沒有集合元素的錯誤。

2.2 迭代器的實現原理

咱們在以前案例已經完成了Iterator遍歷集合的整個過程。當遍歷集合時,首先經過調用t集合的iterator()方法得到迭代器對象,而後使用hashNext()方法判斷集合中是否存在下一個元素,若是存在,則調用next()方法將元素取出,不然說明已到達了集合末尾,中止遍歷元素。

Iterator迭代器對象在遍歷集合時,內部採用指針的方式來跟蹤集合中的元素,爲了讓初學者能更好地理解迭代器的工做原理,接下來經過一個圖例來演示Iterator對象迭代元素的過程:


在調用Iterator的next方法以前,迭代器的索引位於第一個元素以前,不指向任何元素,當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

2.3 加強for

加強for循環(也稱for each循環)是**JDK1.5**之後出來的一個高級for循環,專門用來遍歷數組和集合的。它的內部原理實際上是個Iterator迭代器,因此在遍歷的過程當中,不能對集合中的元素進行增刪操做。

格式:

~~~java
for(元素的數據類型  變量 : Collection集合or數組){ 
      //寫操做代碼
}
~~~

它用於遍歷Collection和數組。一般只進行遍歷元素,不要在遍歷的過程當中對集合元素進行增刪操做。

 練習1:遍歷數組

~~~java
public class NBForDemo1 {
    public static void main(String[] args) {
        int[] arr = {3,5,6,87};
           //使用加強for遍歷數組
        for(int a : arr){//a表明數組中的每一個元素
            System.out.println(a);
        }
    }
}
~~~

 練習2:遍歷集合

~~~java
public class NBFor {
    public static void main(String[] args) {        
        Collection<String> coll = new ArrayList<String>();
        coll.add("小河神");
        coll.add("老河神");
        coll.add("神婆");
        //使用加強for遍歷
        for(String s :coll){//接收變量s表明 表明被遍歷到的集合元素
            System.out.println(s);
        }
    }
}
~~~

> tips: 新for循環必須有被遍歷的目標。目標只能是Collection或者是數組。新式for僅僅做爲遍歷操做出現。

3、 List集合


3.1 List接口介紹

`java.util.List`接口繼承自`Collection`接口,是單列集合的一個重要分支,習慣性地會將實現了`List`接口的對象稱爲List集合。在List集合中容許出現重複的元素,全部的元素是以一種線性方式進行存儲的,在程序中能夠經過索引來訪問集合中的指定元素。另外,List集合還有一個特色就是元素有序,即元素的存入順序和取出順序一致。

看完API,咱們總結一下:

List接口特色:

1. 它是一個元素存取有序的集合。例如,存元素的順序是十一、2二、33。那麼集合中,元素的存儲就是按照十一、2二、33的順序完成的)。
2. 它是一個帶有索引的集合,經過索引就能夠精確的操做集合中的元素(與數組的索引是一個道理)。
3. 集合中能夠有重複的元素,經過元素的equals方法,來比較是否爲重複的元素。

> tips:咱們在基礎班的時候已經學習過List接口的子類java.util.ArrayList類,該類中的方法都是來自List中定義。

3.2 List接口中經常使用方法

List做爲Collection集合的子接口,不但繼承了Collection接口中的所有方法,並且還增長了一些根據元素索引來操做集合的特有方法,以下:

`public void add(int index, E element)`: 將指定的元素,添加到該集合中的指定位置上。
`public E get(int index)`:返回集合中指定位置的元素。
`public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
`public E set(int index, E element)`:用指定元素替換集合中指定位置的元素,返回值的更新前的元素。

List集合特有的方法都是跟索引相關,咱們在基礎班都學習過,那麼咱們再來複習一遍吧:

```java
public class ListDemo {
    public static void main(String[] args) {
        // 建立List集合對象
        List<String> list = new ArrayList<String>();
        
        // 往 尾部添加 指定元素
        list.add("圖圖");
        list.add("小美");
        list.add("不高興");
        
        System.out.println(list);
        // add(int index,String s) 往指定位置添加
        list.add(1,"沒頭腦");
        
        System.out.println(list);
        // String remove(int index) 刪除指定位置元素  返回被刪除元素
        // 刪除索引位置爲2的元素 
        System.out.println("刪除索引位置爲2的元素");
        System.out.println(list.remove(2));
        
        System.out.println(list);
        
        // String set(int index,String s)
        // 在指定位置 進行 元素替代(改) 
        // 修改指定位置元素
        list.set(0, "三毛");
        System.out.println(list);
        
        // String get(int index)  獲取指定位置元素
        
        // 跟size() 方法一塊兒用  來 遍歷的 
        for(int i = 0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        //還可使用加強for
        for (String string : list) {
            System.out.println(string);
        }      
    }
}
```

4、List的子類

4.1 ArrayList集合

`java.util.ArrayList`集合數據存儲的結構是數組結構。元素增刪慢,查找快,因爲平常開發中使用最多的功能爲查詢數據、遍歷數據,因此`ArrayList`是最經常使用的集合。

許多程序員開發時很是隨意地使用ArrayList完成任何需求,並不嚴謹,這種用法是不提倡的。

4.2 LinkedList集合

`java.util.LinkedList`集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合。

> LinkedList是一個雙向鏈表,那麼雙向鏈表是什麼樣子的呢,咱們用個圖瞭解下



實際開發中對一個集合元素的添加與刪除常常涉及到首尾操做,而LinkedList提供了大量首尾操做的方法。這些方法咱們做爲了解便可:

`public void addFirst(E e)`:將指定元素插入此列表的開頭。
`public void addLast(E e)`:將指定元素添加到此列表的結尾。
`public E getFirst()`:返回此列表的第一個元素。
`public E getLast()`:返回此列表的最後一個元素。
`public E removeFirst()`:移除並返回此列表的第一個元素。
`public E removeLast()`:移除並返回此列表的最後一個元素。
`public E pop()`:今後列表所表示的堆棧處彈出一個元素。
`public void push(E e)`:將元素推入此列表所表示的堆棧。
`public boolean isEmpty()`:若是列表不包含元素,則返回true。

LinkedList是List的子類,List中的方法LinkedList都是可使用,這裏就不作詳細介紹,咱們只須要了解LinkedList的特有方法便可。在開發時,LinkedList集合也能夠做爲堆棧,隊列的結構使用。(瞭解便可)

方法演示:

~~~java
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        //添加元素
        link.addFirst("abc1");
        link.addFirst("abc2");
        link.addFirst("abc3");
        System.out.println(link);
        // 獲取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        // 刪除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());

        while (!link.isEmpty()) { //判斷集合是否爲空
            System.out.println(link.pop()); //彈出集合中的棧頂元素
        }

        System.out.println(link);
    }
}
~~~

5、Set接口

`java.util.Set`接口和`java.util.List`接口同樣,一樣繼承自`Collection`接口,它與`Collection`接口中的方法基本一致,並無對`Collection`接口進行功能上的擴充,只是比`Collection`接口更加嚴格了。與`List`接口不一樣的是,`Set`接口中元素無序,而且都會以某種規則保證存入的元素不出現重複。

`Set`集合有多個子類,這裏咱們介紹其中的`java.util.HashSet``java.util.LinkedHashSet`這兩個集合。

> tips:Set集合取出元素的方式能夠採用:迭代器、加強for。

5.1 HashSet集合介紹

`java.util.HashSet``Set`接口的一個實現類,它所存儲的元素是不可重複的,而且元素都是無序的(即存取順序不一致)。`java.util.HashSet`底層的實現實際上是一個`java.util.HashMap`支持,因爲咱們暫時還未學習,先作了解。

`HashSet`是根據對象的哈希值來肯定元素在集合中的存儲位置,所以具備良好的存取和查找性能。保證元素惟一性的方式依賴於:`hashCode``equals`方法。

咱們先來使用一下Set集合存儲,看下現象,再進行原理的講解:

~~~java
public class HashSetDemo {
    public static void main(String[] args) {
        //建立 Set集合
        HashSet<String>  set = new HashSet<String>();

        //添加元素
        set.add(new String("cba"));
        set.add("abc");
        set.add("bac"); 
        set.add("cba");  
        //遍歷
        for (String name : set) {
            System.out.println(name);
        }
    }
}
~~~

輸出結果以下,說明集合中不能存儲重複元素:

~~~
cba
abc
bac
~~~

> tips:根據結果咱們發現字符串"cba"只存儲了一個,也就是說重複的元素set集合不存儲。

2.2  HashSet集合存儲數據的結構(哈希表)

什麼是哈希表呢?

**JDK1.8**以前,哈希表底層採用數組+鏈表實現,即便用鏈表處理衝突,同一hash值的鏈表都存儲在一個鏈表裏。可是當位於一個桶中的元素較多,即hash值相等的元素較多時,經過key值依次查找的效率較低。而JDK1.8中,哈希表存儲採用數組+鏈表+紅黑樹實現,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減小了查找時間。

簡單的來講,哈希表是由數組+鏈表+紅黑樹(JDK1.8增長了紅黑樹部分)實現的,以下圖所示。



看到這張圖就有人要問了,這個是怎麼存儲的呢?

爲了方便你們的理解咱們結合一個存儲流程圖來講明一下:



總而言之,**JDK1.8**引入紅黑樹大程度優化了HashMap的性能,那麼對於咱們來說保證HashSet集合元素的惟一,其實就是根據對象的hashCode和equals方法來決定的。若是咱們往集合中存放自定義的對象,那麼保證其惟一,就必須複寫hashCode和equals方法創建屬於當前對象的比較方式。

5.3  HashSet存儲自定義類型元素

給HashSet中存放自定義類型元素時,須要重寫對象中的hashCode和equals方法,創建本身的比較方式,才能保證HashSet集合中的對象惟一

建立自定義Student類

~~~java
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        return age == student.age &&
               Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
~~~

~~~java
public class HashSetDemo2 {
    public static void main(String[] args) {
        //建立集合對象   該集合中存儲 Student類型對象
        HashSet<Student> stuSet = new HashSet<Student>();
        //存儲 
        Student stu = new Student("于謙", 43);
        stuSet.add(stu);
        stuSet.add(new Student("郭德綱", 44));
        stuSet.add(new Student("于謙", 43));
        stuSet.add(new Student("郭麒麟", 23));
        stuSet.add(stu);

        for (Student stu2 : stuSet) {
            System.out.println(stu2);
        }
    }
}
執行結果:
Student [name=郭德綱, age=44]
Student [name=于謙, age=43]
Student [name=郭麒麟, age=23]
~~~

5.3 LinkedHashSet

咱們知道HashSet保證元素惟一,但是元素存放進去是沒有順序的,那麼咱們要保證有序,怎麼辦呢?

在HashSet下面有一個子類`java.util.LinkedHashSet`,它是鏈表和哈希表組合的一個數據存儲結構。

演示代碼以下:

~~~java
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<String>();
        set.add("bbb");
        set.add("aaa");
        set.add("abc");
        set.add("bbc");
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
結果:
  bbb
  aaa
  abc
  bbc
~~~

5.9  可變參數

**JDK1.5**以後,若是咱們定義一個方法須要接受多個參數,而且多個參數類型一致,咱們能夠對其簡化成以下格式:

```
修飾符 返回值類型 方法名(參數類型... 形參名){  }
```

其實這個書寫徹底等價與

```
修飾符 返回值類型 方法名(參數類型[] 形參名){  }
```

只是後面這種定義,在調用時必須傳遞數組,而前者能夠直接傳遞數據便可。

**JDK1.5**之後。出現了簡化操做。**...** 用在參數上,稱之爲可變參數。

一樣是表明數組,可是在調用這個帶有可變參數的方法時,不用建立數組(這就是簡單之處),直接將數組中的元素做爲實際參數進行傳遞,其實編譯成的class文件,將這些元素先封裝到一個數組中,在進行傳遞。這些動做都在編譯.class文件時,自動完成了。

代碼演示:    

```java
public class ChangeArgs {
    public static void main(String[] args) {
        int[] arr = { 1, 4, 62, 431, 2 };
        int sum = getSum(arr);
        System.out.println(sum);
        //  6  7  2 12 2121
        // 求 這幾個元素和 6  7  2 12 2121
        int sum2 = getSum(6, 7, 2, 12, 2121);
        System.out.println(sum2);
    }

    /*
     * 完成數組  全部元素的求和 原始寫法
     
      public static int getSum(int[] arr){
        int sum = 0;
        for(int a : arr){
            sum += a;
        }
        
        return sum;
      }
    */
    //可變參數寫法
    public static int getSum(int... arr) {
        int sum = 0;
        for (int a : arr) {
            sum += a;
        }
        return sum;
    }
}
```

> tips: 上述add方法在同一個類中,只能存在一個。由於會發生調用的不肯定性
> 注意:若是在方法書寫時,這個方法擁有多參數,參數中包含可變參數,可變參數必定要寫在參數列表的末尾位置。

第十章圖形程序設計知識點總結:

一、swing概述:swing基於AWT架構之上,Swing是指被繪製的用戶界、面類,AWT是指像事件處理這樣的窗口工具箱的底層機制,Swing可讓用戶隨意的選擇喜歡的感官。

二、框架:沒有包含在其餘窗口中的窗口被稱爲框架(frame),在AWT中有一個Frame類,是用來描述框架的,這個類在Swing版本中是JFrame(絕大數的Swing組件都有J開頭),它是極少數幾個不繪製在畫布上的Swing組件之一,它的修飾部件(如按鈕,標題欄,圖標等)由用戶的窗口系統繪製,而不是由Swing繪製,Swing用來繪製框架裏的內容。 

     JFrame.setVisible(true)方法可讓框架可見,

     JFrame.show()可讓框架可見而且置於其餘窗口的前面。

     JFrame.setDefaultCloseOperation(int i)能夠定義關閉這個框架時候的響應動做,讓程序退出的常量是JFrame.EXIT_ON_CLOSE。(以上方法都不是靜態方法!)在初始化完後,main方法退出,這個時候程序並無終止,終止的只是主線程,事件調度線程保持程序處於激活狀態,直到關閉框架或者調用System.exit。 

三、改變框架: 

  3.一、Component類:setVisible(boolean bool)設置窗口是否顯示;

                                  set||getSize(int w,int h||Dimension d)設置/獲取大小;

                                 set||getLocation(int x,int y)設置獲取位置,setBounds(int x,int y,int w,int h)設置位置和大小。 

  3.二、windows類:toBack()將窗口移動到桌面窗口棧的後面 ;

                             toFront()將窗口移動到桌面的前面;

                             setLocationByPlatfrom(boolean bool)由平臺選擇一個合適的位置顯示窗口。 

  3.三、Frame類: isResizable(boolean bool)是否可讓用戶改變大小;

                           setTitle(String str)設置標題;

                           setIconImage(Image img)設置框架的圖標。 

                           setUndecorate(boolean bool)框架顯示中的標題欄以及關閉按鈕這些是否顯示;

                           setExtendedState(int state)設置窗口的狀態,如Frame.ICONIFIED可讓窗口最小化。

  3.四、Toolkit類:getDefaultToolkit()返回一個默認的工具箱;

                         Dimension getScreen()返回用戶屏幕的尺寸;

                         Image getImage(String filename)加載獲得一個指定的圖像對象。

四、繪製組件:繪製一個組件,須要定義一個擴展JComponent的類,並覆蓋其中的paintComponent(Graphics g)方法,在JAVA中,全部的繪製都必須使用Craphics對象。只要窗口須要從新繪圖時,事件處理器就會通告組件,從而執行全部組件的paintComponent方法。不用本身調用paintComponent方法,在應用程序須要從新繪圖的時候,這個方法會自動的被調用,若是須要強制從新繪製組件,那麼要調用的是repaint方法,他將引起採用相應配置的Graphics對象調用全部組件的paintComponent方法。

  4.一、JFrame類:getContentPane()返回框架裏的內容窗口;

                           add(Component comp)將一個給定的組件添加到該框架的內容窗口中。 

  4.二、Component類:repaint()從新繪製組件。

  4.三、JPanel類是一個能夠包含其餘組件的容器,但一樣也能夠在其上面進行繪製。

 五、繪製2D圖形:主要是用java.awt.Graphics2D類去繪製圖形的。圖形的類主要在java.awt.geom裏。要掌握這些之間的關係。

      paintComponent方法能夠自動得到一個Graphics對象,能夠把他強制轉型成Graphics2D對象。

第二部分:實驗部分

1、實驗目的與要求

(1) 掌握VetorStackHashtable三個類的用途及經常使用API

(2) 掌握ArrayListLinkList兩個類的用途及經常使用API

(3) 掌握Java GUI中框架建立及屬性設置中經常使用類的API   

(4) 應用結對編程(Pair programming),體驗程序開發中的兩人合做。

2、實驗內容和步驟

實驗1 導入第9示例程序,測試程序並進行代碼註釋。

測試程序1

l  使用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
package
集合; import java.util.Stack; 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("element2=" + 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++) {
            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

 

l  使用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));
        }
     }
}

運行結果:

 

 

 

package 集合;

import java.util.LinkedList;
import java.util.ListIterator;

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);// listIterator(int index) 構造器,能夠從指定下標處開始遍歷
        while(li.hasNext())
            System.out.println(li.next());
        if(l.indexOf("Hello")<0)//public int indexOf(int ch): 返回指定字符在字符串中第一次出現處的索引,若是此字符串中沒有這樣的字符,則返回 -1。
            System.out.println("Lookup does not work");
        else
            System.out.println("Lookup works");                
    }
}

運行結果:

 

 

 l  Elipse環境下編輯運行調試教材360頁程序9-1,結合程序運行結果理解程序;

 

l  掌握ArrayListLinkList兩個類的用途及經常使用API

package 集合;

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();
      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(); // skip next element
            bIter.remove(); // remove that element
         }
      }

      System.out.println(b);

      // bulk operation: remove all words in b from a

      a.removeAll(b);

      System.out.println(a);
   }
}

運行結果:

 

 

 實驗2導入第10示例程序,測試程序並進行代碼註釋。

 

測試程序1

 

l  運行下列程序,觀察程序運行結果。

package 集合;

import javax.swing.JFrame;

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);
        }
    }

運行結果:

 

 

 l  elipse IDE中調試運行教材407頁程序10-1,結合程序運行結果理解程序;與上面程序對比,思考異同;

 

l  掌握空框架建立方法;

 

l  瞭解主線程與事件分派線程概念;

 

l  掌握GUI頂層窗口建立技術。

package 圖像程序設計;

import java.awt.EventQueue;

import javax.swing.JFrame;

public class SimpleFrameTest {
   public static void main(String[] args) {
       EventQueue.invokeLater(()->
       {
          SimpleFrame frame=new SimpleFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//是設置用戶在此窗體上發起 "close" 時默認執行的操做。必須指定如下選項之一:
          frame.setVisible(true);//setVisible方法:程序框是否是在界面可見的
          frame.setTitle("Hello world");//用於改變標題欄的文字
       });
       
   }
    
}

運行結果:

 

 

 測試程序2

 

l  elipse IDE中調試運行教材412頁程序10-2,結合運行結果理解程序;

 

l  掌握肯定框架經常使用屬性的設置方法。

package 圖像程序設計;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


public class SizedFrameTest{

    public static void main(String[] args)
    {
        EventQueue.invokeLater(()->
        {
          JFrame 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類的靜態方法,getDefaultTookit獲得Tookit對象
            Dimension screenSize=kit.getScreenSize();//獲得屏幕的尺寸
            int screenHeight=screenSize.height;
            int screenWidth=screenSize.width;
            
            setSize(screenWidth/2,screenHeight/2);
            setLocationByPlatform(true);
            
            //set frame icon
            Image img=new ImageIcon("F:\\照片\\2019-05\\3e22741e711cf0b01c0e52dc4efc587b.jpg").getImage();
            setIconImage(img);    
        }
}

運行結果:

 

 

 測試程序3

 

l  elipse IDE中調試運行教材418頁程序10-3,結合運行結果理解程序;

 

l  掌握在框架中添加組件;

 

l  掌握自定義組件的用法。

package 圖像程序設計;

import java.awt.EventQueue;

import javax.swing.JFrame;

public class NotHelloWorld {
    public static void main(String[] args)
    {
            EventQueue.invokeLater(()->
            {
             JFrame frame=new NotHelloWorldFrame();
             frame.setTitle("NotHelloWorld");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
            });
    }

}
package 圖像程序設計;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;

public class NotHelloWorldComponent extends JComponent {
              public static final int MESSAGE_X=75;
              public static final int MESSAGE_Y=100;
              
              private static final int DFFAULT_WIDTH=300;
              private static final int DFFAULT_HEIGHT=300;
              
              public void paintComponent(Graphics g)
              {
                  g.drawString("Not a Hello,World program", MESSAGE_X, MESSAGE_Y);
              }
              public Dimension getPreferredSize() {
                  return new Dimension( DFFAULT_WIDTH,DFFAULT_HEIGHT);
              }
}
package 圖像程序設計;

import javax.swing.JFrame;

public class NotHelloWorldFrame extends JFrame {
        public NotHelloWorldFrame()
        {
            add(new NotHelloWorldComponent());
            pack();
        }
}

 

運行結果:

 

 

 關於結對編程:

l  如下圖片是一個結對編程場景:兩位學習夥伴坐在一塊兒,面對着同一臺顯示器,使用着同一鍵盤,同一個鼠標,他們一塊兒思考問題,一塊兒分析問題,一塊兒編寫程序

      l  關於結對編程的闡述可參見如下連接

http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

http://en.wikipedia.org/wiki/Pair_programming

 

l  對於結對編程中代碼設計規範的要求參考:

http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html

實驗總結:

       個人感覺:本週主要學習了Vetor、Stack、Hashtable三個類的用途及經常使用API,ArrayList、LinkList兩個類的用途及經常使用API,同時對於集合的知識進行了更加深刻的學習,同時也學習了圖形用戶界面設計有關的知識,經過本章的學習我瞭解瞭如何用一些組件去畫字,圖形。瞭解了建立框架時的一些經常使用API,圖形用戶界面的一些基礎的設計操做,好比窗口顯示不一樣圖形,文字等等,以爲頗有意思;但實際用這些知識本身去設計圖形仍是會有必定的難度。經過練習題集練習學過的內容,對學過的知識進行了再鞏固,加深了理解。

相關文章
相關標籤/搜索