一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java接口中盡量避免使用數組

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

2019-12-25 13:44goldensun JAVA教程

這篇文章主要介紹了Java接口中盡量避免使用數組的建議,根據實際示例展示了接口中使用數組而造成的影響程序速度的現象,需要的朋友可以參考下

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

?
1
public String[] getParameters();

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

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


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

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

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

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

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

?
1
2
3
public List<String> getNames() {
 return new ArrayList( namesList );
}

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

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

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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" ) )
// -> true
array.equals( new String[] { "foo", "bar" } )
// -> false

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

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

數組不是類型安全的

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

?
1
2
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,并且它也可能給類型安全和性能造成短板.

延伸 · 閱讀

精彩推薦
  • JAVA教程Java中BigDecimal類的簡單用法

    Java中BigDecimal類的簡單用法

    這篇文章主要介紹了Java中BigDecimal類的簡單用法,是Java應用程序開發中非常實用的技巧,本文以實例形式對此進行了簡單的分析,需要的朋友可以參考下 ...

    shichen20141462019-11-29
  • JAVA教程Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    Gavin-Feng6672019-06-29
  • JAVA教程Java開發者結合Node.js編程入門教程

    Java開發者結合Node.js編程入門教程

    這篇文章主要介紹了Java開發者結合Node.js編程入門教程,我將先向您展示如何使用Java EE創建一個簡單的Rest服務來讀取 MongoDB數據庫。然后我會用node.js來實現...

    java教程網4872019-11-28
  • JAVA教程Jar打包用法詳解

    Jar打包用法詳解

    這篇文章主要介紹了Jar打包用法,詳解分析了jar打包命令的各種常見用法及參數含義,非常具有實用價值,需要的朋友可以參考下 ...

    shichen20142452019-12-06
  • JAVA教程java實現系統托盤示例

    java實現系統托盤示例

    桌面的系統托盤即當程序最小化或者關閉按鈕程序并沒有退出,而是最小化在任務狀態區域,下面是使用java實現系統托盤示例 ...

    java教程網1392019-11-13
  • JAVA教程java實現計算周期性提醒的示例

    java實現計算周期性提醒的示例

    本文分享一個java實現計算周期性提醒的示例,可以計算父親節、母親節這樣的節日,也可以定義如每月最好一個周五,以方便安排會議 ...

    Java教程網1262019-11-18
  • JAVA教程java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例,有需要的朋友可以參考一下 ...

    java教程網4032019-11-03
  • JAVA教程Servlet 過濾器詳細介紹

    Servlet 過濾器詳細介紹

    這篇文章介紹了Servlet 過濾器,有需要的朋友可以參考一下 ...

    java技術網4772019-10-17
主站蜘蛛池模板: 超级乱淫伦短篇小说做车 | 亚洲第99页| 香蕉久久夜色精品国产小优 | 2021国产精品视频一区 | 亚洲人成高清毛片 | 成人免费在线视频观看 | 美女被躁了在线观看视频 | 天天天天天天天操 | 91久久偷偷做嫩草影院免费 | 无人在线高清免费看 | 国内激情自拍 | 五月天精品视频在线观看 | 四虎影视永久在线精品免费 | 免费xxxxx大片在线观看影视 | 国产精品吹潮香蕉在线观看 | 亚洲 欧美 制服 校园 动漫 | 免费av在线视频 | 7mav视频 | 白丝萝莉喷水 | 窝窝午夜理伦影院 | 亚洲第6页 | 天天做天天玩天天爽天天 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 好湿好紧太硬了我太爽了h 好湿好滑好硬好爽好深视频 | 99精品免费在线 | 日本免费久久久久久久网站 | 色播影院性播影院私人影院 | 国产精品女主播自在线拍 | 欧美搞逼视频 | 国产高清在线精品一区二区三区 | 69日本人 | 经典三级四虎在线观看 | 天天澡夜夜澡狠狠澡 | 欧美a级v片不卡在线观看 | 白丝尤物的下面被疯狂蹂躏 | 无限资源在线观看高清 | 国产毛片一级aaaaa片 | 男人插女人软件 | 国内9lporm自拍视频区 | 97成网| 19+韩国女主播激情vip视频在线 |