亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java接口中盡量避免使用數組

2019-11-26 15:06:30
字體:
來源:轉載
供稿:網友

 如果你發現在一個接口使用有如下定義方法:
 

public String[] getParameters();

那么你應該認真反思。數組不僅僅老式,而且我們有合理的理由避免暴露它們。在這篇文章中,我將試圖總結在Java API中使用數組的缺陷。首先從最出人意料的一個例子開始。
數組導致性能不佳

你可能認為使用數組是最快速的,因為數組是大多數collection實現的底層數據結構。使用一個純數組怎么會比使用一個包含數組的對象性能更低?


讓我們先從這個看起來很熟悉的普遍的習慣用法開始:
 

public String[] getNames() { return namesList.toArray( new String[ namesList.size() ] );}

這個方法從一個用來在其內部保存數據的可變集合處創建了一個數據. 它通過提供一個確切大小的數組來嘗試優化數組的創建. 有趣的是,這一“優化”使得其比下面的更簡單的版本速度還要慢(請看圖表中綠色VS橘色條):
 

public String[] getNames() { return namesList.toArray( new String[ 0 ] );}

不過,如果方法返回的是一個List, 創建防御式的副本又更加的快了 (紅條):
 

public List<String> getNames() { return new ArrayList( namesList );}

不同之處在于一個ArrayList將它的數據項放在一個Object[]數組中,并且使用的是無類型的toArray方法,其比有類型的方法要快很多(藍條). 這是類型安全的,因為無類型的數組時封裝在由編譯器檢查的泛型類型ArrayList<T>中的.

2015710105938872.png (664×146)

這個圖標展示了一個在Java 7上n=5的參考標準. 不過,更多的數據項或者是另外一個VM情況系啊,這幅圖片并不會改變太多. CPU的開銷可能并不會太劇烈,但是會有增長. 機會有一個數組的使用者應該將其轉換到一個集合中去,以便利用它做任何事情, 然后將結果轉換回一個數組,來送進另外一個接口的方法中,諸如此類做法.

是用一個簡單的ArrayList,而不是一個數組來提升性能,無需再動太多的手腳. ArrayList 為封裝的數組增加了32字節的恒定開銷. 例如,一個有十個對象的數組需要104字節,一個ArrayList 136字節.

使用 集合,你甚至可能決定返回內部列表的一個不可修改的版本:
 

public List<String> getNames() { return Collections.unmodifiableList( namesList );}

此操作會在固定的市價運行,因此他比任何上述其它的方法都要快很多(黃條). 其同一個防御式的拷貝不同。一個不可修改的集合將會在你的內部數據變化時跟著變化。如果變化發生了,客戶端會在迭代數據項時運行到一個ConcurrentModificationException中. 可以認為它是一個糟糕的設計,接口提供了一個在運行時拋出一個UnsupportedOperationException. 不過,至少對于內部的使用,這個方法對于一個防御式的拷貝而言,會是一個高性能的選擇 - 一些不可能使用數組實現的東西.

數組定義一個結構,而不是一個接口

Java 是一門面向對象的語言。面向對象的核心概念就是提供一些方法來訪問和操作它們的數據,而不是直接對數據域進行操作. 這些方法創建一個接口來描述你可以在對象上面做的事情.

由于java已經對性能做了設計,原生類型和數組已經被融合進了類型系統之中. 對象可以使用數組來在內容高效地存儲數據. 然而,即使通過數組來呈現一個可變集合的元素,它們也不會提供任何方法來訪問和操作這些元素. 事實上,除了直接訪問的替換元素之外,在數組上你沒有多少其它事情可以做. 數組甚至連toString 和 equals 都沒有一個有意義的實現, 而集合卻有:
 

String[] array = { "foo", "bar" };List<String> list = Arrays.asList( array ); System.out.println( list );// -> [foo, bar]System.out.println( array );// -> [Ljava.lang.String;@6f548414 list.equals( Arrays.asList( "foo", "bar" ) )// -> truearray.equals( new String[] { "foo", "bar" } )// -> false

不同于數組,集合的 API 提供了許多有用的方法來訪問元素. 用戶可以檢查包含的元素,提取子列表或者計算交集. 集合可以向數據層添加特定的特性, 諸如線程安全,同時將實現原理保持在內部可見.

通過使用一個數據,你定義了數據被保存在內存中的哪個地方. 通過使用一個集合,你定義了用戶可以在數據上做的操作.

數組不是類型安全的

如果你依賴于編譯器檢查的類型安全,小心對象數組. 下面的代碼會在運行時奔潰,但是編譯器找不出問題所在:

Number[] numbers = new Integer[10];numbers[0] = Long.valueOf( 0 ); // throws ArrayStoreException

原因是數組是“協變式”的, 比如,如果 T 是S 的一個子類型, 那么 T[] 就會是 S[] 的一個子類型. Joshua Bloch 在其著作 Effective Java 涵蓋了所有的理論, 每一個Java開發者必讀.

歸因于這個行為,暴露數組類型的接口允許返回聲明數組類型的一個子類型, 導致了一個怪異的運行時異常.


Bloch 同時也解釋說,數組與泛型類型不兼容. 因為數組會在運行時強制要求有類型信息,而泛型則會在編譯時被檢查,泛型類型不能被放到數組中.

  •     一般而言,數組和泛型不能很好的融合。如果你發現自己在融合它們而得到了一個編譯時錯誤或者警告,那你的第一反應應該是用list去替換數組.

- Joshua Bloch, Effective Java (第二版), 第29條
總結

數組底層的語言構造、它們會被用在實現中,但是它們不應該想其它的類暴露. 在一個接口方法中使用數組違背了面向對象的原則,它會導致違和的API,并且它也可能給類型安全和性能造成短板.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品男人的天堂| 精品少妇v888av| 成人动漫网站在线观看| 26uuu另类亚洲欧美日本老年| 日韩av中文在线| 欧美电影免费观看网站| 国产精品久久久久久久久男| 97久久精品人搡人人玩| 欧美日韩亚洲一区二| 久久精品国产成人精品| 91精品久久久久久久久久久| 日韩欧美在线字幕| 午夜欧美大片免费观看| 久久天堂电影网| 日韩精品视频观看| 日韩美女免费线视频| 国产精品久久久久免费a∨大胸| 欧美视频一二三| 51久久精品夜色国产麻豆| 亚洲а∨天堂久久精品9966| 亚洲免费一级电影| 最近2019中文字幕大全第二页| 深夜福利亚洲导航| 日韩成人在线视频观看| 午夜精品一区二区三区av| 欧美日韩国产限制| 国产精品美乳在线观看| 精品在线观看国产| 成人高清视频观看www| 国产精品一区二区电影| 欧美大片欧美激情性色a∨久久| 精品中文字幕久久久久久| 精品国产一区二区三区在线观看| 亚洲精品中文字幕av| 国语自产精品视频在线看一大j8| 日韩免费看的电影电视剧大全| www.日韩av.com| 亚洲精品成人网| 亚洲精品国产精品国自产在线| 久久久久久一区二区三区| 日韩免费精品视频| 欧美日韩国产丝袜另类| 亚洲国产日韩欧美在线动漫| 欧美黄色片在线观看| 亚洲色图偷窥自拍| 国内外成人免费激情在线视频网站| 在线观看欧美www| 亚洲久久久久久久久久久| 欧美丝袜一区二区| 日韩欧美在线视频观看| 欧美一级bbbbb性bbbb喷潮片| 777777777亚洲妇女| 亚洲男人av电影| 国产午夜一区二区| 欧美日本亚洲视频| 亚洲国产精品va在看黑人| 日韩中文字幕精品视频| 日韩在线中文视频| 欧美性猛交99久久久久99按摩| 日韩精品在线免费观看视频| 欧美日韩免费在线观看| 亚洲丁香久久久| 欧美在线xxx| 97在线精品国自产拍中文| 亚洲跨种族黑人xxx| 欧美一区深夜视频| 亚洲视频日韩精品| 在线电影中文日韩| 精品伊人久久97| 精品亚洲一区二区三区四区五区| 中文字幕av一区二区三区谷原希美| 欧美多人乱p欧美4p久久| 精品精品国产国产自在线| 91亚洲一区精品| 欧美色图在线视频| 全亚洲最色的网站在线观看| 欧美乱大交xxxxx另类电影| 欧美色图在线视频| 97在线精品国自产拍中文| 欧美野外猛男的大粗鳮| 日本一区二区三区在线播放| 91久久久久久久久久久| 久久久成人精品视频| www.亚洲一二| 91夜夜未满十八勿入爽爽影院| 亚洲精品久久久久久下一站| 欧洲精品久久久| 国产精国产精品| 日韩av在线免费播放| 亚洲精品v天堂中文字幕| 亚洲福利在线播放| 91视频免费在线| 国产精品中文久久久久久久| 中文字幕综合在线| 国产不卡在线观看| 久久久久久久久中文字幕| 国产日韩av在线播放| 成人激情视频在线观看| 亚洲专区在线视频| 久久综合网hezyo| 日韩电影大片中文字幕| xxxxx91麻豆| 欧美孕妇毛茸茸xxxx| 国产精品户外野外| 91av网站在线播放| 动漫精品一区二区| 国产亚洲在线播放| 欧美日韩中文字幕在线视频| 亚洲第一av网| 亚洲天堂开心观看| 久久精品2019中文字幕| 欧洲日韩成人av| 国产不卡av在线| 在线观看国产欧美| 亚洲欧美国产日韩中文字幕| 亚洲aaaaaa| 国产一区二区三区中文| 亚洲欧美日韩一区在线| 国产精选久久久久久| 国产亚洲精品美女久久久久| 国产精品久久久久久久久免费看| 久久久天堂国产精品女人| 91久久夜色精品国产网站| 岛国av午夜精品| 久久久久一本一区二区青青蜜月| 亚洲国产精品久久精品怡红院| 欧美午夜性色大片在线观看| 欧美一级淫片播放口| 久久6免费高清热精品| 国产精品免费在线免费| 日韩欧美主播在线| 欧美日韩亚洲成人| 成人av资源在线播放| 国产不卡在线观看| 38少妇精品导航| 成人两性免费视频| 国产精品va在线播放我和闺蜜| 亚洲高清不卡av| 国产精品欧美在线| 97久久精品人人澡人人爽缅北| 国产成+人+综合+亚洲欧洲| 亚洲成人av在线播放| 91精品国产九九九久久久亚洲| 亚洲国产精品人人爽夜夜爽| 欧美成人三级视频网站| 亚洲免费视频网站| 亚洲亚裔videos黑人hd| 国产精品欧美日韩| 亚洲成人激情小说| 亚洲精品国产精品国自产在线| 亚洲伊人久久大香线蕉av| 国产在线视频不卡| 欧美麻豆久久久久久中文| 国产亚洲日本欧美韩国| 18久久久久久| 日韩一区二区三区xxxx| 疯狂蹂躏欧美一区二区精品| 高清亚洲成在人网站天堂| 久久精品国产视频| 精品香蕉一区二区三区| 亚洲人成电影网站色xx| 欧美一区二粉嫩精品国产一线天| 亚洲mm色国产网站| 91麻豆国产语对白在线观看|