wangflood

          精心維護一個技術blog,為了工作,也是愛好。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
          最近框架里那個method(Object...params)引發了一系列的不兼容反應,包括我的生理反應。。。
          import java.util.ArrayList;
          import java.util.List;

          public class TestList {

              
          public static void main(String[] args) {
                  List
          <String> list = new ArrayList<String>();
                  list.add(
          "wang");
                  list.add(
          "hello");
                  list.add(
          "world");
                  
          // list不能做為String params的參數
                  
          // test(list);
                  
          // 不能轉換成功。why ?
                  
          //test((String[]) list.toArray());
                  String[] arr = list.toArray(new String[list.size()]);
                  test(arr);
                  
          //源碼代看不太懂,toArray方法里面為什么不自己
                  
          //new String[list.size()];難道不是做緩沖的嗎?
                  String[] arr2 = list.toArray(new String[1]);//一個長度也成功。這不是耍我嗎?
                  test(arr2);
              }

              
          public static void test(String params) {
                  
          for (int i = 0; i < params.length; i++) {
                      System.out.println(params[i]);
                  }
              }
          }
          1.為什么(String[])list.toArray()轉換會出錯。
          2.實踐證明list.toArray(new String[xx])括號里面的是用作緩沖的。當然分配得多速度就會快了。這個影響會有多大了。
             java這個設計再次讓程序參與到性能中,JVM優化邊界在哪?什么時候,我們需要考慮到分配一個和N的內存單元緩沖,在速度上的不同?
             這樣的時候多嗎?如果有,什么時候?

          posted on 2011-03-29 20:43 wangflood 閱讀(4086) 評論(3)  編輯  收藏 所屬分類: java

          Feedback

          # re: List的toArray方法 2011-08-15 18:55 xp
          1.向子類強制轉型出錯了
          public Object[] toArray() {
          int s = size;
          Object[] result = new Object[s];
          System.arraycopy(array, 0, result, 0, s);
          return result;
          }

          toArray返回的是Object[],并不是List<String>。  回復  更多評論
            

          # re: List的toArray方法 2011-08-15 19:02 xp
          2.個人認為是:
          list.toArray(new String[1]);
          目的只是為了把類型傳進去,使得返回的類型是String
          當然String數組夠大時,里面就不用重新new,

          public <T> T[] toArray(T[] contents) {
          int s = size;
          if (contents.length < s) {
          @SuppressWarnings("unchecked") T[] newArray
          = (T[]) Array.newInstance(contents.getClass().getComponentType(), s);
          contents = newArray;
          }
          System.arraycopy(this.array, 0, contents, 0, s);
          if (contents.length > s) {
          contents[s] = null;
          }
          return contents;
          }  回復  更多評論
            

          # re: List的toArray方法 2012-03-19 16:19 Spartan
          list.toArray(new String[1])
          是為了將類型穿進去,使得返回的類型是傳進去的,在這個方法里它做了幾步主要的工作:
          1.判斷穿進去的是否是Object類型,如果是new一個Object數組,如果不是那么使用反射生成一個空的類型為參數類型的數組,這個數組的每個內容都為空。
          2.使用本地化方法拷貝內容給新數組。  回復  更多評論
            

          主站蜘蛛池模板: 龙口市| 安顺市| 岳普湖县| 阿克苏市| 子长县| 伊通| 祁门县| 镇沅| 浑源县| 榆树市| 古蔺县| 稷山县| 土默特右旗| 卢氏县| 衡南县| 南郑县| 遵义县| 驻马店市| 封开县| 吉首市| 乐山市| 娄底市| 河曲县| 镇远县| 京山县| 黄骅市| 筠连县| 五峰| 德安县| 神木县| 宁城县| 阳朔县| 自治县| 淮安市| 广元市| 西平县| 惠州市| 盐池县| 台南县| 铜山县| 静安区|