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 閱讀(4082) 評論(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.使用本地化方法拷貝內容給新數組。  回復  更多評論
            

          主站蜘蛛池模板: 华容县| 岫岩| 西宁市| 宣恩县| 大新县| 碌曲县| 香格里拉县| 景宁| 栾城县| 永修县| 南京市| 渑池县| 泰州市| 柏乡县| 仁怀市| 安庆市| 永昌县| 潢川县| 贵阳市| 德兴市| 城口县| 航空| 南京市| 嘉禾县| 南江县| 杂多县| 沙河市| 平山县| 都兰县| 安国市| 涿州市| 普洱| 镇坪县| 岑巩县| 新兴县| 蓬莱市| 黎城县| 惠水县| 河南省| 司法| 龙南县|