善用泛型程式設計〈Generics〉,常用Array、List、Map或Json

four bots

善用泛型程式設計〈Generics〉,常用Array、List、Map或Json

泛型是程式設計語言的一種特性。允許程式設計師在強類型程式設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指明。各種程式設計語言和其編譯器、運行環境對泛型的支持均不一樣。將類型參數化以達到代碼復用提高軟體開發工作效率的一種數據類型。泛型類是引用類型,是堆〈stack〉對象,主要是引入了類型參數這個概念。

泛型其實是一種為了減少我們代碼量而引入的一種模板,在這個模板中主要封裝一些特殊的算法,讓我們可以在處理一些不同類型的數據但對數據的處理具有相同的邏輯算法時,只需要寫出一個模板,就可以處理多種數據類型的方法,無需為每種類型都寫一個處理方法。

泛型也可用於執行階段。 這表示執行階段知道您要使用的資料結構類型,因此可更有效率地將它儲存在記憶體中。

  • 下列是 C# 範例,資料結構類型:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
namespace GenericsExample 
{
  class Program 
  {
    static void Main(string[] args) 
    {
      //generic list
      List<int> ListGeneric = new List<int> { 5, 9, 1, 4 };
      
      //non-generic list
      ArrayList ListNonGeneric = new ArrayList { 5, 9, 1, 4 };
      
      // timer for generic list sort
      Stopwatch s = Stopwatch.StartNew();
      ListGeneric.Sort();
      s.Stop();
      Console.WriteLine("Generic Sort: {ListGeneric}  \n Time taken: {s.Elapsed.TotalMilliseconds}ms");
      
      //timer for non-generic list sort
      Stopwatch s2 = Stopwatch.StartNew();
      ListNonGeneric.Sort();
      s2.Stop();
      Console.WriteLine("Non-Generic Sort: {ListNonGeneric}  \n Time taken: {s2.Elapsed.TotalMilliseconds}ms");
      Console.ReadLine();
    }
  }
}

此程式會產生類似下列內容的輸出:

Generic Sort: System.Collections.Generic.List`1[System.Int32]
 Time taken: 0.0034ms
Non-Generic Sort: System.Collections.ArrayList
 Time taken: 0.2592ms

C# – Generic泛型& Collections集合型別介紹

一般型別泛型型別
ArrayListList< >
QueueQueue< >
StackStack< >
HashtableDictionary< >
StoredListStoredList< >
ListDictionaryDictionary< >
HybridDictionaryDictionary< >
OrderedDictionaryDictionary< >
SortedDictionaryStoredDictionary< >
NameValueCollectionDictionary< >
DictionaryEntryKeyValPair< >
StringCollectionList<String>
StringDictionaryDictionary<String>
  • 標準的集合,在功能上或執行的效率都有限制,System.Collections 命名空間
Hashtable用於包含10個或更多項目的集合,對小集合沒效率
SortedList依索引鍵來排序項目。
  • 集合類別結構
DictionaryEntry主要是用來取出字典集合著Key和Value,
可以利用它來逐一處理集合中的項目。
  • 集合類別介面
IDictionary主要是用索引鍵來存取項目,不能用索引值。
IComparer自訂排序與順序的比較
IEqualityComparer只接受相等比較,自訂排序與順序的比較是
由 IComparer 介面來提供
  • 比較集合
CaseInsensitiveComparer比較兩個物件是否相等,忽略字串的大小寫。
ListDictionary用於包含10個或更少項目的集合,對大集合沒效率
HybridDictionary會先實作成ListDictionary的小集合,當內部變大時,
將會把自己變成Hashtable的大集合。
OrderedDictionarySortedList類別多了一些功能,更為強大。
  • 字串集合,只能使用字串,如果操作的對象不是物件而是字串,那這個類別是首選,因為它可以省下轉型的動作
StringDictionary索引鍵與資料值均採用強式型別宣告為字串,
用法跟Hashtable相似
StringCollection用法跟ArrayList相似
NameValueCollectionStringDictionary相似,
差別在於NameValueCollection可以單一索引鍵對應多重值。
CollectionsUtil建立忽略字串大小寫HashtableSortedList的集合。

  • 下列是 Java 範例,資料結構類型:
import java.util.*;
import java.lang.*;
import java.io.*;
 
class TEST {
  public static void main (String[] args) throws java.lang.Exception {
    ArrayList list = new ArrayList();
   
    //5次自動裝箱(1 -> object)
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
 
    int sum = 0;
    for( int i =0 ; i < list.size() ; i++ ){
        //5次拆解 ( Integer -> int 做運算)
        sum = sum + (Integer)list.get(i); 
    }
    System.out.println(sum);
  }
}