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

點贊功能使用MySQL還是Redis

 更新時間:2021年12月17日 09:23:59   作者:Javaesandyou  
本文主要介紹了點贊功能使用MySQL還是Redis,這是最近面試時被問到的1道面試題,本篇博客對此問題進行總結(jié)分享,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這是最近面試時被問到的1道面試題,本篇博客對此問題進行總結(jié)分享。

1. 新手常犯的錯誤

可能很多新手(包括當(dāng)年的我,哈哈)第一時間想到的寫法是下面這樣的:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    for (String platform : platformList) {
        if (platform.equals("博客園")) {
            platformList.remove(platform);
        }
    }
 
    System.out.println(platformList);
}

然后滿懷信心的去運行,結(jié)果竟然拋
java.util.ConcurrentModificationException異常了,翻譯成中文就是:并發(fā)修改異常。

點贊功能:用 MySQL 還是 Redis?

是不是很懵,心想這是為什么呢?

讓我們首先看下上面這段代碼生成的字節(jié)碼,如下所示:

點贊功能:用 MySQL 還是 Redis?

由此可以看出,foreach循環(huán)在實際執(zhí)行時,其實使用的是Iterator,使用的核心方法是hasnext()和next()。

然后再來看下ArrayList類的Iterator是如何實現(xiàn)的呢?

點贊功能:用 MySQL 還是 Redis?

可以看出,調(diào)用next()方法獲取下一個元素時,第一行代碼就是調(diào)用了checkForComodification();,而該方法的核心邏輯就是比較modCount和expectedModCount這2個變量的值。

在上面的例子中,剛開始modCount和expectedModCount的值都為3,所以第1次獲取元素"博客園"是沒問題的,但是當(dāng)執(zhí)行完下面這行代碼時:

platformList.remove(platform);

modCount的值就被修改成了4。

點贊功能:用 MySQL 還是 Redis?

所以在第2次獲取元素時,modCount和expectedModCount的值就不相等了,所以拋出了
java.util.ConcurrentModificationException異常。

點贊功能:用 MySQL 還是 Redis?

既然不能使用foreach來實現(xiàn),那么我們該如何實現(xiàn)呢?

主要有以下3種方法:

  • 使用Iterator的remove()方法
  • 使用for循環(huán)正序遍歷
  • 使用for循環(huán)倒序遍歷

接下來一一講解。

2. 使用Iterator的remove()方法

使用Iterator的remove()方法的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    Iterator<String> iterator = platformList.iterator();
    while (iterator.hasNext()) {
        String platform = iterator.next();
        if (platform.equals("博客園")) {
            iterator.remove();
        }
    }
 
    System.out.println(platformList);
}

輸出結(jié)果為:

[CSDN, 掘金]

為什么使用iterator.remove();就可以呢?讓我們看下它的源碼:

點贊功能:用 MySQL 還是 Redis?

可以看出,每次刪除一個元素,都會將modCount的值重新賦值給expectedModCount,這樣2個變量就相等了,不會觸發(fā)
java.util.ConcurrentModificationException異常。更多面試題,歡迎關(guān)注公眾號 Java面試題精選

3. 使用for循環(huán)正序遍歷

使用for循環(huán)正序遍歷的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    for (int i = 0; i < platformList.size(); i++) {
        String item = platformList.get(i);
 
        if (item.equals("博客園")) {
            platformList.remove(i);
            i = i - 1;
        }
    }
 
    System.out.println(platformList);
}

這種實現(xiàn)方式比較好理解,就是通過數(shù)組的下標(biāo)來刪除,不過有個注意事項就是刪除元素后,要修正下下標(biāo)的值:

i = i - 1;

為什么要修正下標(biāo)的值呢?因為剛開始元素的下標(biāo)是這樣的:

點贊功能:用 MySQL 還是 Redis?

第1次循環(huán)將元素"博客園"刪除后,元素的下標(biāo)變成了下面這樣:

點贊功能:用 MySQL 還是 Redis?

第2次循環(huán)時i的值為1,也就是取到了元素”掘金“,這樣就導(dǎo)致元素"CSDN"被跳過檢查了,所以刪除完元素后,我們要修正下下標(biāo),這也是上面代碼中i = i - 1;的用途。更多面試問題可以關(guān)注微信訂閱號碼匠筆記回復(fù)面試獲取

4. 使用for循環(huán)倒序遍歷

使用for循環(huán)倒序遍歷的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    for (int i = platformList.size() - 1; i >= 0; i--) {
        String item = platformList.get(i);
 
        if (item.equals("掘金")) {
            platformList.remove(i);
        }
    }
 
    System.out.println(platformList);
}

這種實現(xiàn)方式和使用for循環(huán)正序遍歷類似,不過不用再修正下標(biāo),因為剛開始元素的下標(biāo)是這樣的:

點贊功能:用 MySQL 還是 Redis?

第1次循環(huán)將元素"掘金"刪除后,元素的下標(biāo)變成了下面這樣:

點贊功能:用 MySQL 還是 Redis?

第2次循環(huán)時i的值為1,也就是取到了元素”CSDN“,不會導(dǎo)致跳過元素,所以不需要修正下標(biāo)。

所以在第2次獲取元素時,modCount和expectedModCount的值就不相等了,所以拋出了
java.util.ConcurrentModificationException異常。

點贊功能:用 MySQL 還是 Redis?

既然不能使用foreach來實現(xiàn),那么我們該如何實現(xiàn)呢?

主要有以下3種方法:

  • 使用Iterator的remove()方法
  • 使用for循環(huán)正序遍歷
  • 使用for循環(huán)倒序遍歷

接下來一一講解。

5. 使用Iterator的remove()方法

使用Iterator的remove()方法的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    Iterator<String> iterator = platformList.iterator();
    while (iterator.hasNext()) {
        String platform = iterator.next();
        if (platform.equals("博客園")) {
            iterator.remove();
        }
    }
 
    System.out.println(platformList);
}

輸出結(jié)果為:

[CSDN, 掘金]

為什么使用iterator.remove();就可以呢?讓我們看下它的源碼:

點贊功能:用 MySQL 還是 Redis?

可以看出,每次刪除一個元素,都會將modCount的值重新賦值給expectedModCount,這樣2個變量就相等了,不會觸發(fā)
java.util.ConcurrentModificationException異常。更多面試題,歡迎關(guān)注公眾號 Java面試題精選

6. 使用for循環(huán)正序遍歷

使用for循環(huán)正序遍歷的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    for (int i = 0; i < platformList.size(); i++) {
        String item = platformList.get(i);
 
        if (item.equals("博客園")) {
            platformList.remove(i);
            i = i - 1;
        }
    }
 
    System.out.println(platformList);
}

這種實現(xiàn)方式比較好理解,就是通過數(shù)組的下標(biāo)來刪除,不過有個注意事項就是刪除元素后,要修正下下標(biāo)的值:

i = i - 1;

為什么要修正下標(biāo)的值呢?因為剛開始元素的下標(biāo)是這樣的:

點贊功能:用 MySQL 還是 Redis?

第1次循環(huán)將元素"博客園"刪除后,元素的下標(biāo)變成了下面這樣:

點贊功能:用 MySQL 還是 Redis?

第2次循環(huán)時i的值為1,也就是取到了元素”掘金“,這樣就導(dǎo)致元素"CSDN"被跳過檢查了,所以刪除完元素后,我們要修正下下標(biāo),這也是上面代碼中i = i - 1;的用途。更多面試問題可以關(guān)注微信訂閱號碼匠筆記回復(fù)面試獲取

7. 使用for循環(huán)倒序遍歷

使用for循環(huán)倒序遍歷的實現(xiàn)方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");
 
    for (int i = platformList.size() - 1; i >= 0; i--) {
        String item = platformList.get(i);
 
        if (item.equals("掘金")) {
            platformList.remove(i);
        }
    }
 
    System.out.println(platformList);
}

這種實現(xiàn)方式和使用for循環(huán)正序遍歷類似,不過不用再修正下標(biāo),因為剛開始元素的下標(biāo)是這樣的:

點贊功能:用 MySQL 還是 Redis?

第1次循環(huán)將元素"掘金"刪除后,元素的下標(biāo)變成了下面這樣:

點贊功能:用 MySQL 還是 Redis?

第2次循環(huán)時i的值為1,也就是取到了元素”CSDN“,不會導(dǎo)致跳過元素,所以不需要修正下標(biāo)。

到此這篇關(guān)于點贊功能使用MySQL還是Redis的文章就介紹到這了,更多相關(guān)MySQL\Redis點贊 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS7卸載MySQL5.7的方法步驟

    CentOS7卸載MySQL5.7的方法步驟

    這篇文章主要介紹了CentOS7卸載MySQL5.7的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • MySQL借助DB實現(xiàn)分布式鎖思路詳解

    MySQL借助DB實現(xiàn)分布式鎖思路詳解

    這篇文章主要給大家介紹了關(guān)于MySQL借助DB實現(xiàn)分布式鎖思路的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • mysql字段名和關(guān)鍵字沖突的問題

    mysql字段名和關(guān)鍵字沖突的問題

    這篇文章主要介紹了mysql字段名和關(guān)鍵字沖突的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 解決MySQL遇到錯誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    解決MySQL遇到錯誤:1217 - Cannot delete or 

    這篇文章主要介紹了解決MySQL遇到錯誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • MySQL時區(qū)查看及設(shè)置全過程

    MySQL時區(qū)查看及設(shè)置全過程

    在服務(wù)器環(huán)境下,MySQL默認(rèn)時區(qū)可能是UTC,需注意應(yīng)用時區(qū)設(shè)置,若查詢條件使用Now()/sysdate(),會根據(jù)MySQL時區(qū)查詢,導(dǎo)致時間錯亂,可使用`selectnow()`檢查時間準(zhǔn)確性,查看和修改MySQL時區(qū)的方法包括使用命令和修改配置文件
    2025-01-01
  • mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)

    mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)

    這篇文章主要介紹了mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解

    Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解

    這篇文章主要介紹了Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考解決價值,需要的朋友可以參考下
    2019-06-06
  • MYSQL半同步配置思路

    MYSQL半同步配置思路

    在默認(rèn)設(shè)置下,MySQL使用異步復(fù)制,主庫發(fā)送binlog后不等待從庫確認(rèn),可能導(dǎo)致數(shù)據(jù)不一致或丟失,半同步復(fù)制則在主庫更新數(shù)據(jù)后先等待從庫確認(rèn)同步完成,本文給大家介紹MYSQL半同步配置,感興趣的朋友一起看看吧
    2023-09-09
  • MySQL學(xué)習(xí)筆記之創(chuàng)建、刪除、修改表的方法

    MySQL學(xué)習(xí)筆記之創(chuàng)建、刪除、修改表的方法

    這篇文章主要介紹了MySQL學(xué)習(xí)筆記之創(chuàng)建、刪除、修改表的方法,結(jié)合實例分析了mysql創(chuàng)建表、增加,修改及刪除列、查看表結(jié)構(gòu)、刪除表等基本語法與使用技巧,需要的朋友可以參考下
    2016-09-09
  • mysql?樂觀鎖和悲觀鎖的具體使用

    mysql?樂觀鎖和悲觀鎖的具體使用

    本文主要介紹了mysql?樂觀鎖和悲觀鎖的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

灵石县| 文登市| 安溪县| 出国| 长泰县| 广宗县| 兴义市| 万安县| 岱山县| 邵阳市| 南郑县| 襄城县| 巴南区| 峨山| 乌什县| 兴山县| 娄底市| 凤阳县| 安图县| 保康县| 肇东市| 潼关县| 临武县| 义马市| 陆河县| 射阳县| 萍乡市| 南川市| 长汀县| 金坛市| 镇赉县| 内丘县| 昌黎县| 阜宁县| 全南县| 石泉县| 曲靖市| 宽甸| 木兰县| 丰台区| 绿春县|