欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

點(diǎn)贊功能使用MySQL還是Redis

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

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

1. 新手常犯的錯(cuò)誤

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

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);
}

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

platformList.remove(platform);

modCount的值就被修改成了4。

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

既然不能使用foreach來實(shí)現(xiàn),那么我們?cè)撊绾螌?shí)現(xiàn)呢?

主要有以下3種方法:

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

接下來一一講解。

2. 使用Iterator的remove()方法

使用Iterator的remove()方法的實(shí)現(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();就可以呢?讓我們看下它的源碼:

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

使用for循環(huán)正序遍歷的實(shí)現(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);
}

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

i = i - 1;

為什么要修正下標(biāo)的值呢?因?yàn)閯傞_始元素的下標(biāo)是這樣的:

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

使用for循環(huán)倒序遍歷的實(shí)現(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);
}

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

既然不能使用foreach來實(shí)現(xiàn),那么我們?cè)撊绾螌?shí)現(xiàn)呢?

主要有以下3種方法:

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

接下來一一講解。

5. 使用Iterator的remove()方法

使用Iterator的remove()方法的實(shí)現(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();就可以呢?讓我們看下它的源碼:

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

使用for循環(huán)正序遍歷的實(shí)現(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);
}

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

i = i - 1;

為什么要修正下標(biāo)的值呢?因?yàn)閯傞_始元素的下標(biāo)是這樣的:

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

使用for循環(huán)倒序遍歷的實(shí)現(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);
}

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

點(diǎn)贊功能:用 MySQL 還是 Redis?

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

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

相關(guān)文章

  • MySQL存儲(chǔ)數(shù)據(jù)亂碼的問題解析

    MySQL存儲(chǔ)數(shù)據(jù)亂碼的問題解析

    這篇文章主要介紹了MySQL存儲(chǔ)數(shù)據(jù)亂碼的問題解析,作者從實(shí)際使用中的多個(gè)方面定位其原因然后解決,需要的朋友可以參考下
    2015-05-05
  • mysql 8.0.17 安裝圖文教程

    mysql 8.0.17 安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.17 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • mysql?字段括號(hào)拼接的實(shí)現(xiàn)示例

    mysql?字段括號(hào)拼接的實(shí)現(xiàn)示例

    在使用MySQL進(jìn)行數(shù)據(jù)查詢時(shí),有時(shí)候需要對(duì)字段進(jìn)行拼接,并用括號(hào)包圍起來,本文主要介紹了mysql?字段括號(hào)拼接的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Linux下Mysql5.7.19卸載方法

    Linux下Mysql5.7.19卸載方法

    在卸載mysql之前需要先查找下以前是否安裝過mysql,具體查找命令在本文有介紹,本文重點(diǎn)給大家介紹Linux下Mysql5.7.19卸載方法,需要的朋友參考下吧
    2017-08-08
  • mysql error 1130 hy000:Host''localhost''解決方案

    mysql error 1130 hy000:Host''localhost''解決方案

    本文將詳細(xì)提供mysql error 1130 hy000:Host'localhost'解決方案,需要的朋友可以參考下
    2012-11-11
  • Mysql實(shí)現(xiàn)null值排在最前/最后的方法示例

    Mysql實(shí)現(xiàn)null值排在最前/最后的方法示例

    這篇文章主要給大家介紹了關(guān)于Mysql實(shí)現(xiàn)null值排在最前/最后的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • MySQL鎖情況查看命令

    MySQL鎖情況查看命令

    本文主要介紹了MySQL鎖情況查看命令,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • windows環(huán)境下Mysql中文亂碼問題解決方法

    windows環(huán)境下Mysql中文亂碼問題解決方法

    在搭建Mysql環(huán)境的時(shí)候遇到了中文亂碼問題,下面與大家分享下具體的解決方法,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-06-06
  • mysql 5.7.11 winx64安裝配置方法圖文教程

    mysql 5.7.11 winx64安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql5.7.11 winx64安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-05-05
  • Mysql報(bào)錯(cuò)1292:Incorrect datetime value for column creat解決方案

    Mysql報(bào)錯(cuò)1292:Incorrect datetime value for 

    本文主要介紹了Mysql報(bào)錯(cuò)1292:Incorrect datetime value for column create_time at row 1 解決方案,1292 是指插入或更新操作時(shí),日期或時(shí)間值不正確引起的錯(cuò)誤,下面就來介紹一下
    2024-02-02

最新評(píng)論