隨筆 - 175  文章 - 202  trackbacks - 0
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          第一個Blog,記錄哈哈的生活

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Java links

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          最近一個朋友做猜數字游戲的解法,我也嘗試了一下,在做數據生成器的時候,就希望做一個類型無關的,其實這個問題在去迅雷面試的時候就被問到,不過當時想都沒想就放棄了,雖然面試當天回來的時候,完成了一下,但結果還是差強人意。所以想借這個機會弄一下。

          在記錄一條數據(Record)的時候,我本來使用了 List 實例化成 ArrayList,然后開始算,不過借助 JProbe 看了一下,List.size() 和 List.get(i) 這兩個方法因為調用次數太多而占用了大部分的時間,所以第一想法是改成數組。

          當我 new Record 的時候,使用的是 list ,自然想把這個 List<T> 轉換成數組 T[] ,不過非常麻煩的是 list.toArray(T[]) 中的 T[] 不知道如何得到,不知道如何弄到 T[] 的實例,new T[list.size()] 是沒辦法的。

          第一個反應是從 list 或是 List<T> 定義的 class 中得到成員的類型,然后使用 Arrays.newInstance 來創建一個,我花了好長的時間都沒有能夠得到,后來和同事聊天時,猜測是不是編譯完的 class 文件中根本就沒有類型的信息,不過當時沒能確定。

          晚上接著猜數字的時候,舊事重提,google 了一下,看到了一個非常好的文章。
          http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
          將泛型說明的非常清楚,其中一句是這樣的“Java 語言中的泛型基本上完全在編譯器中實現,由編譯器執行類型檢查和類型推斷,然后生成普通的非泛型的字節碼。這種實現技術稱為擦除(erasure)(編譯器使用泛型類型信息保證類型安全,然后在生成字節碼之前將其清除)”。

          驗證了我的想法,在 class 文件中,根本就沒有泛型的信息。

          實際上,聲明一個泛型數據的方法是

          T[] array = (T[])new Object[length];

          這樣,問題解決,對 Java 泛型的理解增加了一些。
          posted on 2007-08-08 00:39 哈哈的日子 閱讀(3913) 評論(3)  編輯  收藏 所屬分類: Java

          FeedBack:
          # re: 創建泛型數據的方法,由 List.toArray(T[]) 想到。 2007-08-10 11:20 李敏
          能否把那個迅雷面試的題目貼出來一下,想看看,這篇文章看的暈暈的!  回復  更多評論
            
          # re: 創建泛型數據的方法,由 List.toArray(T[]) 想到。 2007-08-10 22:48 哈哈的日子
          題目就是給定一些值,如 0~9,生成所有這些值的組合,如

          1234567890
          1234567809
          1234567980  回復  更多評論
            
          # re: 創建泛型數據的方法,由 List.toArray(T[]) 想到。 2007-08-25 21:24 李敏
          無非就是生成沒有重復的10位數的一個集合,沒有什么難的!

          public class Untitled1 {

          public static void main(String[] args) {

          for (long i = 1000000000L; i < 9999999999L; i++) {
          String num = String.valueOf(i);
          String[] bit = num.split("");
          if (checkNum(bit)) {
          System.out.println(num);
          }
          }

          }

          public static boolean checkNum(String[] num) {
          Set set = new HashSet();
          for (int i = 1; i < num.length; i++) {
          set.add(String.valueOf(num[i]));
          }
          if (set.size() != 10) {
          return false;
          } else {
          return true;
          }

          }
          }

          這個方法確實有點慢!還得想個好的方法!但是這個題目還真不難,頂多就是效率問題!  回復  更多評論
            
          主站蜘蛛池模板: 东莞市| 和政县| 淳安县| 于田县| 海城市| 沽源县| 蚌埠市| 盈江县| 英吉沙县| 武川县| 兴宁市| 甘肃省| 芒康县| 克什克腾旗| 兴化市| 永新县| 淮南市| 洛阳市| 伊通| 洞头县| 永清县| 天气| 黄平县| 天柱县| 黄大仙区| 莎车县| 遂溪县| 曲阳县| 张家界市| 新津县| 芮城县| 青神县| 二连浩特市| 扎鲁特旗| 中宁县| 宁海县| 淅川县| 罗城| 英超| 昔阳县| 化德县|