日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Google Guava] 2.1-不可变集合

發(fā)布時(shí)間:2025/3/21 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Google Guava] 2.1-不可变集合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接?譯者:沈義揚(yáng)

范例

01public?static?final?ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
02????????"red",
03????????"orange",
04????????"yellow",
05????????"green",
06????????"blue",
07????????"purple");
08?
09class?Foo {
10????Set<Bar> bars;
11????Foo(Set<Bar> bars) {
12????????this.bars = ImmutableSet.copyOf(bars);?// defensive copy!
13????}
14}

為什么要使用不可變集合

不可變對(duì)象有很多優(yōu)點(diǎn),包括:

  • 當(dāng)對(duì)象被不可信的庫調(diào)用時(shí),不可變形式是安全的;
  • 不可變對(duì)象被多個(gè)線程調(diào)用時(shí),不存在競(jìng)態(tài)條件問題
  • 不可變集合不需要考慮變化,因此可以節(jié)省時(shí)間和空間。所有不可變的集合都比它們的可變形式有更好的內(nèi)存利用率(分析和測(cè)試細(xì)節(jié));
  • 不可變對(duì)象因?yàn)橛泄潭ú蛔?#xff0c;可以作為常量來安全使用。

創(chuàng)建對(duì)象的不可變拷貝是一項(xiàng)很好的防御性編程技巧。Guava為所有JDK標(biāo)準(zhǔn)集合類型和Guava新集合類型都提供了簡(jiǎn)單易用的不可變版本。
?JDK也提供了Collections.unmodifiableXXX方法把集合包裝為不可變形式,但我們認(rèn)為不夠好:

  • 笨重而且累贅:不能舒適地用在所有想做防御性拷貝的場(chǎng)景;
  • 不安全:要保證沒人通過原集合的引用進(jìn)行修改,返回的集合才是事實(shí)上不可變的;
  • 低效:包裝過的集合仍然保有可變集合的開銷,比如并發(fā)修改的檢查、散列表的額外空間,等等。

如果你沒有修改某個(gè)集合的需求,或者希望某個(gè)集合保持不變時(shí),把它防御性地拷貝到不可變集合是個(gè)很好的實(shí)踐。

重要提示:所有Guava不可變集合的實(shí)現(xiàn)都不接受null值。我們對(duì)Google內(nèi)部的代碼庫做過詳細(xì)研究,發(fā)現(xiàn)只有5%的情況需要在集合中允許null元素,剩下的95%場(chǎng)景都是遇到null值就快速失敗。如果你需要在不可變集合中使用null,請(qǐng)使用JDK中的Collections.unmodifiableXXX方法。更多細(xì)節(jié)建議請(qǐng)參考“使用和避免null”。

怎么使用不可變集合

不可變集合可以用如下多種方式創(chuàng)建:

  • copyOf方法,如ImmutableSet.copyOf(set);
  • of方法,如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);
  • Builder工具,如
1public?static?final?ImmutableSet<Color> GOOGLE_COLORS =
2????????ImmutableSet.<Color>builder()
3????????????.addAll(WEBSAFE_COLORS)
4????????????.add(new?Color(0,?191,?255))
5????????????.build();

此外,對(duì)有序不可變集合來說,排序是在構(gòu)造集合的時(shí)候完成的,如:

1ImmutableSortedSet.of("a",?"b",?"c",?"a",?"d",?"b");

會(huì)在構(gòu)造時(shí)就把元素排序?yàn)閍, b, c, d。

比想象中更智能的copyOf

請(qǐng)注意,ImmutableXXX.copyOf方法會(huì)嘗試在安全的時(shí)候避免做拷貝——實(shí)際的實(shí)現(xiàn)細(xì)節(jié)不詳,但通常來說是很智能的,比如:

1ImmutableSet<String> foobar = ImmutableSet.of("foo",?"bar",?"baz");
2thingamajig(foobar);
3?
4void?thingamajig(Collection<String> collection) {
5????ImmutableList<String> defensiveCopy = ImmutableList.copyOf(collection);
6????...
7}

在這段代碼中,ImmutableList.copyOf(foobar)會(huì)智能地直接返回foobar.asList(),它是一個(gè)ImmutableSet的常量時(shí)間復(fù)雜度的List視圖。
作為一種探索,ImmutableXXX.copyOf(ImmutableCollection)會(huì)試圖對(duì)如下情況避免線性時(shí)間拷貝:

  • 在常量時(shí)間內(nèi)使用底層數(shù)據(jù)結(jié)構(gòu)是可能的——例如,ImmutableSet.copyOf(ImmutableList)就不能在常量時(shí)間內(nèi)完成。
  • 不會(huì)造成內(nèi)存泄露——例如,你有個(gè)很大的不可變集合ImmutableList<String>
    hugeList, ImmutableList.copyOf(hugeList.subList(0, 10))就會(huì)顯式地拷貝,以免不必要地持有hugeList的引用。
  • 不改變語義——所以ImmutableSet.copyOf(myImmutableSortedSet)會(huì)顯式地拷貝,因?yàn)楹突诒容^器的ImmutableSortedSet相比,ImmutableSet對(duì)hashCode()和equals有不同語義。

在可能的情況下避免線性拷貝,可以最大限度地減少防御性編程風(fēng)格所帶來的性能開銷。

asList視圖

所有不可變集合都有一個(gè)asList()方法提供ImmutableList視圖,來幫助你用列表形式方便地讀取集合元素。例如,你可以使用sortedSet.asList().get(k)從ImmutableSortedSet中讀取第k個(gè)最小元素。

asList()返回的ImmutableList通常是——并不總是——開銷穩(wěn)定的視圖實(shí)現(xiàn),而不是簡(jiǎn)單地把元素拷貝進(jìn)List。也就是說,asList返回的列表視圖通常比一般的列表平均性能更好,比如,在底層集合支持的情況下,它總是使用高效的contains方法。

細(xì)節(jié):關(guān)聯(lián)可變集合和不可變集合

可變集合接口屬于JDK還是Guava不可變版本
CollectionJDKImmutableCollection
ListJDKImmutableList
SetJDKImmutableSet
SortedSet/NavigableSetJDKImmutableSortedSet
MapJDKImmutableMap
SortedMapJDKImmutableSortedMap
MultisetGuavaImmutableMultiset
SortedMultisetGuavaImmutableSortedMultiset
MultimapGuavaImmutableMultimap
ListMultimapGuavaImmutableListMultimap
SetMultimapGuavaImmutableSetMultimap
BiMapGuavaImmutableBiMap
ClassToInstanceMapGuavaImmutableClassToInstanceMap
TableGuavaImmutableTable

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自并發(fā)編程網(wǎng) – ifeve.com本文鏈接地址:?[Google Guava] 2.1-不可變集合

from:?http://ifeve.com/google-guava-immutablecollections/?

總結(jié)

以上是生活随笔為你收集整理的[Google Guava] 2.1-不可变集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费观看视频在线观看 | 国产精品一区二区电影 | 97影院| 99re这里有精品 | 欧美性xxxxx 亚洲特黄一级片 | 老司机深夜福利在线观看 | 久久夜夜操妹子 | 日本韩国欧美 | 日本道在线观看 | 男人的天堂在线播放 | 久久中出| 国产伦精品一区二区三区高清版 | 亚欧美色图| 精品人妻一区二区三区免费看 | 免费成人av在线 | 男男gay同性三级 | 成人免费看片&#39; | 国产精品成人无码专区 | 又骚又黄的视频 | av老司机在线观看 | 欧洲美女与动交zozzo | 美女国产网站 | av第一区| 一极黄色大片 | 亚洲视频1 | 亚洲色网址 | 麻豆chinese新婚xxx | 97人妻精品一区二区三区视频 | 国产精品美女久久久久久久 | 国产精品国产精品国产 | 99av视频 | 四虎在线播放 | 97人人精品 | 农村偷人一级超爽毛片 | 日本熟妇人妻中出 | 久99| 性一交一乱一精一晶 | 人妻在线日韩免费视频 | 热播网 | 91成年版 | 亚洲一区电影 | 国产18禁黄网站免费观看 | 在线一区二区视频 | 国产日产久久高清欧美一区 | 中文字幕三级电影 | 9cao| 首尔之春在线观看 | av影院在线观看 | 岛国久久久 | 国产黄色精品网站 | 少妇超碰 | 综合久色 | 少妇激情一区二区三区 | 伊人影院在线播放 | 男人天堂你懂的 | 91午夜精品亚洲一区二区三区 | 亚洲欧美一区二区三区情侣bbw | 五月婷婷七月丁香 | 久久中文视频 | 壮汉被书生c到合不拢腿 | 国产青青青 | 波多野结衣影片 | 制服丝袜中文字幕在线 | 日本中文字幕免费观看 | 欧美三级在线看 | 91在线小视频 | 精品人妻一区二区三区四区 | 欧美一级性视频 | 超碰97国产精品人人cao | 波多野吉衣av在线 | 久久久久久国 | 亚洲九九 | 欧美日韩在线视频免费播放 | 久久图库 | 91福利在线视频 | 小早川怜子一区二区三区 | 欧美专区 日韩专区 | 国产黄色片免费看 | 亚洲精品中文字幕乱码无线 | 亚洲人xxx日本人18 | 精品美女一区二区 | 亚洲网站在线播放 | 日本性生活一级片 | 五月婷丁香 | 国产精品嫩草影院av蜜臀 | 欧美激情一区 | 污污视频在线免费观看 | 成人久久久精品乱码一区二区三区 | 亚洲理论片 | 他趴在我两腿中间添得好爽在线看 | 亚洲精品国产一区二 | 亚洲精品国产精品乱码不99按摩 | 69欧美视频 | 91九色视频在线 | 精品中出 | 日本三级精品 | 久久一区欧美 | 日韩欧美一区二区三区视频 | 亚洲图片欧美在线 |