国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

數(shù)組

2019-11-11 01:29:01
字體:
供稿:網(wǎng)友

性能?請優(yōu)先考慮數(shù)組

       在java中有很多方式來存儲一系列數(shù)據(jù),而且在操作上面比數(shù)組方便的多?但為什么我們還需要使用數(shù)組,而不是替代它呢?數(shù)組與其他種類的容器之間的區(qū)別有三個方面:效率、類型和保存基本類型的能力。在java中,數(shù)組是一種效率最高的存儲和隨機(jī)訪問對象引用序列的方式。

       在項目設(shè)計中數(shù)組使用的越來越少了,而且它確實是沒有List、Set這些集合使用方便,但是在某些方面數(shù)組還是存在一些優(yōu)勢的,例如:速度,而且集合類的底層也都是通過數(shù)組來實現(xiàn)的。

[java] view plain copy 在CODE上查看代碼片--------這是ArrayList的add()------      public boolean add(E e) {      ensureCapacity(size + 1);  // Increments modCount!!      elementData[size++] = e;      return true;      }  

       下面利用數(shù)組和list來做一些操作比較。

       一、求和

[java] view%20plain copy Long time1 = System.currentTimeMillis();          for(int i = 0 ; i < 100000000 ;i++){              sum += arrays[i%10];          }          Long time2 = System.currentTimeMillis();          System.out.public void ensureCapacity(int minCapacity) {          modCount++;            int oldCapacity = elementData.length;          /**          * 若當(dāng)前需要的長度超過數(shù)組長度時進(jìn)行擴(kuò)容處理          */          if (minCapacity > oldCapacity) {              Object oldData[] = elementData;                  int newCapacity = (oldCapacity * 3) / 2 + 1;    //擴(kuò)容              if (newCapacity < minCapacity)                  newCapacity = minCapacity;              //拷貝數(shù)組,生成新的數(shù)組              elementData = Arrays.copyOf(elementData, newCapacity);          }      }  

       這段代碼對我們有用的地方就在于if語句后面。它的思路是將原始數(shù)組拷貝到新數(shù)組中,新數(shù)組是原始數(shù)組長度的1.5倍。所以模擬的數(shù)組擴(kuò)容代碼如下:

[java] view%20plain copy public class ArrayUtils {      /**      * @desc 對數(shù)組進(jìn)行擴(kuò)容      * @author chenssy      * @data 2013-12-8      * @param <T>      * @param datas 原始數(shù)組      * @param newLen 擴(kuò)容大小      * @return T[]      */      public static <T> T[] expandCapacity(T[] datas,int newLen){          newLen = newLen < 0 ? datas.length :datas.length + newLen;             //生成一個新的數(shù)組          return Arrays.copyOf(datas, newLen);      }            /**      * @desc 對數(shù)組進(jìn)行擴(kuò)容處理,1.5倍      * @author chenssy      * @data 2013-12-8      * @param <T>      * @param datas  原始數(shù)組      * @return T[]      */      public static <T> T[] expandCapacity(T[] datas){          int newLen = (datas.length * 3) / 2;      //擴(kuò)容原始數(shù)組的1.5倍          //生成一個新的數(shù)組          return Arrays.copyOf(datas, newLen);      }            /**      * @desc 對數(shù)組進(jìn)行擴(kuò)容處理,      * @author chenssy      * @data 2013-12-8      * @param <T>      * @param datas 原始數(shù)組      * @param mulitpublic class Test {      public static void main(String[] args) {          Person person_01 = new Person("chenssy_01");                    Person[] persons1 = new Person[]{person_01};          Person[] persons2 = Arrays.copyOf(persons1,persons1.length);                    System.out.println("數(shù)組persons1:");          display(persons1);          System.out.println("---------------------");          System.out.println("數(shù)組persons2:");          display(persons2);          //改變其值          persons2[0].setName("chessy_02");          System.out.println("------------改變其值后------------");          System.out.println("數(shù)組persons1:");          display(persons1);          System.out.println("---------------------");          System.out.println("數(shù)組persons2:");          display(persons2);      }      public static void display(Person[] persons){          for(Person person : persons){              System.out.println(person.toString());          }      }  }  -------------Output:  數(shù)組persons1:  姓名是:chenssy_01  ---------------------  數(shù)組persons2:  姓名是:chenssy_01  ------------改變其值后------------  數(shù)組persons1:  姓名是:chessy_02  ---------------------  數(shù)組persons2:  姓名是:chessy_02  

       從結(jié)果中發(fā)現(xiàn),persons1中的值也發(fā)生了改變,這是典型的淺拷貝問題。所以通過Arrays.copyOf()方法產(chǎn)生的數(shù)組是一個淺拷貝。同時數(shù)組的clone()方法也是,集合的clone()方法也是,所以我們在使用拷貝方法的同時一定要注意淺拷貝這問題。

       有關(guān)于深淺拷貝的博文,參考:

       漸析java的淺拷貝和深拷貝:http://www.cnblogs.com/chenssy/p/3308489.html。       使用序列化實現(xiàn)對象的拷貝:http://blog.csdn.net/chenssy/article/details/12952063    數(shù)組轉(zhuǎn)換為List注意地方       我們經(jīng)常需要使用到Arrays這個工具的asList()方法將其轉(zhuǎn)換成列表。方便是方便,但是有時候會出現(xiàn)莫名其妙的問題。如下:

[java] view%20plain copy public static void main(String[] args) {          int[] datas = new int[]{1,2,3,4,5};          List list = Arrays.asList(datas);          System.out.println(list.size());      }  ------------Output:  1  

       結(jié)果是1,是的你沒有看錯,%20結(jié)果就是1。但是為什么會是1而不是5呢?先看asList()的public static <T> List<T> asList(T... a) {          return new ArrayList<T>(a);      }  

       注意這個參數(shù):T…a,這個參數(shù)是一個泛型的變長參數(shù),我們知道基本數(shù)據(jù)類型是不可能泛型化的,也是就說8個基本數(shù)據(jù)類型是不可作為泛型參數(shù)的,但是為什么編譯器沒有報錯呢?這是因為在java中,數(shù)組會當(dāng)做一個對象來處理,它是可以泛型的,所以我們的程序是把一個int型的數(shù)組作為了T的類型,所以在轉(zhuǎn)換之后List中就只會存在一個類型為int數(shù)組的元素了。所以我們這樣的程序System.out.println(datas.equals(list.get(0)));輸出結(jié)果肯定是true。當(dāng)然如果將int改為Integer,則長度就會變成5了。

       我們在看下面程序:

[java] view%20plain copy enum Week{Sum,Mon,Tue,Web,Thu,Fri,Sat}      public static void main(String[] args) {          Week[] weeks = {Week.Sum,Week.Mon,Week.Tue,Week.Web,Week.Thu,Week.Fri};          List<Week> list = Arrays.asList(weeks);          list.add(Week.Sat);      }  

       這個程序非常簡單,就是講一個數(shù)組轉(zhuǎn)換成list,然后改變集合中值,但是運(yùn)行呢?

[java] view%20plain copy Exception in thread "main" java.lang.UnsupportedOperationException      at java.util.AbstractList.add(AbstractList.java:131)      at java.util.AbstractList.add(AbstractList.java:91)      at com.array.Test.main(Test.java:18)  

       編譯沒錯,但是運(yùn)行竟然出現(xiàn)了異常錯誤!UnsupportedOperationException%20,當(dāng)不支持請求的操作時,就會拋出該異常。從某種程度上來說就是不支持add方法,我們知道這是不可能的!什么原因引起這個異常呢?先看asList()的源代碼:

[java] view%20plain copy public static <T> List<T> asList(T... a) {          return new ArrayList<T>(a);      }  

       這里是直接返回一個ArrayList對象返回,但是注意這個ArrayList并不是java.util.ArrayList,而是Arrays工具類的一個內(nèi)之類:

[java] view%20plain copy private static class ArrayList<E> extends AbstractList<E>      implements Randomaccess, java.io.Serializable{          private static final long serialVersionUID = -2764017481108945198L;          private final E[] a;          ArrayList(E[] array) {              if (array==null)                  throw new NullPointerException();          a = array;      }         /** 省略方法 **/      }  

       但是這個內(nèi)部類并沒有提供add()方法,那么查看父類:

[java] view%20plain copy 派生到我的代碼片public boolean add(E e) {      add(size(), e);      return true;      }      public void add(int index, E element) {      throw new UnsupportedOperationException();      }  

       這里父類僅僅只是提供了方法,方法的具體實現(xiàn)卻沒有,所以具體的實現(xiàn)需要子類自己來提供,但是非常遺憾

這個內(nèi)部類ArrayList并沒有提高add的實現(xiàn)方法。在ArrayList中,它主要提供了如下幾個方法:

       1、size:元素數(shù)量

       2、toArray:轉(zhuǎn)換為數(shù)組,實現(xiàn)了數(shù)組的淺拷貝。

       3、get:獲得指定元素。

       4、contains:是否包含某元素。

       所以綜上所述,asList返回的是一個長度不可變的列表。數(shù)組是多長,轉(zhuǎn)換成的列表是多長,我們是無法通過add、remove來增加或者減少其長度的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大足县| 平南县| 永善县| 大港区| 安义县| 新建县| 曲麻莱县| 三台县| 苍梧县| 陈巴尔虎旗| 文化| 永州市| 河源市| 新密市| 古蔺县| 龙川县| 南丰县| 永修县| 景谷| 米泉市| 洛浦县| 都江堰市| 当涂县| 商水县| 中西区| 五原县| 岗巴县| 买车| 壤塘县| 潮州市| 井研县| 罗山县| 永平县| 峨边| 河南省| 綦江县| 葵青区| 兖州市| 清远市| 同仁县| 缙云县|