精华内容
下载资源
问答
  • remove mysql
    千次阅读
    2021-03-04 00:05:31

    删除 mysql

    sudo apt-get autoremove --purge mysql-server-5.0

    sudo apt-get remove mysql-server

    sudo apt-get autoremove mysql-server

    sudo apt-get remove mysql-common //这个很重要

    上面的其实有一些是多余的。

    清理残留数据

    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

    安装 mysql

    sudo apt-get install mysql-server

    sudo apt-get install mysql-client

    sudo apt-get install php5-mysql

    // 安装php5-mysql 是将php和mysql连接起来

    一旦安装完成,MySQL 服务器应该自动启动。您可以在终端提示符后运行以下命令来检查 MySQL 服务器是否正在运行:

    sudo netstat -tap | grep mysql

    当您运行该命令时,您可以看到类似下面的行:

    tcp 0 0 localhost.localdomain:mysql *:* LISTEN -

    如果服务器不能正常运行,您可以通过下列命令启动它:

    sudo /etc/init.d/mysql restart

    进入mysql

    $mysql -uroot -p 管理员密码

    配置 MySQL 的管理员密码:

    sudo mysqladmin -u root password newpassword

    更多相关内容
  • 代码如下:Array.prototype.remove = function(b) { var a = this.indexOf(b); if (a >= 0) { this.splice(a, 1); return true; } return false; }; 以后使用过程中,就可以直接利用这个函数,删除数组中的值了。
  • 其他编译器的java项目导入idea时,经常出现非法字符: \65279 ,通常直接remove BOM,操作即可。但是有时非常顽固不生效。配合我的这个说明,用这个jar包,配置好了后,然后在重新remove BOM。(个人实验的是win64...
  • 主要给大家介绍了关于Java中ArrayList的removeAll方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。
  • remove()方法从列表中删除第一个obj。 语法 以下是remove()方法的语法: list.remove(obj) 参数 obj — 这是可以从列表中移除该对象 返回值 此方法不返回任何值,但从列表中删除给定的对象 例子 下面的例子显示了...
  • 下面小编就为大家带来一篇浅谈java Iterator.remove()方法的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了java集合迭代器Iterator中的remove陷阱,需要的朋友可以参考下
  • 但是视频上面的水印会一直播放,每一秒的视频都会附加水印,所以删除一个点是没有用的,这款Remove Logo Now可以完美的解决视频水印,可以一次性删除视频每一帧的水印广告,并且软件已经破解,需要的朋友可以下载...
  • 主要介绍了PowerShell使用Remove-Item命令删除文件、注册表项介绍,另外Remove-Item的别名也有很多,需要的朋友可以参考下
  • 主要介绍了ArrayList在for循环中使用remove方法移除元素的内容,介绍了具体代码实现,需要的朋友可以参考下。
  • Easy remove - Autodesk系列软件卸载工具 3.2.0.8.7z
  • Easy remove - Autodesk系列软件卸载工具 3.2.0.4.7z
  • rust-remove_dir_all:https

    2021-03-20 04:00:44
    remove_dir_all 描述 可靠和快速的目录删除功能。 remove_dir_all在非Windows系统上,这是std::fs::remove_dir_all的重新导出。对于Windows,该方法可处理在快速删除目录树时发生的目录锁定。 remove_dir_contents...
  • RemoveLogoNow中文版

    热门讨论 2015-08-29 10:45:27
    虽然是没有妨碍观看视频,但是还是感觉有点碍眼的,尤其是想下载了收藏那种,不过我们也可以使 用一些软件来对视频的LOGO水印进行去除,专业的视频LOGO去除软件——Remove Logo from Video,它可以轻松帮你去除视频...
  • array-removeAt 从特定位置删除项目。 安装 $ npm install --save array-removeat 用法 var removeAt = require ( 'array-removeat' ) ; removeAt ( [ 1 , 2 , 3 ] , 1 ) ; // => [1, 3] 原料药 removeAt(array...
  • var remove = require ( 'dom-remove' ) ; var el = document . querySelector ( '#elmt' ) remove ( el ) ; var els = Array . prototype . slice . call ( document . querySelectorAll ( 'div' ) ) ; remove ( ...
  • remove controls on prices 取消限价 remove control panel 移动式控制台 remove difficulties 克服困难 remove dish 把盘子拿走 remove fear 消除恐惧 remove flaw 清除缺陷 remove furniture 搬走家具 ...

    remove

    v.  [rɪ'muːv] ( removes; removed; removing )

    双解释义

    vt. 移走; 排除   take away from a place or take to another place; get rid of

    vi. 迁移; 移居   go to live or work in another place

    vt. 开除   dismiss

    基本要点  

    1.remove的基本意思是“移走”,指人或事物自行或被外力从原来的或正常的场所、位置或职业上移开,前往新的或临时的场所、位置或职业,引申可表示“排除”某障碍,“移居”“开除”,有时还可指“脱掉”帽、衣、鞋等。

    2.remove既可用作不及物动词,也可用作及物动词。用作及物动词时,接名词或代词作宾语; 用作不及物动词时,常与to或into连用,表示“搬到”“搬进”某地; 与from连用表示“从…移走〔除掉〕”。remove用作不及物动词时主动形式常含有被动意义。

    词汇搭配  

    ~+名词

    remove a causes of disease  消除疾病的根源

    remove an error  消除差错

    remove a lid  揭开盖子

    remove a name  除名

    remove a tumour  切除肿瘤

    remove bandages  解掉绷带

    remove brush  清理毛刷

    remove controls on prices  取消限价

    remove control panel  移动式控制台

    remove difficulties  克服困难

    remove dish  把盘子拿走

    remove fear  消除恐惧

    remove flaw  清除缺陷

    remove furniture  搬走家具

    remove graffiti  清除乱涂乱画的痕迹

    remove grease  去掉油迹

    remove heat  去除热量,放热

    remove misgiving  消除疑虑

    remove mountains  移山

    remove objections  消除反对意见

    remove pain  去痛

    remove pictures  把画取下

    remove problem  解决问题

    remove rubbish  清除垃圾

    remove sb's coat  脱上衣

    remove sb's doubts  消除疑虑

    remove sb's gloves  脱掉手套

    remove sb's hand  移走某人的手

    remove sb's hat  脱帽

    remove sb's shoes  脱鞋

    remove stains  清除污迹

    remove superfluous hair  剪去多余的头发

    remove suspicion  消除怀疑

    remove the causes of war  消除战争的根源

    remove the dirt  去掉灰尘

    remove troop  调动军队

    remove unpleasant impression  消除不良印象

    ~+副词

    remove cautiously  小心地移开

    remove clumsily  笨重地移动

    remove dexterously  熟练地移动

    remove easily  容易移开

    remove forcefully  有力地移动

    remove forcibly  强行移走

    remove promptly  迅速地拿走

    remove quietly  悄悄地移走

    remove skillfully  巧妙地排除

    remove slyly  巧妙地排除

    remove suddenly  突然开除

    remove surreptitiously  偷偷地排除

    remove swiftly  迅速地移开

    remove temporarily  暂时地移走

    remove out  移〔搬〕出

    ~+介词

    remove from  从…中移开〔拿走〕,将(某人)撤〔免〕职

    remove from a military base  撤出军事基地

    remove a student from a university  将一学生开除出大学

    remove sb from office  把某人撤职

    remove sb from school  把某人开出学校

    remove sb's hand from sb's shoulder  把手从某人的肩上移开

    remove into  搬进〔到〕

    remove into a new house  搬进新房子

    remove into the country  搬到乡下去

    remove to(把…)  迁移到,搬到,把(军队)调往

    remove to a hospital  送到医院

    remove soldiers to the front  调兵上前线

    常用短语  

    remove from(v.+prep.)

    1.从…中移开〔拿走、除掉〕 take sth away from sth; get rid of sth unwanted from sth

    ▲remove from sthThey have removed from this town.他们已迁离此城。

    ▲remove sb/sth from sthThey removed their weapons from the gun racks.他们从枪架上收走了枪。

    He removed his hand from the man's collar.他挪开抓住那人衣领的手。

    Please remove the cloth from the table.请把桌子上的桌布拿掉。

    Imes removed his greatcoat from the cloakroom.艾姆斯从衣帽间取出他的大衣。

    Please remove your bag from the seat so that I can sit down.请把你的包从座位上拿开好让我坐下来。

    She removed mud from her shoes.她擦去了鞋上的泥浆。

    How can I remove the stains from my coat? 我上衣上的墨迹怎样才能去掉?

    They had to remove the ashes from the burner first.他们得先把炉内的灰清除掉。

    This mixture can remove stains from metal and china.这种混合剂能去除金属和瓷器上的污迹。

    Remove my name from your mailing list.请把我的名字从你们的邮寄名单上去掉。

    They used the method of removing the burning brands from under the boiling cauldron.他们使用了釜底抽薪的办法。

    Nothing can remove him from the memory of his people.什么也不能把他从人民的记忆中抹掉。

    Reference books must not be removed from the reading room.参考书不得从阅览室拿走。

    ◇ 用于be ~ed结构

    The boy is removed from school.这个男孩被学校开除了。

    The rioters were forcibly removed from the plaza.暴徒们被强行驱逐出广场。

    He will probably be removed from the list of candidates for these bodies.他的名字可能会从这些团体的候选人名单中去掉。

    2.将(某人)撤〔免〕职 dismiss sb from a position, usually of responsibility

    ▲remove sb from sthThey removed him from his position.他们撤销了他的职务。

    ◇ 用于be ~ed结构

    The corrupt official was removed from office.那个贪官被免职了。

    He was suddenly removed from command.他突然被免去指挥权。

    remove into(v.+prep.)

    搬进〔到〕 move into some place

    ▲remove into sthWe are going to remove into a new house.我们将要搬到一栋新房子里去。

    ▲remove sth into sth

    ◇ 用于be ~ed结构

    The body will be removed into one of the cold storage chambers.尸体将被移到一个冷冻间里。

    remove out(v.+adv.)

    移〔搬〕出 take sth out

    ▲remove sth out (of sth)

    They removed the pump out of the room.他们将这台泵从室内搬出。

    remove to(v.+prep.)

    1.(把…)迁移到,搬到 take sth to some place

    ▲remove to sth

    They have decided to remove to a warm climate.他们已决定搬到一个气候温暖的地方居住。

    I am going to remove to a new house.我将搬到一栋新房子里去。

    ▲remove sth to sth

    He removed his desk to another office.他把自己的写字台搬到另一间办公室。

    ▲remove from sth to sth

    They removed from Xidan to the western suburbs last year.去年他们从西单搬到西郊。

    They removed from the city to the countryside.他们从城市迁到了农村。

    2.把…调往 dispatch sth to some place

    ▲remove sth to sth

    The general has removed the troop to the front.将军已把这支部队调往前线。

    句型例句  

    用作不及物动词

    ▲S+~(+A)

    Our office has removed.我们的机关迁址了。

    用作及物动词

    ▲S+~+n./pron.

    Let me remove the milk jug.我来把牛奶缸子拿开。

    They removed royal jelly for medicinal use.他们把蜂王浆取出用作药品。

    They all came to help remove the stones.他们都来帮忙搬石头。

    The tea-ladies came in to remove the cups.端茶小姐进来端走了茶杯。

    Let's remove the obstacles.咱们来把这些障碍撤掉。

    Bleach removes colour.漂白剂可以去掉颜色。

    Milk is put through a clarifier to remove any foreign matters.牛奶要经过一个澄清器来除去杂质。

    The traveller removed his wet coat.旅行者脱掉了身上的湿外衣。

    People remove their hats in a theatre.人们在影剧院里要脱帽。

    He removed all traces of having been there.他抹去了他曾到过那里的所有痕迹。

    He removed all the evidence of his crime.他销毁了他犯罪的全部证据。

    I am going to do all I can to remove the unpleasant impression you have of me.我要尽力消除你对我的不良印象。

    Completion of this work will remove the threat of drought and waterlogging.完成了这项工程,将消除旱涝威胁。

    ◇ 用于be ~ed结构

    The threat of redundancy was suddenly removed.裁员的威胁顿时消除了。

    Hidden boulders have been removed by dynamiting.暗礁都用炸药炸掉了。

    He was later removed by the board of directors.后来他被董事会撤职了。

    其他

    ▲v-ed as o-Compl.

    Doctors advised me to have it removed.大夫都劝我把它割掉。

    The accident victim had to have his leg removed.事故的受害者不得不截去一条腿。

    词语辨异  

    remove, alienate, divert, divorce

    这四个词的共同意思是“脱离”。其区别是:remove强调所处位置上的“脱离”,常用于指脱离生产、实际等; divert原意指方向上的“改变”,引申表示“转移”某人的注意力等; alienate和divorce的意思相同,用于指和经常在一起的人或物相“脱离”,如脱离人民、群众等。例如:

    By adopting this policy, they risk alienating many of their supporters.他们采取这个政策,就要冒着同许多支持者疏远的风险。

    The outbreak of the North war has diverted public attention away from other national problems.北方战事的爆发已把公众的注意力从其他全国性问题上转移开来。

    It is difficult to divorce politics from sport.把政治与体育完全分开是很难的。

    remove, move, shift, transfer

    参见move条。

    正误解析  

    1980年,我们全家搬到那里。

    [误]  Our family was removed there in 1980.

    [正]  Our family removed there in 1980.

    [正]  Our family moved there in 1980.

    [析]  remove作“搬家”解时为不及物动词,无被动语态。用于搬家时, move比remove常用。

    补充资料  

    [同义词]   carry, convey, dislodge, displace, eliminate, move, take away, take off, transfer

    [词源]  <拉丁语removere(远离)

    展开全文
  • RemoveElement算法Demo

    2017-08-21 10:51:11
    RemoveElement算法Demo
  • 没想到C++中的std::remove_if()函数历史还挺悠久

    千次阅读 多人点赞 2020-03-21 12:13:31
    为什么要查单词的 remove 的意思,当然是被它坑过了,本来想从 `std::vector<T>` 中删除指定的元素,考虑到迭代器失效的问题,放弃了循环遍历的复杂处理,选择直接使用算法函数 `std::remove_if()`来进行删除,之前...

    前言

    看到 remove 这个单词的第一反应是什么意思?我的第一感觉是删除、去掉的意思,就像一个程序员看到 string 就会说是字符串,而不会说它是线、或者细绳的意思,可是C++里居然有个函数叫 std::remove(),调用完这个函数什么也没删除,这我就奇怪了,打开有道词典查询一下:

    不查不要紧,一查吓一跳,以下是词典给出的三个释义:

    • vt. 移动,迁移;开除;调动
    • vi. 移动,迁移;搬家
    • n. 移动;距离;搬家

    及物动词、不及物动词、名词给出的含义都是移动,只有一个开除的意思和删除有点像,难道我穿越了?我之前一直以为它是删除的意思啊,很多函数还是用它命名的呢!

    赶紧翻翻其他的字典,给高中的英语老师打个电话问问,最终还是在一些释义中找到了删除的意思,还有一些用作删除的例句,有趣的是在有道词典上,所有的单词解释都和移动有关,所有的例句都是和删除有关。

    remove_if的历史

    为什么要查单词的 remove 的意思,当然是被它坑过了,本来想从 std::vector<T> 中删除指定的元素,考虑到迭代器失效的问题,放弃了循环遍历的复杂处理,选择直接使用算法函数 std::remove_if()来进行删除,之前对于 std::remove()std::remove_if() 有过简单的了解,不过记忆还是出现了偏差。

    一直记得 std::remove() 函数调用之后需要再使用 erase() 函数处理下,忘记了 std::remove_if() 函数也要做相同的处理,于是在出现问题的时候一度怀疑这个函数的功能发生了变更,开始找这个函数历史迭代的版本,这里推荐一个网站 C++标准函数查询 - std::remove_if(),用来查询函数的定义、所在头文件和使用方法非常方便。

    文档中有这样两句:

    1. Removes all elements that are equal to value, using operator== to compare them.
    2. Removes all elements for which predicate p returns true.

    解释函数作用时用到的单词都是 remove ,你说神不神奇,这里应该都是取的移动的意思。

    这两句话对应的函数声明应该是:

    template< class ForwardIt, class T >
    ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );        // (until C++20)
    
    template< class ForwardIt, class UnaryPredicate >
    ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );   // (until C++20)
    

    这两个函数后面都有相同的说明—— (until C++20) ,意思大概就是说这两个函数一直到 C++20 版本都存在,在我的印象中 std::remove_if() 函数比较新,最起码得比 std::remove() 函数年轻几岁,可是他们到底是哪个版本添加到c++标准的的呢?中途的功能有没有发生变更,继续回忆!

    第一次看到这两个函数应该是在看《Effective STL》这本书的时候,大概是5年前了,正好这个本书就放在手边,赶紧翻目录查一下,打开对应章节发现其中确实提到了删除 std::vector<T> 中的元素时,在调用了这两个函数之后都需要再调用 erase() 函数对待删除的元素进行擦除。

    看看书的出版时间是2013年,难道是 C++11 的标准加上的,不对,看一下翻译者写得序,落款时间2003年,不能是 C++03 的标准吧?不过这是一本翻译书籍,再看看原作者 Scott Meyers 写的前言,落款时间2001年,好吧,看来这两个函数肯定在 C++98的版本中就已经存在了,我有点惊呆了,这确实颠覆了我的记忆和认知。

    造成这种认知错误主要有两方面原因,第一方面就是受到了开发环境的限制,从一开始学习的时候Turob C 2.0VC++ 6.0VS2005VS2008VS2010就很少接触 C++11 的知识,Dev-C++Code::Blocks 也是在特定的情况下使用,没有过多的研究,结果在刚开始工作的时候开发工具居然是VS2003,这个版本我之前都没听说过,还好一步步升级到了08、13、17版本。

    第二方面就是这两个函数常常与 Lambda 表达式,auto 关键字一起用,这都是 C++11 里才有的,让人感觉好像这个 std::remove_if() 函数也是 C++11 版本中的内容,造成了错觉。总来说还是用的少,不熟悉,以后多看多练就好了。

    remove_if的实现

    要想更深入的学习 std::remove_if() 函数, 那这个函数实现的细节有必要了解一下,这有助于我们理解函数的使用方法,下面给出两个版本可能的实现方式,也许下面的实现与你查到的不一样,但是思想是相通的,有些实现细节中使用了 std::find_if() 函数,这里没有列举这个版本,下面这两个版本的代码更容易让人明白,它究竟做了哪些事情。

    // C++98 版本
    template <class ForwardIterator, class UnaryPredicate>
        ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                                 UnaryPredicate pred)
    {
        ForwardIterator result = first;
        while (first!=last) {
            if (!pred(*first)) {
                *result = *first;
                ++result;
            }
            ++first;
        }
        return result;
    }
    
    // C++11     版本
    template <class ForwardIterator, class UnaryPredicate>
        ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                                 UnaryPredicate pred)
    {
        ForwardIterator result = first;
        while (first!=last) {
            if (!pred(*first)) {
                *result = std::move(*first);
                ++result;
            }
            ++first;
        }
        return result;
    }
    

    对比两段代码有没有发现区别——只改了半行代码,将赋值语句中的 *firstC++11 版本中替换成了 std::move(*first),这只能发生在 C++11 之后,因为 std::move() 函数是 C++11 才加入的。

    这代码乍一看挺唬人的,其实仔细分析一下还挺简单的,只是这些符号看起来有些生疏,其实可以把 ForwardIterator 看成一个指针类型,UnaryPredicate 是一个函数类型,我们改写一下:

    int* remove_if (int* first, int* last, func_type func)
    {
        int* result = first;
        for (;first!=last;++first)
        {
            if (!func(*first))
            {
                *result = *first;
                ++result;
            }
        }
        return result;
    }
    

    这代码是不是就比较接地气了,想想一下,一个是包含10个元素的数组,让你删除其中的偶数怎么做?其实就是遍历一遍数组,从开始位置到结束位置逐个判断,如果不是偶数就不进行操作,如果是偶数就把当前的偶数向前移动到结果指针上就好了,结果指针向后移动准备接受下一个奇数,这个判断是不是偶数的函数就是上面代码中的 func()

    最后结果指针 result 停在有效元素后面一个位置上,这个位置到结尾指针 last 的位置上的元素都应该被删除,这就是为什么常常将 std::remove_if() 函数的返回值作为 erase() 函数的第一个参数,而将 last 指针作为 erase() 函数的第二个参数,实际作用就是将这些位置上的元素擦除,从头擦到尾,达到真正删除的目的。

    具体使用

    说了这么多,接下来看看具体怎么用,我们将 std::remove_if() 函数和 erase() 函数分开使用,主要看一下调用 std::remove_if() 函数之后的 vector 中元素的值是怎么变的。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    bool isEven(int n) // 是否是偶数
    {
        return n % 2 == 0;
    }
    
    int main()
    {
        std::vector<int> vecTest;
        for (int i = 0; i < 10; ++i)
            vecTest.push_back(i);
    
        for (int i = 0; i < vecTest.size(); ++i)
            std::cout << vecTest[i] << " ";
        std::cout << std::endl;
    
        // 移动元素
        std::vector<int>::iterator itor = std::remove_if(vecTest.begin(), vecTest.end(), isEven);
    
        // 查看移动后的变化
        for (int i = 0; i < vecTest.size(); ++i)
            std::cout << vecTest[i] << " ";
        std::cout << std::endl;
    
        // 删除元素
        vecTest.erase(itor, vecTest.end());
    
        for (int i = 0; i < vecTest.size(); ++i)
            std::cout << vecTest[i] << " ";
    
        return 0;
    }
    

    运行结果为:

    0 1 2 3 4 5 6 7 8 9
    1 3 5 7 9 5 6 7 8 9
    1 3 5 7 9

    从结果可以看出,第二步调用 std::remove_if() 函数之后,vector 中的元素个数并没有减少,只是将后面不需要删除的元素移动到了 vector 的前面,从第二行结果来看,调用 std::remove_if() 函数之后返回的结果 itor 指向5,所以擦除从5所在位置到结尾的元素就达到了我们的目的。

    这段代码在 C++98C++11C++14 环境下都可以编译运行,在这里推荐一个在线编译器 C++ Shell,可以测试各个版本编译器下运行结果,界面简洁明了,方便测试。

    上面的代码其实写得有些啰嗦,如果使用 C++11 语法之后,可以简写为:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main()
    {
        std::vector<int> vecTest{0, 1, 2, 3, 4, 5, 6, 7 ,8, 9};
    
        std::for_each(vecTest.begin(), vecTest.end(), [](int n){ std::cout << n << " "; });
        std::cout << std::endl;
    
        // 移动后删除元素
        vecTest.erase(std::remove_if(vecTest.begin(), vecTest.end(),
            [](int n){ return n % 2 == 0; }), vecTest.end());
    
        std::for_each(vecTest.begin(), vecTest.end(), [](int n){ std::cout << n << " "; });
    
        return 0;
    }
    

    运行结果:

    0 1 2 3 4 5 6 7 8 9
    1 3 5 7 9

    总结

    1. 对于模糊的知识要花时间复习,避免临时用到的时候手忙脚乱出问题
    2. 对于一些心存疑虑的函数可以看一下具体的实现,知道实现的细节可以让我们更加清楚程序都做了哪些事情
    3. 对于新的技术标准可以不精通,但是必须花一些时间进行了解,比如新的 C++ 标准
    4. 对于违反常识的代码,先不要否定,即使在你的运行环境中报错,说不定人家是新语法呢?
    5. 曾经看到一段在类的定义时初始化非静态变量的代码,一度认为编译不过,但后来发现在 C++11 中运行的很好
    展开全文
  • 面试 - 为什么foreach中不允许对元素进行add和remove

    万次阅读 多人点赞 2021-10-25 16:04:19
    我们先来看看使用foreach遍历ArrayList过程中使用add 和 remove 会出现什么样子的结果,然后再分析一下。 public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for ...

    1、foreach遍历ArrayList过程中使用 add 和 remove

    我们先来看看使用foreach遍历ArrayList过程中使用 add 和 remove 会出现什么样子的结果,然后再分析一下。

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list.add(i);
        }
        for (Integer j : list) {
            if (j.equals(3)) {
                list.remove(3);
            }
            System.out.println(j);
        }
    }

    运行结果:

    0
    1
    2
    3
    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
    	at java.util.ArrayList$Itr.next(ArrayList.java:861)
    	at test.Test.main(Test.java:12)

    结果是出现了ConcurrentModificationException 异常,追踪下抛出异常的位置(ArrayList.java:911)

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }

    这个地方告诉我们如果 modCount 不等于 expectedModCount 的时候,就会抛出这个异常信息,那么这两个参数都代表了什么东西呢?为什么不相等的时候,就会出现异常呢?

    2、追根溯源

    2.1、modCount是什么?

    这时候就要让我们去看源码了,在我们点到这个变量的时候,就会有注释告诉我们了 modCount 是 AbstractList 类中的一个成员变量,该值表示对List的修改次数。

    这时候我们来看看 remove 方法中是否对这个变量进行了增减。

    大家可以看到,在 remove 的方法中,实际上只是对 modCount 进行了++,那 expectedModCount 又是个什么东西呢?

    2.2、expectedModCount 是什么?

    expectedModCount 是 ArrayList 中的一个内部类——Itr中的成员变量,我们来看下怎么又扯出个内部类Itr。

    通过反编译可以发现foreach编译后内部是使用迭代器实现的。

     迭代器是通过list.iterator()实例化的,list.iterator()就返回了一个内部类Itr的对象,从源码中可以看到Itr实现了Iterator接口,同时声明了expectedModCount这个成员变量, expectedModCount 表示对ArrayList修改次数的期望值,它的初始值为 modCount。

    2.3、熟悉的checkForComodification方法

    从源码可以看到这个类的next和remove方法里面都调用了一个checkForComodification方法,看到checkForComodification是不是很熟悉,这不就是异常的抛出位置吗。

    checkForComodification方法是通过判断modCount和expectedModCount是否相等来决定是否抛出并发修改异常。

    2.4、流程回顾

    通过查看编译后的class文件,可以看出大致流程如下:当j为3时,调用了remove方法,remove方法中修改了modCount值,然后再输出j值,再进入下一次循环,此时hasNext为true,进入循环体第一行代码,调用next方法,next方法再调用checkForComodification方法,然后发现expectedModCount和modCount不一致,最终抛出ConcurrentModificationException 异常。

     也就是说,expectedModCount 初始化为 modCount 了,但是后面 expectedModCount 没有修改,而在 remove 和 add 的过程中修改了modCount ,这就导致了执行的时候,通过 checkForComodification 方法来判断两个值是否相等,如果相等了,那么没问题,如果不相等,那就给你抛出一个异常来。

    而这也就是我们通俗说起来的 fail-fast 机制,也就是快速检测失败机制。

    3、避免fail-fast 机制

    3.1、使用listIterator或iterator

    fail-fast 机制也是可以避免的,比如再拿出来我们上面的代码

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(i);
        }
    
        System.out.println("没有删除元素前"+list.toString());
        // 迭代器使用listIterator和iterator均可
        ListIterator<Integer> listIterator = list.listIterator();
        while(listIterator.hasNext()){
            Integer integer = listIterator.next();
            if(integer==3){
                listIterator.remove();
                listIterator.add(9);
            }
        }
        System.out.println("删除元素后"+list.toString());
    }

     这样的话,你就发现是可以运行的,也是没有问题的,我们看运行结果:

    没有删除元素前[0, 1, 2, 3, 4]
    删除元素后[0, 1, 2, 9, 4]

     结果也是显而易见的,我们实现了在 foreach 中进行 add 和 remove 的操作.

    这里有个注意点,迭代器使用listIterator和iterator均可,看源码可以知道 listIterator其实使用的ListItr内部类,ListItr是继承了Itr类的,同时自己封了一些方法,例如add,hasPrevious,previous等等。所以代码中的remove方法是Itr类的,add方法是ListItr类的

     listIterator和iterator区别:

    1. 使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
    2. ListIterator有add方法,可以向List中添加对象,而Iterator不能。
    3. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
    4. ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
    5. 都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

    3.2、使用CopyOnWriteArrayList

    CopyOnWriteArrayList 这个类也是能解决 fail-fast 的问题的,我们来试一下:

    public static void main(String[] args) {
        CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(i);
        }
        System.out.println("没有删除元素前"+list.toString());
        for (Integer integer : list) {
            if(integer.equals(3)){
                list.remove(3);
                list.add(9);
            }
        }
        System.out.println("删除元素后"+list.toString());
    }

     运行结果:

    没有删除元素前[0, 1, 2, 3, 4]
    删除元素后[0, 1, 2, 4, 9]

    CopyOnWriteArrayList实现了对这个元素中间进行移除添加的操作,那么他的内部源码是怎么实现的,实际上很简单,复制

    也就是他创建一个新的数组,再将旧的数组复制到新的数组上,但是为什么很少有人推荐这种做法,根本原因还是 复制

    因为你使用了复制,那么就一定会出现有两个存储相同内容的空间,这样消耗了空间,最后进行 GC 的时候,那是不是也需要一些时间去清理他,所以个人不是很推荐,但是写出来的必要还是有的。

    3.2.1、CopyOnWriteArrayList的add方法

    public boolean add(E e) {
        // 可重入锁
        final ReentrantLock lock = this.lock;
        // 获取锁
        lock.lock();
        try {
            // 元素数组
            Object[] elements = getArray();
            // 数组长度
            int len = elements.length;
            // 复制数组
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            // 存放元素e
            newElements[len] = e;
            // 设置数组
            setArray(newElements);
            return true;
        } finally {
            // 释放锁
            lock.unlock();
        }
    }
    

    处理流程如下:

    • 获取锁(保证多线程的安全访问),获取当前的Object数组,获取Object数组的长度为length,进入步骤②。

    • 根据Object数组复制一个长度为length+1的Object数组为newElements(此时,newElements[length]为null),进入下一步骤。

    • 将下标为length的数组元素newElements[length]设置为元素e,再设置当前Object[]为newElements,释放锁,返回。这样就完成了元素的添加。

    3.2.2、CopyOnWriteArrayList的remove方法

    public E remove(int index) {
        // 可重入锁
        final ReentrantLock lock = this.lock;
        // 获取锁
        lock.lock();
        try {
            // 获取数组
            Object[] elements = getArray();
            // 数组长度
            int len = elements.length;
            // 获取旧值
            E oldValue = get(elements, index);
            // 需要移动的元素个数
            int numMoved = len - index - 1;
            if (numMoved == 0) // 移动个数为0
                // 复制后设置数组
                setArray(Arrays.copyOf(elements, len - 1));
            else { // 移动个数不为0
                // 新生数组
                Object[] newElements = new Object[len - 1];
                // 复制index索引之前的元素
                System.arraycopy(elements, 0, newElements, 0, index);
                // 复制index索引之后的元素
                System.arraycopy(elements, index + 1, newElements, index,
                                    numMoved);
                // 设置索引
                setArray(newElements);
            }
            // 返回旧值
            return oldValue;
        } finally {
            // 释放锁
            lock.unlock();
        }
    }
    

    处理流程如下:

    1. 获取锁,获取数组elements,数组长度为length,获取索引的值elements[index],计算需要移动的元素个数(length - index - 1),若个数为0,则表示移除的是数组的最后一个元素,复制elements数组,复制长度为length-1,然后设置数组,进入步骤③;否则,进入步骤②
    2. 先复制index索引前的元素,再复制index索引后的元素,然后设置数组。
    3. 释放锁,返回旧值。

    注意

    CopyOnWriteArrayList解决 fail-fast 的问题不是通过迭代器来remove或add元素的,而是通过list本身的remove和add方法,所以add的元素位置也不一样,迭代器是当前位置后面一个,CopyOnWriteArrayList是直接放到最后。

    有想法的同学可以看看CopyOnWriteArrayList的listIterator和iterator,其实是一样的,都是返回的COWIterator内部类。

     在COWIterator内部类中是不支持remove、set、add操作的,至少我使用的jdk1.8是不支持,会直接抛出UnsupportedOperationException异常:

     先写到这儿,后面有空再补充。

    展开全文
  • List.removeAll() 方法的性能效率
  • list.remove返回值

    千次阅读 2021-02-28 08:00:23
    [解析] ListCount属性返回列表框中列表项的个数,列表项的索引号从0开始,所以要... ListCount - 1,故......list1 = [1,2,3,4,5,6] for i in list1: if i == 2: list1.remove(i) print(i) print(list1) 结果: 1 2 4 ...
  • remove()是C语言中的函数,一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。函数功能remove()函数用于删除指定的文件,其原型如下:int remove(char *filename);函数声明2:template...
  • USB设备管理USB Safely Remove(内含注册码) xp sp3深度6.2版实测可用。
  • HashSet集合中remove()方法分析

    千次阅读 2019-05-11 16:09:17
    最近学习了集合的相关知识,先后学习了三种接口的实现类创建的集合的遍历,尝试写了在ArryList实现增删改查的代码,也学习了ArryList类中的remove(),contains()方法; HashSet类中的add()方法。 在使用HashSet类创建...
  • linux下remove函数

    2021-05-13 08:12:10
    remove(删除文件)相关函数 link,rename,unlink表头文件 #include定义函数 int remove(const char * pathname);函数说明 remove()会删除参数pathname指定的文件。如果参数pathname为一文件,则调用unlink()处理,若...
  • Java List remove() method is used to remove elements from the list. ArrayList is the most widely used implementation of the List interface, so the examples here will use ArrayList remove() methods. Ja...
  • java集合中,list列表应该是我们最常使用的,它有两种常见的实现类:ArrayList和LinkedList。...虽然ArrayList类已经提供了remove方法,不过其中有潜在的坑,下面将介绍remove方法的三种错误用法以及六...
  • Python 列表中remove()

    2022-03-14 21:51:19
    remove()函数用于移除列表中某个值的第一个匹配项。 二、语法 list.remove(obj) 参数:obj – 列表中要移除的对象。 返回值:该方法没有返回值但是会移除列表中的某个值的第一个匹配项。 三、实例 aList = [123, ...
  • List remove 使用

    千次阅读 2019-08-20 19:55:44
    今天在工作的时候遇到了个深坑,List.remove,通过百度,以及自己思考终于发现了这个坑!看看下面所写 import java.util.ArrayList; import java.util.List; public class ListTest { public static void ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,857,368
精华内容 742,947
关键字:

remove

友情链接: vbs_script.zip