欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JAVA中int類型數(shù)組怎么修改為泛型

這篇文章主要介紹“JAVA中int類型數(shù)組怎么修改為泛型”,在日常操作中,相信很多人在JAVA中int類型數(shù)組怎么修改為泛型問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JAVA中int類型數(shù)組怎么修改為泛型”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出嘉魚免費(fèi)做網(wǎng)站回饋大家。

int類型數(shù)組

先來(lái)一個(gè)簡(jiǎn)單的內(nèi)容,這個(gè)是正常的,以為我在日常的開發(fā)中有的時(shí)候還是能遇見的,哈哈哈哈,正不正常就以我是不是用過作為標(biāo)準(zhǔn)

public class Main {

   public static void main(String[] args) {
       Array score=new Array(10);
       for(int i=0;i<8;i++){
           score.addLast(i);
       }

       score.add(1,100);
       score.addLast(99);
       System.out.println(score.toString());

       System.out.println(score.find(1));
       System.out.println(score.contains(1));
       System.out.println(score.remove(1));
       System.out.println(score.toString());
       System.out.println(score.removeElement(2));
       System.out.println(score.toString());
   }
}

修改為泛型

public class Array<T> {
   private T[] data;
   private int size;

   public Array() {
       this(10);
   }

   public Array(int capacity) {
       //java本身不支持直接new 一個(gè)泛型數(shù)組,所以用以下方法實(shí)現(xiàn)
       data = (T[])new Object[capacity];
       size = 0;
   }

   public int getSize() {
       return size;
   }

   public int getCapacity() {
       return data.length;
   }

   public boolean isEmpty() {
       return size == 0;
   }

   /**
    * 向數(shù)組末尾添加元素
    *
    * @param e
    */
   public void addLast(T e) {
       add(size, e);
   }

   /**
    * 向數(shù)組開頭添加元素
    *
    * @param e
    */
   public void addFirst(T e) {
       add(0, e);
   }

   /**
    * 向任意合法位置添加元素
    *
    * @param index
    * @param e
    */
   public void add(int index, T e) {
       if (size == data.length) {
           throw new IllegalArgumentException("Add is fail.Array is full");
       }

       if (index < 0 || index > size) {
           throw new IllegalArgumentException("Add is fail.Require index >= 0 and index < size");
       }

       for (int i = size; i > index; i--) {
           data[i] = data[i - 1];
       }
       data[index] = e;
       size++;
   }

   /**
    * 獲取索引位置的元素
    * 通過這種封裝,用戶無(wú)法查詢未使用的空間,保證了數(shù)據(jù)的安全性。
    *
    * @param index
    * @return
    */
   public T get(int index) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Get is failed.Index is illegal");
       }
       return data[index];
   }

   /**
    * 修改索引位置的元素
    *
    * @param index
    * @param e
    */
   public void set(int index, T e) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Set is failed.Index is illegal");
       }
       data[index] = e;
   }

   /**
    * 數(shù)組中是否包含某個(gè)元素
    *
    * @param e
    * @return
    */
   public boolean contains(T e) {
       for (int i = 0; i < size; i++) {
           //注意值的比較應(yīng)修改為equals方法
           if (data[i].equals(e)) {
               return true;
           }
       }
       return false;
   }

   /**
    * 查詢數(shù)組中某個(gè)元素的索引
    *
    * @param e
    * @return 沒有該元素則返回-1
    */
   public int find(T e) {
       for (int i = 0; i < size; i++) {
           if (data[i].equals(e)) {
               return i;
           }
       }
       return -1;
   }

   /**
    * 刪除index位置的元素,并且返回該元素
    * 不用擔(dān)心刪除后原來(lái)size位置的元素,因?yàn)橛脽o(wú)法訪問到它。
    * 但是最好再寫一句data[size]=null 具體原因需要了解java的垃圾回收機(jī)制
    *
    * @param index
    * @return
    */
   public T remove(int index) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Remove failed.Require index >=0 and index < size");
       }

       T ret = data[index];
       for (int i = index; i < size - 1; i++) {
           data[i] = data[i + 1];
       }
       //注意維護(hù)size
       size--;
       data[size]=null;
       return ret;
   }

   /**
    * 不用擔(dān)心數(shù)組為空的情況,因?yàn)閿?shù)組如果為空,remove方法就會(huì)拋出異常
    * @return
    */
   public T removeFirst(){
       return remove(0);
   }

   public T removeLast(){
       return remove(size-1);
   }

   /**
    * 從數(shù)組中刪除元素e
    * @param e
    */
   public boolean removeElement(T e){
       int index=find(e);
       if(index!=-1){
           remove(index);
           return true;
       }else{
           return false;
       }
   }

   /**
    * 重寫toString()方法
    *
    * @return
    */
   @Override
   public String toString() {
       StringBuilder res = new StringBuilder();
       res.append(String.format("size= %d,capacity= %d\n", size, data.length));
       res.append("[");
       for (int i = 0; i < size; i++) {
           res.append(data[i]);
           if (i != size - 1) {
               res.append(",");
           }
       }
       res.append("]");
       return res.toString();
   }
}

增加數(shù)組大小

前面當(dāng)我們向數(shù)組中添加元素時(shí),如果index==size,表示數(shù)組已滿。

if (size == data.length) {
   throw new IllegalArgumentException("Add is fail.Array is full");
}
123

現(xiàn)在可以考慮這樣做,依然判斷插入位置是否合法,但是當(dāng)size等于數(shù)組長(zhǎng)度時(shí),自動(dòng)為數(shù)組擴(kuò)容——resize(2*data.length);
之所以是擴(kuò)為原來(lái)的2倍,是因?yàn)檫@樣擴(kuò)容量的大小和原來(lái)容量大小有關(guān),既不會(huì)過小也不會(huì)過大。

private void resize(int newCapacity){
   T[] newData=(T[])new Object[newCapacity];
   for(int i=0;i<size;i++){
       newData[i]=data[i];
   }
   data=newData;
}
1234567

減小數(shù)組大小

因?yàn)橛辛藃esize方法,實(shí)現(xiàn)起來(lái)就很簡(jiǎn)單了。在remove(int index)方法中,移除一個(gè)元素且維護(hù)size后,再加上對(duì)維護(hù)后的size的判斷,如下。如果size已經(jīng)變?yōu)閏apacity的一半,則將數(shù)組容量減半。

if(size==data.length/2){
   resize(data.length/2);
}
123

注意
resize()方法設(shè)為私有,是為了用戶只需使用這個(gè)數(shù)組類,不必去顧慮數(shù)組的大小。

時(shí)間復(fù)雜度的分析

通過對(duì)addLast(T[] e)和removeLast(T[] e)時(shí)間復(fù)雜度的分析,我們發(fā)現(xiàn)都是O(n)級(jí)別的。但是,這樣一般性地考慮最壞的情況在這種情景下是沒有太大意義的。因?yàn)閍ddLast(T[] e)和removeLast(T[] e)操作并不會(huì)經(jīng)常觸發(fā)resize(int newCapcity)操作。所以用均攤復(fù)雜度分析的話,你會(huì)發(fā)現(xiàn)這兩個(gè)操作的均攤復(fù)雜度都是O(1)。因此resize(int newCapcity)這樣一個(gè)比較耗時(shí)的操作,如果保證不會(huì)每次都會(huì)觸發(fā),就可以將它的操作耗時(shí)分?jǐn)偟狡渌僮魃稀?/p>

現(xiàn)在再考慮另外一個(gè)場(chǎng)景,就是在addLast(T[] e)操作后,觸發(fā)了resize(int newCapcity),然后再removeLast(T[] e),又觸發(fā)了resize(int newCapcity);如此循環(huán)。像這樣addLast(T[] e)和removeLast(T[] e)的時(shí)間復(fù)雜度都是O(n)級(jí)別的,這就是所謂的復(fù)雜度的震蕩。以數(shù)組這個(gè)例子,之所以發(fā)生這種情況是因?yàn)槲覀冊(cè)趓emoveLast操作后,就接著進(jìn)行了resize操作這樣太著急了。那么該如何防止復(fù)雜度的震蕩呢?
可以這樣修改removeLast方法的代碼。

if(size==data.length/4 && data.length/4!=0){
resize(data.length/2);
}

加上data.length/4!=0的判斷是因?yàn)楫?dāng)data.length/4==0的時(shí)候,數(shù)組長(zhǎng)度變?yōu)?,這是不合法的。

修改后的完整代碼

public class Array<T> {
   private T[] data;
   private int size;

   public Array() {
       this(10);
   }

   public Array(int capacity) {
       //java本身不支持直接new 一個(gè)泛型數(shù)組,所以用以下方法實(shí)現(xiàn)
       data = (T[])new Object[capacity];
       size = 0;
   }

   public int getSize() {
       return size;
   }

   public int getCapacity() {
       return data.length;
   }

   public boolean isEmpty() {
       return size == 0;
   }

   /**
    * 向數(shù)組末尾添加元素
    *
    * @param e
    */
   public void addLast(T e) {
       add(size, e);
   }

   /**
    * 向數(shù)組開頭添加元素
    *
    * @param e
    */
   public void addFirst(T e) {
       add(0, e);
   }

   /**
    * 向任意合法位置添加元素
    *
    * @param index
    * @param e
    */
   public void add(int index, T e) {
       /*if (size == data.length) {
           throw new IllegalArgumentException("Add is fail.Array is full");
       }*/

       if (index < 0 || index > size) {
           throw new IllegalArgumentException("Add is fail.Require index >= 0 and index < size");
       }

       if(size == data.length){
           resize(2*data.length);
       }

       for (int i = size; i > index; i--) {
           data[i] = data[i - 1];
       }
       data[index] = e;
       size++;
   }

   /**
    * 獲取索引位置的元素
    * 通過這種封裝,用戶無(wú)法查詢未使用的空間,保證了數(shù)據(jù)的安全性。
    *
    * @param index
    * @return
    */
   public T get(int index) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Get is failed.Index is illegal");
       }
       return data[index];
   }

   /**
    * 修改索引位置的元素
    *
    * @param index
    * @param e
    */
   public void set(int index, T e) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Set is failed.Index is illegal");
       }
       data[index] = e;
   }

   /**
    * 數(shù)組中是否包含某個(gè)元素
    *
    * @param e
    * @return
    */
   public boolean contains(T e) {
       for (int i = 0; i < size; i++) {
           //注意值的比較應(yīng)修改為equals方法
           if (data[i].equals(e)) {
               return true;
           }
       }
       return false;
   }

   /**
    * 查詢數(shù)組中某個(gè)元素的索引
    *
    * @param e
    * @return 沒有該元素則返回-1
    */
   public int find(T e) {
       for (int i = 0; i < size; i++) {
           if (data[i].equals(e)) {
               return i;
           }
       }
       return -1;
   }

   /**
    * 刪除index位置的元素,并且返回該元素
    * 不用擔(dān)心刪除后原來(lái)size位置的元素,因?yàn)橛脽o(wú)法訪問到它。
    * 但是最好再寫一句data[size]=null 具體原因需要了解java的垃圾回收機(jī)制
    *
    * @param index
    * @return
    */
   public T remove(int index) {
       if (index < 0 || index >= size) {
           throw new IllegalArgumentException("Remove failed.Require index >=0 and index < size");
       }

       T ret = data[index];
       for (int i = index; i < size - 1; i++) {
           data[i] = data[i + 1];
       }
       //注意維護(hù)size
       size--;
       data[size]=null;

       if(size==data.length/4 && data.length/4!=0){
resize(data.length/2);
       }
       return ret;
   }

   /**
    * 不用擔(dān)心數(shù)組為空的情況,因?yàn)閿?shù)組如果為空,remove方法就會(huì)拋出異常
    * @return
    */
   public T removeFirst(){
       return remove(0);
   }

   public T removeLast(){
       return remove(size-1);
   }

   /**
    * 從數(shù)組中刪除元素e
    * @param e
    */
   public boolean removeElement(T e){
       int index=find(e);
       if(index!=-1){
           remove(index);
           return true;
       }else{
           return false;
       }
   }

   /**
    * 重寫toString()方法
    *
    * @return
    */
   @Override
   public String toString() {
       StringBuilder res = new StringBuilder();
       res.append(String.format("size= %d,capacity= %d\n", size, data.length));
       res.append("[");
       for (int i = 0; i < size; i++) {
           res.append(data[i]);
           if (i != size - 1) {
               res.append(",");
           }
       }
       res.append("]");
       return res.toString();
   }

   private void resize(int newCapacity){
       T[] newData=(T[])new Object[newCapacity];
       for(int i=0;i<size;i++){
           newData[i]=data[i];
       }
       data=newData;
   }
}

到此,關(guān)于“JAVA中int類型數(shù)組怎么修改為泛型”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)頁(yè)題目:JAVA中int類型數(shù)組怎么修改為泛型
分享鏈接:http://chinadenli.net/article12/jpsgdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航ChatGPTApp開發(fā)小程序開發(fā)網(wǎng)站維護(hù)網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)