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

          第一個(gè)Blog,記錄哈哈的生活

          常用鏈接

          留言簿(16)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          Java links

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          最近一個(gè)朋友做猜數(shù)字游戲的解法,我也嘗試了一下,在做數(shù)據(jù)生成器的時(shí)候,就希望做一個(gè)類(lèi)型無(wú)關(guān)的,其實(shí)這個(gè)問(wèn)題在去迅雷面試的時(shí)候就被問(wèn)到,不過(guò)當(dāng)時(shí)想都沒(méi)想就放棄了,雖然面試當(dāng)天回來(lái)的時(shí)候,完成了一下,但結(jié)果還是差強(qiáng)人意。所以想借這個(gè)機(jī)會(huì)弄一下。

          在記錄一條數(shù)據(jù)(Record)的時(shí)候,我本來(lái)使用了 List 實(shí)例化成 ArrayList,然后開(kāi)始算,不過(guò)借助 JProbe 看了一下,List.size() 和 List.get(i) 這兩個(gè)方法因?yàn)檎{(diào)用次數(shù)太多而占用了大部分的時(shí)間,所以第一想法是改成數(shù)組。

          當(dāng)我 new Record 的時(shí)候,使用的是 list ,自然想把這個(gè) List<T> 轉(zhuǎn)換成數(shù)組 T[] ,不過(guò)非常麻煩的是 list.toArray(T[]) 中的 T[] 不知道如何得到,不知道如何弄到 T[] 的實(shí)例,new T[list.size()] 是沒(méi)辦法的。

          第一個(gè)反應(yīng)是從 list 或是 List<T> 定義的 class 中得到成員的類(lèi)型,然后使用 Arrays.newInstance 來(lái)創(chuàng)建一個(gè),我花了好長(zhǎng)的時(shí)間都沒(méi)有能夠得到,后來(lái)和同事聊天時(shí),猜測(cè)是不是編譯完的 class 文件中根本就沒(méi)有類(lèi)型的信息,不過(guò)當(dāng)時(shí)沒(méi)能確定。

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

          驗(yàn)證了我的想法,在 class 文件中,根本就沒(méi)有泛型的信息。

          實(shí)際上,聲明一個(gè)泛型數(shù)據(jù)的方法是

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

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

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

          1234567890
          1234567809
          1234567980  回復(fù)  更多評(píng)論
            
          # re: 創(chuàng)建泛型數(shù)據(jù)的方法,由 List.toArray(T[]) 想到。 2007-08-25 21:24 李敏
          無(wú)非就是生成沒(méi)有重復(fù)的10位數(shù)的一個(gè)集合,沒(méi)有什么難的!

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

          }
          }

          這個(gè)方法確實(shí)有點(diǎn)慢!還得想個(gè)好的方法!但是這個(gè)題目還真不難,頂多就是效率問(wèn)題!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 大丰市| 博野县| 桃园市| 乡宁县| 隆安县| 林西县| 达日县| 资溪县| 封丘县| 寻乌县| 德兴市| 宁乡县| 绵阳市| 岑溪市| 泗水县| 大冶市| 周宁县| 全南县| 本溪| 墨玉县| 绵竹市| 丰城市| 景谷| 浠水县| 车致| 浏阳市| 尼勒克县| 延长县| 长海县| 博爱县| 昌都县| 内丘县| 六安市| 湖南省| 黄平县| 贵州省| 桐城市| 嫩江县| 临泉县| 珲春市| 汝城县|