最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?HashSet的Removals()方法注意事項(xiàng)

 更新時(shí)間:2022年06月22日 11:07:41   作者:?sofia?  
這篇文章主要介紹了Java?HashSet的Removals()方法注意事項(xiàng),文章圍繞制主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

我有一個(gè)集合,實(shí)際上是一個(gè)HashSet。我想從中刪除一些item…其中許多item可能不存在。事實(shí)上,在我們的測(cè)試用例中,“removals”集合中的所有項(xiàng)都不在原始集合中。這聽(tīng)起來(lái)——實(shí)際上也是——非常容易編碼。畢竟,我們已經(jīng)準(zhǔn)備好了。removeAll來(lái)幫助我們,對(duì)嗎?

讓我們把它變成一個(gè)小測(cè)試。我們?cè)诿钚猩现付?ldquo;source”set的大小和“removals”集合的大小,并構(gòu)建它們。source set合只包含非負(fù)整數(shù);刪除集僅包含負(fù)整數(shù)。我們使用系統(tǒng)測(cè)量刪除所有元素所需的時(shí)間System.currentTimeMillis(),它不是世界上最精確的秒表,但在這種情況下就足夠了,正如您將看到的那樣。

代碼如下:

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        int sourceSize = Integer.parseInt(args[0]);
        int <a  rel="external nofollow"  rel="external nofollow"  target="_blank" >removals</a>Size = Integer.parseInt(args[1]);
        
        Set<Integer> source = new HashSet<Integer>();
        Collection<Integer> <a  rel="external nofollow"  rel="external nofollow"  target="_blank" >removals</a> = new ArrayList<Integer>();
        
        for (int i = 0; i < sourceSize; i++)
        {
            source.add(i);
        }
        for (int i = 1; i <= removalsSize; i++)
        {
            removals.add(-i);
        }
        
        long start = System.currentTimeMillis();
        source.removeAll(removals);
        long end = System.currentTimeMillis();
        System.out.println("Time taken: " + (end – start) + "ms");
    }
}

首先,讓我們給它一個(gè)簡(jiǎn)單的工作:一個(gè)包含100個(gè)items的source set,以及要?jiǎng)h除的100個(gè)items:

c:UsersJonTest>java Test 100 100
Time taken: 1ms

好吧,所以我們沒(méi)想到會(huì)很慢……很明顯,我們可以把速度提高一點(diǎn)。一百萬(wàn)件items和300000件items的來(lái)源如何?

c:UsersJonTest>java Test 1000000 300000
Time taken: 38ms

嗯,看起來(lái)還是挺快的?,F(xiàn)在我覺(jué)得我有點(diǎn)殘忍,要求它做所有這些移除。讓我們讓它變得更簡(jiǎn)單一些–300000個(gè)source items和300000個(gè)刪除:

c:UsersJonTest>java Test 300000 300000
Time taken: 178131ms

快三分鐘了?哎呀!當(dāng)然,從一個(gè)較小的集合中刪除items應(yīng)該比我們?cè)?8ms內(nèi)管理的集合更容易?嗯,最終這一切都是有道理的。HashSet擴(kuò)展了AbstractSet,它在removeAll方法的文檔中包含此代碼段:

https://docs.oracle.com/javase/6/docs/api/java/util/AbstractSet.html

此實(shí)現(xiàn)通過(guò)調(diào)用每個(gè)集合上的size方法來(lái)確定此集合和指定集合中的較小者。如果此集合的元素較少,則實(shí)現(xiàn)將迭代此集合,依次檢查迭代器返回的每個(gè)元素,以查看它是否包含在指定的集合中。如果它是這樣包含的,則使用迭代器的remove方法將其從該集中移除。如果指定集合的元素較少,那么實(shí)現(xiàn)將迭代指定集合,使用該集合的remove方法從該集合中刪除迭代器返回的每個(gè)元素。

從表面上看,這聽(tīng)起來(lái)很合理——遍歷較小的集合,檢查較大集合中是否存在。然而,這就是抽象存在漏洞的地方。僅僅因?yàn)槲覀兛梢砸笠粋€(gè)item出現(xiàn)在一個(gè)大的集合中,并不意味著它會(huì)很快出現(xiàn)。在我們的例子中,集合的大小是相同的,但是檢查哈希集中是否存在項(xiàng)是O(1),而在ArrayList中檢查是O(N)…而每個(gè)集合的迭代成本是相同的?;旧?,通過(guò)選擇遍歷HashSet并檢查ArrayList中是否存在,我們得到了一個(gè)O(M*N)解決方案,而不是O(N)解決方案。removeAll方法基于在這種情況下無(wú)效的假設(shè)進(jìn)行“優(yōu)化”。

那么如何解決?

有兩種簡(jiǎn)單的方法可以解決這個(gè)問(wèn)題。首先,只需更改要從中刪除的集合的類型。只需將ArrayList<Integer>更改為HashSet<Integer>,我們就可以回到34ms的范圍。我們甚至不需要更改聲明的刪除類型。

第二種方法是更改我們使用的API:如果我們知道要迭代刪除并在源代碼中執(zhí)行查找,那么很容易做到:

for (Integer value : removals)
{
    source.remove(value);
}

事實(shí)上,在我的機(jī)器上,它的性能略優(yōu)于removeAll–它不需要在每次迭代時(shí)檢查remove的返回值,removeAll這樣做是為了返回是否刪除了任何項(xiàng)。以上運(yùn)行時(shí)間約為28ms。(我已經(jīng)用相當(dāng)大的數(shù)據(jù)集對(duì)其進(jìn)行了測(cè)試,它確實(shí)比雙哈希集方法更快。)

然而,這兩種方法都需要在源代碼中添加注釋,以解釋為什么我們沒(méi)有使用最明顯的代碼(列表和刪除)。我不能抱怨這里的文檔——它確切地說(shuō)明了它將做什么。在你遇到這樣的問(wèn)題之前,你根本不需要擔(dān)心它。

那么,實(shí)現(xiàn)應(yīng)該做什么呢?可以說(shuō),它真的需要知道它所處理的每一個(gè)集合中什么是便宜的。在決定策略之前探索性能特征的想法對(duì)于清理我們喜歡在Java集合之類的框架中考慮的抽象是完全不可取的……但在這種情況下,這可能是一個(gè)好主意。

到此這篇關(guān)于Java HashSet的Removals()方法注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java HashSet 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成Kafka的步驟

    SpringBoot集成Kafka的步驟

    這篇文章主要介紹了SpringBoot集成Kafka的步驟,幫助大家更好的理解和使用SpringBoot,感興趣的朋友可以了解下
    2021-01-01
  • Spring Security中用JWT退出登錄時(shí)遇到的坑

    Spring Security中用JWT退出登錄時(shí)遇到的坑

    使用了JWT后,每次請(qǐng)求都要攜帶 Bearer Token 并且被專門的過(guò)濾器攔截解析之后才能將用戶認(rèn)證信息保存到 SecurityContext 中去,接下來(lái)通過(guò)本文給大家介紹Spring Security中用JWT退出登錄時(shí)遇到的坑,感興趣的朋友一起看看吧
    2021-10-10
  • Java實(shí)現(xiàn)的JSONUtil工具類與用法示例

    Java實(shí)現(xiàn)的JSONUtil工具類與用法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的JSONUtil工具類與用法,結(jié)合實(shí)例形式分析了Java操作json格式數(shù)據(jù)工具類JSONUtil的定義與簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2018-07-07
  • 詳解java中各類鎖的機(jī)制

    詳解java中各類鎖的機(jī)制

    這篇文章為大家總結(jié)了java中常見(jiàn)的鎖(互斥鎖、讀寫鎖、公平鎖與非公平鎖等)的機(jī)制以及如何使用,文中示例代碼講解詳細(xì),需要的可以學(xué)習(xí)一下
    2021-12-12
  • HashSet如何保證元素不重復(fù)(面試必問(wèn))

    HashSet如何保證元素不重復(fù)(面試必問(wèn))

    HashSet 不保證集合的迭代順序,但允許插入 null 值,也就是說(shuō)它可以將集合中的重復(fù)元素自動(dòng)過(guò)濾掉,保證存儲(chǔ)在 HashSet 中的元素都是唯一的,這篇文章主要介紹了HashSet如何保證元素不重復(fù)(面試必問(wèn)),需要的朋友可以參考下
    2021-12-12
  • java中JSON字符串轉(zhuǎn)換為Map集合的兩種方法

    java中JSON字符串轉(zhuǎn)換為Map集合的兩種方法

    本文主要介紹了java中JSON字符串轉(zhuǎn)換為Map集合,包含了兩種方法,這種需求可能涉及到從外部接口獲取數(shù)據(jù),或者在程序中處理配置信息等,感興趣的可以了解一下
    2024-07-07
  • java如何通過(guò)流讀取圖片做base64編碼

    java如何通過(guò)流讀取圖片做base64編碼

    這篇文章主要介紹了java如何通過(guò)流讀取圖片做base64編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java使用Swagger接口框架方法詳解

    Java使用Swagger接口框架方法詳解

    這篇文章主要介紹了Java使用Swagger接口框架方法,Swagger是一個(gè)方便我們更好的編寫API文檔的框架,而且Swagger可以模擬http請(qǐng)求調(diào)用,感興趣的同學(xué)可以參考下文
    2023-05-05
  • Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造

    Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造

    Service Mesh這個(gè)“熱”詞是2016年9月被“造”出來(lái),而今年2018年更是被稱為service Mesh的關(guān)鍵之年,各家大公司都希望能在這個(gè)思潮下領(lǐng)先一步
    2023-03-03
  • Java中Mybatis分頁(yè)查詢的四種傳參方式

    Java中Mybatis分頁(yè)查詢的四種傳參方式

    這篇文章主要介紹了Java中Mybatis分頁(yè)查詢的四種傳參方式:順序傳參,@param傳參,自定義POJO類傳參,Map傳參,想詳細(xì)了解傳參方式的小伙伴可以詳細(xì)閱讀本文,有一定的而參考價(jià)值
    2023-03-03

最新評(píng)論

济宁市| 吉安县| 南投县| 勐海县| 临桂县| 乡城县| 九江市| 南汇区| 襄汾县| 遵化市| 仪征市| 南昌县| 县级市| 山东省| 庆元县| 屏东县| 宣城市| 土默特左旗| 乐亭县| 蒲城县| 夏津县| 景东| 北流市| 杨浦区| 伊宁县| 安阳市| 出国| 浠水县| 邢台市| 湄潭县| 方正县| 廉江市| 三江| 金门县| 天等县| 班戈县| 扎鲁特旗| 县级市| 黄平县| 兴安县| 永川市|