<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>沉默王二</title>
    <description>本站为沉默王二的个人博客，内容涵盖有趣的Java后端技术，还有有益的程序人生。</description>
    <link>https://www.itwanger.com/</link>
    <atom:link href="https://www.itwanger.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 11 Oct 2022 00:48:52 +0000</pubDate>
    <lastBuildDate>Tue, 11 Oct 2022 00:48:52 +0000</lastBuildDate>
    <generator>Jekyll v3.9.2</generator>
    
      <item>
        <title>拿到贝壳转正意向书了！</title>
        <description>&lt;p&gt;大家好，我是二哥呀！&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;大家国庆节都过得好吗？&lt;/p&gt;

&lt;p&gt;一转眼，假期就结束了。如果是在外打工的读者，这时候，离家不舍的情感估计还没缓过来。&lt;/p&gt;

&lt;p&gt;当然了，最不舍的可能不是我们，而是父母，这一走，再见面时可能就到了过年的时候。别问我为什么知道，因为我当年就是这样。&lt;/p&gt;

&lt;p&gt;父亲先开着手扶式拖拉机送我到乡里。坐在车上的我，眼睛时不时会游离到车轱辘上，车轮每转动一圈，我心里的离愁就多一分，甚至能感觉到眼角在不争气地变得湿润。&lt;/p&gt;

&lt;p&gt;真希望父亲能开的慢一点啊，好想对他说，儿子并不着急赶车。但父亲心里知道，去晚一点，可能客车的座就没有了。从乡里到市里，客车就这么一趟，赶不上就麻烦了。&lt;/p&gt;

&lt;p&gt;到了市里，需要换乘火车南下。等到公司的宿舍，前后至少要两天两夜的时间，十分的不容易。&lt;/p&gt;

&lt;p&gt;这么多年过去了，&lt;strong&gt;外出打拼的场景，就好像躲在抽屉里的相册一样定格在记忆的深处，从来不曾忘却&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;最近新来了不少读者，我觉得，很有必要在这里重新介绍一下我自己了。&lt;/p&gt;

&lt;p&gt;我大学是在郑州上的，第一份工作是在苏州的一家外企，算是梦寐以求的那种。然后在 2014 年，也就是事业上升的黄金期，我却突然做出了一个大家可能觉得不可思议的决定：回三线城市洛阳。&lt;/p&gt;

&lt;p&gt;要知道，一个月前，我刚和公司签了一份新合同，为期三年，工资也涨了不少。&lt;/p&gt;

&lt;p&gt;三线城市的互联网环境，大家即便是没有亲身体会过，也会有所耳闻，和一线城市没法比，真没法比，就连和二线城市，差距也蛮大。不瞒大家，我回来后的很长一段时间里，工资只能拿到几千块。&lt;/p&gt;

&lt;p&gt;讲真，绝大多数的读者应该都会在工资上超出我一大截。&lt;/p&gt;

&lt;p&gt;那为什么我还会如此头铁呢？&lt;/p&gt;

&lt;p&gt;老读者应该都知道了，为了爱情，为了长跑多年的爱情。&lt;/p&gt;

&lt;p&gt;这个决定，即便是 8 年后的我看来，仍然是勇气十足。感觉自己就像《长津湖》这部电影里跑去找吴京的易烊千玺一样，帅气，特别的帅气。&lt;/p&gt;

&lt;p&gt;大家可能会觉得，回三线城市，肯定是躺平的节奏啊。&lt;/p&gt;

&lt;p&gt;但有一说一，二哥我仍然在“卖力”地卷呢。&lt;/p&gt;

&lt;p&gt;单从公众号的原创数量来说，就足足有 605 篇！这什么概念呢，从现在开始，一年 365 天不间断的日更，也要将近两年的时间。&lt;/p&gt;

&lt;p&gt;所以很多老读者都戏称二哥高产似那啥。。。&lt;/p&gt;

&lt;p&gt;这背后，我付出了多少努力，我自己心里门清，大家应该也都有目共睹。&lt;/p&gt;

&lt;p&gt;一开始，我就是在 CSDN 上瞎胡写，结果把自己写到了总榜 TOP 8，两届博客之星，虽然 CSDN 有很多问题，我就不展开说了，但若能混到我这个级别，也是颇为不易。&lt;/p&gt;

&lt;p&gt;那时候，输出的目的相当的纯粹，往大了说是热爱分享；往小了说，其实是为了每个月能多一百块钱不到的绩效奖。嗯，不用想了，这条绩效是二哥提的，哈哈哈哈，心机 boy 石锤了。当然了，关键是领导很认同，因为二哥作为团队中的精英，分量“举足轻重”。&lt;/p&gt;

&lt;p&gt;结果，没想到，万万没想到，领导都没能坚持下来的事，我硬是坚持了足足 8 年时间。&lt;/p&gt;

&lt;p&gt;更没想到的是，二哥那么纯粹的私心，竟然在无形当中帮助了很多很多的读者。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/10/beike-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这不，国庆节的前一天，读者阿 0 特意跑过来给我报喜，&lt;strong&gt;说自己成功拿到了贝壳和广联达的意向书&lt;/strong&gt;，没有意外的话，会选择贝壳，就等国庆后开奖了。&lt;/p&gt;

&lt;p&gt;贝壳和 BAT 这些互联网大厂比起来，肯定是有差距的，但考虑到我这个读者是双非，在 Java 岗一片红海——这么卷的情况下，仍然能靠自己的努力拿到一个满意的结果，我觉得已经很了不起了。&lt;/p&gt;

&lt;p&gt;为他点赞！&lt;/p&gt;

&lt;p&gt;嗯，关键是这位读者的字里行间里，充满着虔诚。那个顺带给我发的红包，足够我喝好几杯奶茶了，只是希望喝完后不要胖~~~~~哈哈哈&lt;/p&gt;

&lt;p&gt;好家伙，情商爆表的家伙，就该你前程似锦。&lt;/p&gt;

&lt;p&gt;一想到能帮助到这么多的读者，心里真的是说不出的美滋滋啊！&lt;/p&gt;

&lt;p&gt;国庆节后，大家就要投入新的战斗了，大学生要返校，为了毕业后能找到一份满意的工作；打工人要拼职场，希望能升职加薪。&lt;/p&gt;

&lt;p&gt;那借这个机会，给大家分享一些我的学习方法和套路吧，希望能对大家有所帮助和启发~&lt;/p&gt;

&lt;h3 id=&quot;01好记性不如烂笔头&quot;&gt;01、好记性不如烂笔头&lt;/h3&gt;

&lt;p&gt;如果手头没有笔和记事本的话，或者没有电脑的话，我是宁愿不学习的。不知道为什么，很多大佬喜欢推荐碎片化学习，但就我个人而言，如果不能在学习的时候把心得体会，把课程中的知识点整理出来的话，效果惨不忍睹。&lt;/p&gt;

&lt;p&gt;下图是我做的一些笔记，我会放在备忘录里，这样的话，电脑、iPad、手机等等都可以同步看到。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/10/beike-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;记忆是短暂的，而笔记是可以沉淀的，每隔一周或者一个月，还可能重新提炼和温习，学习的效果就会好很多。&lt;/p&gt;

&lt;p&gt;之前有个读者给我抱怨说，面试了几十场，效果牵强人意。我一问他，他说他从来没有梳理过往期面试中的知识点，这样肯定完蛋。&lt;/p&gt;

&lt;p&gt;我记得之前有个博主，在阅读周志明老师的《深入理解 Java 虚拟机》 一书时，就做了不少笔记，开源到 GitHub 上还收获了不少好评。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;https://github.com/TangBean/understanding-the-jvm&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;还有一个仓库对学习 Java 虚拟机也会有很大的帮助：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;https://doocs.github.io/jvm/#/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;02制定学习计划&quot;&gt;02、制定学习计划&lt;/h3&gt;

&lt;p&gt;不管你处于人生的哪个阶段，学习计划是一定要制定的。&lt;/p&gt;

&lt;p&gt;有些人，总觉得，上了大学，跟着学校的课程走就 OK 了；&lt;/p&gt;

&lt;p&gt;有些人，总觉得，上了班，跟着工作任务走就 OK 了。&lt;/p&gt;

&lt;p&gt;这样的人就很容易陷入“三天打鱼两天晒网”的魔咒当中，因为学校是针对所有在校生做的课程设计，而绝大多数的公司都会为了业务焦头烂额，更无心关心员工个人的学习发展了。&lt;/p&gt;

&lt;p&gt;我们想要保持竞争力，就必须得制定合理的学习计划。但我建议学习计划一定不要精确到每天多少小时制当中，而是按照周为单位，月为单位，否则很容易陷入为了计划而计划的困境当中。&lt;/p&gt;

&lt;p&gt;这一点，恐怕考研的读者会深有体会。&lt;/p&gt;

&lt;h3 id=&quot;03张弛有度&quot;&gt;03、张弛有度&lt;/h3&gt;

&lt;p&gt;放假了就好好的玩，玩美了就好好的学，劳逸结合张弛有度。&lt;/p&gt;

&lt;p&gt;大家也看到了，国庆这几天，我就是纯粹的放松，甚至可以说是放纵，哈哈哈。公众号除了给大家送送 Mac，推荐一些硬核朋友之外，别的什么也没干。&lt;/p&gt;

&lt;p&gt;国庆第一天，去了三门峡，和父母聊了聊天；由于他们第三天就要干活铺地板砖，我们第二天下午就开车来了县城，老丈人家在这。&lt;/p&gt;

&lt;p&gt;除了看看电影，就是陪小朋友们玩，顺带躺在十八线的小县城的长凳上，躺平会——和煦的阳光伴着微风，真的是舒服。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/10/beike-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这不假期结束了，放松够了，就肝了一早上的文章，给大家来点有营养的干货。&lt;/p&gt;

&lt;p&gt;我不确定自己属不属于 work-life-balance，反正我觉得人生嘛，总该活出点不一样的。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;别人都还在一线城市卷，我选择了三线城市&lt;/li&gt;
  &lt;li&gt;别人选择了在三线城市躺平，我选择了继续“卷”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我也希望，我所有的读者，都能找到自己钟意的生活方式，一起加油~&lt;/p&gt;

</description>
        <pubDate>Fri, 08 Oct 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/10/08/beike.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/10/08/beike.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>80 后该退出 IT 行业</title>
        <description>&lt;p&gt;本来是不想谈论这个话题的，因为觉得挺消极的。&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;但昨天早上刷知乎的时候，看到了这样一个话题：武汉一公司领导称「80 后该退出 IT 行业」，并且嚷嚷着开除为公司卖命的员工。这个话题一度高居热榜前 6。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/09/it-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;大家都知道，二哥也是个 80 后。我虽然认真考虑过失业这件事，但就目前的情况来说，我认为自己正值青春年华，还可以在 IT 行业“挥斥方遒”个十年以上。&lt;/p&gt;

&lt;p&gt;这就被脑残领导劝退 IT 行业，着实心有不甘。&lt;/p&gt;

&lt;p&gt;洛阳作为一个三线城市，IT 行业和北上广深杭是没法比的，和二线城市郑州也有很大的差距，但二哥凭借多年的“摸鱼”功底，想在洛阳混口饭吃，应该不是什么大问题。&lt;/p&gt;

&lt;p&gt;但假如不干 IT 了，我一时半会还真不知道自己适合干什么工作。&lt;/p&gt;

&lt;p&gt;跑滴滴？家里的小破车应该是符合条件的。&lt;/p&gt;

&lt;p&gt;送外卖？家里有一辆两轮电车和一辆三轮电车，应该也是符合条件的。&lt;/p&gt;

&lt;p&gt;去培训班做讲师？我是有这方面资源的，北大某鸟的领导我都认识，洛阳本地也有这样的培训机构，但说到底还是 IT 行业，并没有出圈。&lt;/p&gt;

&lt;p&gt;这让我想起我的父母，他们曾经是地地道道的农民，在我毕业找到工作之前，他们有想过换“工作”，但他们没有，因为他们怕，怕一旦不种庄稼了，就没有了收入，没有收入，就意味着无法供我上学，这是他们不能接受的。&lt;/p&gt;

&lt;p&gt;自己吃再多的苦，受再多的累，问题不大，可一旦影响我的学业，他们会觉得对不起我。&lt;/p&gt;

&lt;p&gt;但时代在变，物价在飞涨，但粮食的价格，着实没怎么涨过，一直种庄稼，终究不是个事儿。&lt;/p&gt;

&lt;p&gt;所以等我找到了实习工作后，有了收入能照顾我自己后，父母就毅然而然地进城打工了。&lt;/p&gt;

&lt;p&gt;算是他们的“裸辞”吧。不管是出于时代的客观因素，还是他们自身的主观因素。&lt;/p&gt;

&lt;p&gt;掏心掏肺地讲，&lt;strong&gt;失业的念头，随着年龄的增长，确实就像野地里的荒草，越长越高&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;一个人的时候，自己挣钱自己花，人生当中最无忧无虑的阶段。&lt;/p&gt;

&lt;p&gt;两个人的时候，加在一起的资金池是变多了，但要买车，要买房，花大钱的地方也多了，压力陡增。&lt;/p&gt;

&lt;p&gt;三个人的时候，教育经费是真的高，早教课、幼儿园、辅导班，各种玩具，各种绘本，各种用品，是真的贵。从良心上讲，双减政策我是打心底里支持，如果再晚来个三五年，年轻人迟早被整垮。&lt;/p&gt;

&lt;p&gt;再往后去，双方父母渐渐地老去，医疗经费也会在某一天突然压弯你的腰。&lt;/p&gt;

&lt;p&gt;这种情况下，工作上再遇到一些脑残领导，强迫你修福报，搞末位淘汰制，整各种 KPI，弄要命的 deadline，是个人，都会心浮气躁。&lt;/p&gt;

&lt;p&gt;很多人，包括我自己，是很容易陷入思维定式的，总觉得有些事情是理所应当的。&lt;/p&gt;

&lt;p&gt;上大学那会，一开始还经常混图书馆，上课非常积极，经常坐前排，但随着时间的推移，图书馆去的少了，机房和宿舍待的时间多了，因为可以打游戏；上课的时候也不坐前排了，后排更容易躲避老师的提问。不管怎么样，混个毕业证是不难的。&lt;/p&gt;

&lt;p&gt;我觉得这是理所应当的。&lt;/p&gt;

&lt;p&gt;可我竟然挂科了，还一挂两门，补考的感受真特么要命。&lt;/p&gt;

&lt;p&gt;去外企的那三年半时间里，确实很少有想过回三线城市，一门心思，只想把工作搞好，只想把编程水平提高，做到 teamleader，做到项目 leader，然后多挣点钱，在苏州落户，然后把父母接过去一块生活。&lt;/p&gt;

&lt;p&gt;我觉得这是理所应当的。&lt;/p&gt;

&lt;p&gt;可我忽略了异地恋的痛苦，两个人的爱情，想要跨越地域上的阻隔，太难了。&lt;/p&gt;

&lt;p&gt;大家有想过，五年、十年后的自己是个什么样子吗？&lt;/p&gt;

&lt;p&gt;以前的我的确没想过，我觉得只要做好自己就行了。但随着年龄的增加，也许是变得成熟了，也许是变得神神叨叨了，我最近两三年有认真的想过。&lt;/p&gt;

&lt;p&gt;我会想，假如是我，遇到了要求「80 后退出 IT 行业」这样的脑残领导，我会怎么办？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/09/it-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;要知道这个世界上，好人很多，但大尾巴狼也有不少。遇到了怎么办？&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;义愤填膺地抨击这样脑残的领导？&lt;/li&gt;
  &lt;li&gt;毅然决然、体面地离开这样脑残的公司？&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样做是对的，但还不够！&lt;/p&gt;

&lt;p&gt;我来说说我这两三年来在做的一些事情吧，供大家参考下，做到有备无患。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一，搞一份副业&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;搞副业的前提是，你的主业已经搞得不错了，需要搞点别的事情更上一层楼；或者主业遇到了瓶颈，需要另谋出路了。&lt;/p&gt;

&lt;p&gt;千万不要一边主业焦头烂额，一边还要抽时间抽精力搞副业，那最后可真就芝麻西瓜都丢了。&lt;/p&gt;

&lt;p&gt;不要对副业有什么误解，也不要对主业有什么误解。&lt;/p&gt;

&lt;p&gt;比如说，你在上大学，那主业就是好好完成学业，把计算机的基础课该补的补上。&lt;/p&gt;

&lt;p&gt;之前给大家推荐过国防科技大学大学出品的《&lt;a href=&quot;https://mp.weixin.qq.com/s/QpT6jbTAxAoCr-YeiMmFNg&quot;&gt;计算机基础课&lt;/a&gt;》，当时还没开课，现在已经开课了。下图是我在学习这门课的时候做的一些笔记。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/09/it-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;比如说，你刚参加工作，这时候千万不要分心，不要贪多，主要的精力就放在工作上，不管是技术的提升上，还是解决问题的能力上，当你在公司的职责明确了，工作任务也都能顺利交接了，这时候再谋划一些副业，比如说写技术博客、做开源作品，对你自身的成长都会是巨大的帮助。&lt;/p&gt;

&lt;p&gt;再比如说，你已经工作了三五年了，向上走可能遇到了瓶颈，那么千万不要陷入迷茫和焦虑中，这时候，就要着手探索自己的副业方向了，做内推？做资源整合？要尽可能地利用手头上的资源，去发挥自己更多的潜力。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第二，尽早清空负债。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我有这样一个朋友，他房贷有个 30 万左右，这不算多吧，每个月还个 2000 块左右，压力也不是很大。&lt;/p&gt;

&lt;p&gt;他手头上其实有 60 万左右的现金，然后他的一个朋友喊他一起创业，他觉得想法很不错，自己也很认同，觉得很有前景，又借了 40 万左右就投进去了。朋友也是知根知底，结果，崩了，这 100 万算是有借无回了，因为朋友也还不起呀！&lt;/p&gt;

&lt;p&gt;这时候，才想起来自己还有 30 万的房贷没有还，还特么又借了 40 万，没办法，只好走官司，但最后追回来的钱少的可怜。&lt;/p&gt;

&lt;p&gt;这么多年，我一直奉行的准则就是，能不借钱就不借钱，甚至我连信用卡都戒了，真的，已经三年多没刷过信用卡了。&lt;/p&gt;

&lt;p&gt;不管是借钱还是刷信用卡，会让你有一种错觉，就是自己账上好像钱还有不少，但其实真的是一种错觉。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第三，培养自己的理财意识&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我有个大学同学，上大学的时候家里其实提供了学费，但我这个同学愣是申请上了贫困生的助学贷款，免息的那种，然后自己把学费存了定期——woc，我第一次听他说的时候，简直就认为他是离我最近的巴菲特。&lt;/p&gt;

&lt;p&gt;惊叹于同学的骚操作的同时，我对自己有些失望：因为按照我们的家庭条件来说，都差不了多少，都属于农民当中的贫穷阶层，而我连申请助学贷款的意识都没有。&lt;/p&gt;

&lt;p&gt;当然了，培养自己的理财意识，并不意味着要把钱投到股市，投去买基金，投去买房子，可能对于大多数普通的人来说，投到买一些能提高自己技术水平，提高自己眼界的书或者课上，效果会来得更好一点。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;于我而言，如果能做好这三件事，如果真有一天，我遇到了人事变动，遇到了脑残领导，遇到了公司突然暴雷，也不至于束手就擒。&lt;/p&gt;

&lt;p&gt;好了，今天休息，但明天还得上班，就先聊到这了。&lt;/p&gt;

&lt;p&gt;我是二哥呀，我们明天见~&lt;/p&gt;

&lt;p&gt;&lt;em&gt;没有什么使我停留——除了目的，纵然岸旁有玫瑰、有绿荫、有宁静的港湾，我是不系之舟&lt;/em&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推荐阅读&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/hA1dnbjd7o1t1jWVGDX8tg&quot;&gt;我坚持三年了！&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/nx15_7xw32CsfLYXuLg7Sg&quot;&gt;二哥的读者（女，从小就想当黑客，初中学编程，高中造火箭&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/_coQbVnlir_fH5eDNzBB3Q&quot;&gt;二哥的读者（男，半年从机械转码，去携程实习了！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Sat, 25 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/09/25/it.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/09/25/it.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>❤️Java17 来了，YYDS！重磅！JDK 17 发布，Oracle 宣布 JDK 17 可以免费商用了。。</title>
        <description>&lt;p&gt;果然，JDK 17 还是如期发布了，2021年09月14日。巧了，和苹果发布会是一天，不知道是不是互相在蹭热度，哈哈哈~~~&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;不过，苹果 13 确实不那么 13 香，库克一如既往在挤牙膏式的更新。&lt;/p&gt;

&lt;p&gt;对比之下，我觉得还是 JDK 17 比较香，&lt;strong&gt;除了新增了不少新特性，Oracle 官方竟然宣布 JDK 17 可以免费商用了&lt;/strong&gt;！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://files.mdnice.com/user/3903/8ce2805c-1e93-45d3-a863-4e14f84d17f9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;从官方的声明中可以看得出：&lt;em&gt;Oracle JDK 17 和未来的 JDK 版本是在免费使用许可下提供的，直到下一个 LTS 版本发布整整一年&lt;/em&gt;。&lt;/p&gt;

&lt;p&gt;LTS 是什么意思呢？就是 Long-Term-Support，长期支持版本，不同于 16、15、14、13、12 这些过渡版本。&lt;/p&gt;

&lt;p&gt;生产环境下，最常用的三个版本，就是 JDK 6、JDK 8、JDK 11，JDK 17 会不会是下一个呢？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://files.mdnice.com/user/3903/9b823264-e7b4-4afc-866f-ab52088d08de.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;上面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。可以看得到，JDK 17 最多可以支持到 2029 年 9 月份，长达 8 年！&lt;/p&gt;

&lt;p&gt;按照技术更新迭代的速度，8 年时间，真不短了！&lt;/p&gt;

&lt;p&gt;以 Oracle 的尿性来看，这次免费商用 8 年可谓是良苦用心，为的就是让使用者放心大胆地将 JDK 升级到 JDK 17。&lt;/p&gt;

&lt;p&gt;不过，好像 JDK 8 支持的时间更长，可以延长到 2030 年 12 月。似乎我又发现了什么真理：&lt;strong&gt;他强任他强，我用 Java 8&lt;/strong&gt; ！&lt;/p&gt;

&lt;p&gt;JDK 17 之前，LTS 版本都是 3 年发布一次，11 是 2018 年，8 是 2014 年，7 是 2011 年。&lt;/p&gt;

&lt;p&gt;之后呢，Oracle 计划每两年发布一次未来的 LTS 版本，也就是说，下一个 LTS 版本，也就是 JDK 21 将于 2023 年 9 月份发布。&lt;/p&gt;

&lt;p&gt;技术更新迭代的速度又快了呀！&lt;/p&gt;

&lt;p&gt;这里强调一点哈，&lt;strong&gt;非长期支持版本一定不要用于生产环境&lt;/strong&gt;，不过拿来作为学习的对象还是可以的。&lt;/p&gt;

&lt;p&gt;JDK 17 提供了 14 个 JEP（JDK Enhancement Proposal，JDK 增强建议），也就是 14 个新特性，我们来一睹为快！&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;特性&lt;/th&gt;
      &lt;th&gt;说明&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;306:Restore Always-Strict Floating-Point Semantics&lt;/td&gt;
      &lt;td&gt;恢复始终执行严格模式的浮点定义&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;356:Enhanced Pseudo-Random Number Generators&lt;/td&gt;
      &lt;td&gt;增强型伪随机数生成器&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;382:New macOS Rendering Pipeline&lt;/td&gt;
      &lt;td&gt;新的 macOS 渲染管道&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;391:macOS/AArch64 Port&lt;/td&gt;
      &lt;td&gt;macOS AArch64 端口&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;398:Deprecate the Applet API for Removal&lt;/td&gt;
      &lt;td&gt;弃用 Applet API&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;403:Strongly Encapsulate JDK Internals&lt;/td&gt;
      &lt;td&gt;JDK 内部强封装&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;406:Pattern Matching for switch (Preview)&lt;/td&gt;
      &lt;td&gt;为 switch 支持模式匹配&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;407:Remove RMI Activation&lt;/td&gt;
      &lt;td&gt;移除 RMI 激活&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;409:Sealed Classes&lt;/td&gt;
      &lt;td&gt;密封类&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;410:Remove the Experimental AOT and JIT Compiler&lt;/td&gt;
      &lt;td&gt;移除实验性的 AOT 和 JIT 编译器&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;411:Deprecate the Security Manager for Removal&lt;/td&gt;
      &lt;td&gt;弃用安全管理器&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;412:Foreign Function &amp;amp; Memory API (Incubator)&lt;/td&gt;
      &lt;td&gt;外部函数和内存 API（孵化中）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;414:Vector API (Second Incubator)&lt;/td&gt;
      &lt;td&gt;矢量 API（二次孵化中）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;415:Context-Specific Deserialization Filters&lt;/td&gt;
      &lt;td&gt;上下文特定反序列化过滤器&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;java-语言增强&quot;&gt;Java 语言增强&lt;/h3&gt;

&lt;p&gt;JEP 409：密封类，密封的类和接口，可以限制其他类或接口扩展或实现它们。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sealed&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Shape&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;permits&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Circle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;类 Shape 被关键字 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sealed&lt;/code&gt; 修饰，表明它是一个密封类。这个密封类必须要指定它被哪些类继承，比如说 Circle：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Circle&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Shape&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Circle 类必须用 final 关键字修饰，表明它不能再被其他类继承了。&lt;/p&gt;

&lt;p&gt;这个密封类就有意思了，我只允许谁谁谁继承，就有点指定继承权的内味了。&lt;/p&gt;

&lt;h3 id=&quot;库的更新和改进&quot;&gt;库的更新和改进&lt;/h3&gt;

&lt;p&gt;JEP 306：恢复始终执行严格模式的浮点定义。Java 最初只有严格的浮点语义，但从 JDK 1.2 开始，为了适应当时硬件架构的限制，默认情况下允许这些严格语义中的细微变化，而现在这些都没有必要了。&lt;/p&gt;

&lt;p&gt;JEP 356：增强型伪随机数生成器。为伪随机数生成器 (PRNG) 提供新的接口类型和实现。&lt;/p&gt;

&lt;p&gt;JEP 382：新的 macOS 渲染管道。 使用 Apple Metal API 为 macOS 实现了 Java 2D 渲染管道。新管道减少了 JDK 对已弃用的 Apple OpenGL API 的依赖。&lt;/p&gt;

&lt;h3 id=&quot;新平台支持&quot;&gt;新平台支持&lt;/h3&gt;

&lt;p&gt;JEP 391：macOS AArch64 端口。该端口允许将 Java 应用程序在新的基于 Arm 64 的 Apple Silicon 计算机上运行。&lt;/p&gt;

&lt;h3 id=&quot;删除和弃用&quot;&gt;删除和弃用&lt;/h3&gt;

&lt;p&gt;JEP 398：弃用 Applet API。Applet 是一种运行在 Web 浏览器内的 Java 程序，早就过时了，删除很有必要。&lt;/p&gt;

&lt;p&gt;JEP 407：删除了远程方法调用 (RMI) 激活机制。&lt;/p&gt;

&lt;p&gt;JEP 410：删除实验性的 AOT 和 JIT 编译器，这两个实验功能并没有被广泛使用，删了省得维护。&lt;/p&gt;

&lt;p&gt;JEP 411：弃用安全管理器。安全管理器可追溯到 Java 1.0，但多年来并没有起到很好的保护作用，删除了省心。&lt;/p&gt;

&lt;h3 id=&quot;面向未来的-java-程序&quot;&gt;面向未来的 Java 程序&lt;/h3&gt;

&lt;p&gt;JEP 403：JDK 内部强封装，限制外部对 JDK 内部类进行访问，此更改会使应用程序更安全，并减少对非标准、内部 JDK 实现细节的依赖。&lt;/p&gt;

&lt;h3 id=&quot;后续-jdk-版本的预览和孵化器&quot;&gt;后续 JDK 版本的预览和孵化器&lt;/h3&gt;

&lt;p&gt;JEP 406 : 为 switch 支持模式匹配。&lt;/p&gt;

&lt;p&gt;我们希望将一个变量 o 与多个备选方案进行比较，但之前的 switch 不支持使用 instanceof 的模式匹配，于是我们只能用 if-else 来实现。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;formatter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Integer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;int %d&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;long %d&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;double %f&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;String %s&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;JDK 17 在模式匹配的基础上提供了 switch 语句的支持：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;formatterPatternSwitch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Integer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;int %d&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;long %d&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;double %f&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;String %s&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这样写是不是就瞬间高大上了许多，舒服。&lt;/p&gt;

&lt;p&gt;JEP 412：外部函数和内存 API（孵化器）。通过有效调用外部函数（JVM 外部的代码），并通过安全访问外部内存，这使得 Java 程序能够调用本机库并处理本机数据，而没有 Java 本机接口 (JNI) 的脆弱性和复杂性。&lt;/p&gt;

&lt;p&gt;JEP 414：矢量 API（第二孵化器）。Vector API 由JEP 338 提出并作为孵化 API 集成到 Java 16 中。&lt;/p&gt;

&lt;p&gt;Vector API 旨在通过提供一种在 Java 中编写复杂矢量算法的方法来提高矢量化计算的可预测和健壮性。许多领域都可以从这个显式向量 API 中受益，包括机器学习、线性代数、密码学、金融和 JDK 本身的代码。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;官方链接：https://www.oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;讲良心话，JDK 更新的频率是比以前更快了，但开发者的习惯仍然停留在 JDK 8 甚至 JDK 6 的层面上。&lt;/p&gt;

&lt;p&gt;主动升级到 JDK 11 的并不多，尤其是 Oracle 搞出商业收费后，大家升级的意愿就更淡了。&lt;/p&gt;

&lt;p&gt;不知道是不是出于开源或者叫免费的压力，JDK 17 宣布可以免费商用了，并且打算以后的版本也保持这样。&lt;/p&gt;

&lt;p&gt;这对使用者来说，无疑是一罐蜜糖，长达 8 年的时间支持，也许大家会愿意升级到 JDK 17 了！&lt;/p&gt;

&lt;p&gt;大家觉得呢？&lt;/p&gt;

&lt;p&gt;我是二哥呀，&lt;em&gt;没有什么使我停留——除了目的，纵然岸旁有玫瑰、有绿荫、有宁静的港湾，我是不系之舟&lt;/em&gt;。&lt;/p&gt;

</description>
        <pubDate>Fri, 17 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/java/2021/09/17/java17.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/java/2021/09/17/java17.html</guid>
        
        <category>java</category>
        
        
        <category>java</category>
        
      </item>
    
      <item>
        <title>讲真，计算机还能火多久？</title>
        <description>&lt;p&gt;在知乎上看到这样一个问题：&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;2020届本科毕业，专业应用数学，打算22考研，是考计算机吗？农村贫困家庭，没有什么爱好，只希望以后的工作挣钱就行了，就是害怕三四年以后读研出来计算机不行了&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;讲真，计算机还能火多久？我无法给出确切的结论。&lt;/p&gt;

&lt;p&gt;但我知道，我们班当年 36 名同学，留在计算机行业的，10 根手指头就能数得过来。&lt;/p&gt;

&lt;p&gt;据我观察（微信好友接近 2 万），有不少向我咨询转互联网 IT 的小伙伴，最后都不了了之了。也就是说，嚷嚷着转码的很多，但落实到行动上的，其实真没多少，可能还没有转公务员的多。&lt;/p&gt;

&lt;p&gt;我之前的一个同事，所有的领导都特别看重他，我也认为他如果能再坚持坚持，一定能取得比我更好的成绩，结果他愣是去考了公务员。&lt;/p&gt;

&lt;p&gt;我不知道他现在过得怎么样，后悔还是爽歪歪，但我能确定，他确实从码农转了公务员。&lt;/p&gt;

&lt;p&gt;也就是说，互联网上看起来学习资源到处都是，门槛很低，但真正（长期）从事计算机行业的人，远没有看起来的这么多。&lt;/p&gt;

&lt;p&gt;尤其是，近些年来劝退的声音很响，很多科班的最后都没有选择敲代码，更别说非科班的了，所以，在我看来，短期内（至少十年吧）计算机是不会饱和的。&lt;/p&gt;

&lt;p&gt;实际上，圈中认识的一些朋友都在喊着缺人，问起待遇会说：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;钱不是问题，关键是人靠谱&lt;/li&gt;
  &lt;li&gt;薪资没有上线，只要技术能力到位&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我呢，在公众号已经内推过 4 次了，一次是给北京的一个朋友，两次是给京东的两个朋友，还有一次是给洛阳本地的一家不错的企业。&lt;/p&gt;

&lt;p&gt;如果大家留意的话，留言区也会时不时有人留下信息，说要内推。&lt;/p&gt;

&lt;p&gt;另外，石头也找我内推过，他在阿里，也很缺人，我后面准备一下。&lt;/p&gt;

&lt;p&gt;从技术应用的角度来看，在相当长的时间里，社会对计算机从业人员的缺口都非常大。因为，各行各业都需要计算机专业的人员参与进来，进行数字化的改造。&lt;/p&gt;

&lt;p&gt;之前给大家聊过，有个华为的大佬特意跑到洛阳找我，商谈创业的想法。他是做印刷的，之所以做印刷行业，就是因为印刷行业属于传统行业，没有和互联网打通，通过和他的聊天我才得知，下单、财务这些竟然都用的是 Excel 来管理的，工作效率不是一般的低。&lt;/p&gt;

&lt;p&gt;想想也是啊，平常我要打印个合同，还需要专门跑到图文店，签字打印，然后邮寄，对方确认后再扫描个电子版过来。&lt;/p&gt;

&lt;p&gt;再举个例子，我在某 2 线城市的 5 年计划中，看到这样一条：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;未来5年内，借助互联网技术，着重提升群众办事的满意度，从原来“只跑一次”，变成“一次也不用跑”，打造“24小时不打烊”的政府窗口。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;大家想一下，按这个思路，各行各业，全国上下铺开，是多么大的一个工程量，对计算机从业人员的需求量，可想而知。&lt;/p&gt;

&lt;p&gt;另外，像专业领域的软件，完全被国外吊打，来自知友 @Charles福心 统计。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AutoCAD、solidworks、proe、creo等3维设计软件，实体制造业，包括家电、家居、装修、机械、服装设备、各种设备制造、生产线制造&lt;/li&gt;
  &lt;li&gt;Adobe家族，设计、阅读行业，设计行业&lt;/li&gt;
  &lt;li&gt;ansys、fluent、MATLAB，结构应力分析、流体分析，所有有中高端实体产业、大型企业、科研所、尖端行业&lt;/li&gt;
  &lt;li&gt;CATIA 汽车行业、新能源行业&lt;/li&gt;
  &lt;li&gt;protel，电气行业，电路设计等等，涉及所有通电的数码设备，小到耳机，大到手机、笔记本显示器、家电等等&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些专业领域的软件，就需要更多计算机专业的人员参与进来，并且坚持做 5-10 年才有可能赶得上。&lt;/p&gt;

&lt;p&gt;洛阳有两家薪资待遇非常不错的公司，做的就是专业领域的软件，技术壁垒已经有了。&lt;/p&gt;

&lt;p&gt;这两年，我能很明显的感受到，行业逐渐在变成一个学历高地、人才高地。&lt;/p&gt;

&lt;p&gt;10 年前，我入行的时候，专科就能打，后来是本科，再后来是全日制本科，甚至有些会明确要求 985、211。&lt;/p&gt;

&lt;p&gt;在我有限的认知里，不少双非的，都要考个研，才能平稳地度过简历筛选的这一关；特别是算法岗的，几乎清一色的都是硕士学历以上的。&lt;/p&gt;

&lt;p&gt;我身边有一些培训班的老师，以前朋友圈只发一些招生的，现在都会兼发一些专升本的、成人本科的业务。&lt;/p&gt;

&lt;p&gt;也就是说，计算机的缺口仍然很大，只不过，要求也比以前更高了。&lt;/p&gt;

&lt;p&gt;计算机还能火多久？单纯来讨论这个命题其实没有多大的意义。我这里提供一些建议和想法，大家可以思考一下。&lt;/p&gt;

&lt;p&gt;第一，如果你想纯靠技术来生存，那么你就要精心打磨自己的技术，让自己成为技术大牛，进大厂，帮助企业节省成本。&lt;/p&gt;

&lt;p&gt;一个牛逼的程序员单位时间里的产出是非常恐怖的，也许会超过 100 个糟糕程序员合在一起的战斗力，当你能达到这种不可替代的高度，那么你就可以在计算机这个行业干一辈子，完全没有任何问题。&lt;/p&gt;

&lt;p&gt;第二，成为独立开发者，为一小撮群体提供精细化的需求服务。&lt;/p&gt;

&lt;p&gt;随着社会的发展，人们的需求会越来越多元化，那也就意味着，如果你能满足一小撮群体的需求，也能活得很滋润。那你就不能只专注于做技术，你还得：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;洞察用户的需求&lt;/li&gt;
  &lt;li&gt;懂设计&lt;/li&gt;
  &lt;li&gt;搞宣传&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;米哈游大家都知道吧？应该有不少小伙伴玩过。米哈游的前身，就是刘伟团队以独立开发者的身份推出的游戏《FlyMe2theMoon》。创始人刘伟、蔡浩宇和罗宇皓不仅热爱技术，还喜欢搞动漫，大学就开始搞了。&lt;/p&gt;

&lt;p&gt;在校的同学时间比较充沛，所以可以多尝试尝试，把技术和自己的爱好结合起来，未来也许就是你的。&lt;/p&gt;

&lt;p&gt;计算机行业对于普通人来说，仍然是改变命运的绝好机会。相对来说，传统行业更注重资源，背景、人脉尤其重要，普通出身的人想要晋升，难度相当于爬 90 度的梯子。当然了，如果能把传统行业和互联网结合起来，那一定也能创造出巨大的价值。&lt;/p&gt;

&lt;p&gt;古人云：两害相权取其轻。&lt;/p&gt;

&lt;p&gt;往下看，是待遇低微、前途灰暗、血肉磨坊般的传统工科；&lt;/p&gt;

&lt;p&gt;往上看，是门槛高、依赖家庭资源、依赖学校出身的金、法、医；&lt;/p&gt;

&lt;p&gt;中间的计算机，算是这个时代给予贫寒子弟仅有的一点温柔。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;把二哥的座右铭送给大家：没有什么使我停留——除了目的，纵然岸旁有玫瑰、有绿荫、有宁静的港湾，我是不系之舟。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推荐阅读&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/_WJiAFuQ0uFeLVnsECS-OA&quot;&gt;武侠小说的角度来读 LinkedList 源码&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/QpT6jbTAxAoCr-YeiMmFNg&quot;&gt;计算机基础课，YYDS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/a7Pz5Q4M-Q1Gb-cBPHqRGw&quot;&gt;国家何时整治程序员高薪现象？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Fri, 10 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/09/10/jisuanji.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/09/10/jisuanji.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>❤️准大一，到底选哪门编程语言？</title>
        <description>&lt;p&gt;我看朋友圈，有些地方已经开学了哈，我们这边推迟到了 9 月 15 号以后。那对于大一新生/准大一新生来说，该如何选择编程语言就是个头大的问题，因为谁都怕选择错了呀。&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;大家好，我是二哥呀。&lt;/p&gt;

&lt;p&gt;我看朋友圈，有些地方已经开学了哈，我们这边推迟到了 9 月 15 号以后。那对于大一新生/准大一新生来说，该如何选择编程语言就是个头大的问题，因为谁都怕选择错了呀。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/197fdc43267f8149366001d70f7d3868.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;主流的大学一般都会在大一上半学期开设 C语言这门课，但 C语言是面向过程的，应用领域比较窄，以后工作后用到 C语言的可能性不大。像 Java 啊、Python 啊、C++啊，是面向对象的，应用领域更广泛，以后也更容易找到工作。&lt;/p&gt;

&lt;p&gt;那到底还要不要学习 C语言了呢？那到底是选择 Java 呢？还是 Python 呢？还是 C++ 呢？&lt;/p&gt;

&lt;p&gt;还有前端的 JavaScript，新兴的 Go 语言，天下第一的 PHP？&lt;/p&gt;

&lt;p&gt;麻了麻了。&lt;/p&gt;

&lt;p&gt;二哥作为一名 18 岁却拥有 13 年编程经验的老学长，奔着为人民服务的态度，我就把几大编程语言拉倒了一个群里，给他们了一个勇于表达自己的机会。&lt;/p&gt;

&lt;h3 id=&quot;c语言&quot;&gt;C语言&lt;/h3&gt;

&lt;p&gt;大家好，我是 C语言。&lt;/p&gt;

&lt;p&gt;作为开场演员，我需要大家更多的掌声，快。&lt;/p&gt;

&lt;p&gt;我是由贝尔实验室的 Dennis Ritchie 在 1969 年~ 1973 年间发明创造的，瞧，就他——你们眼中的 C语言之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/da5abfff3c9d0265bdbafefb80df8b0e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;父亲是这样评价我的：“古怪的、有缺陷的，但同时也是一个巨大的成功。”&lt;/p&gt;

&lt;p&gt;的确，我的指针不知道劝退了多少初学者，但如果有幸迈过去这一关，可以说潜力无限。&lt;/p&gt;

&lt;p&gt;那为什么我还能获得如此大的成功呢？&lt;/p&gt;

&lt;p&gt;第一，我和 Unix 操作系统关系密切。&lt;/p&gt;

&lt;p&gt;大部分 Unix 内核，以及所有支撑工具和函数库都是用我来编写的。20 世纪 70 年代至 80 年代，Unix 风靡于各大高校，许多人开始接触到我，并且深深地爱上了我。&lt;/p&gt;

&lt;p&gt;以至于后来几乎所有的操作系统都用到了我，比如说 Windows、Linux、macOS 等等。&lt;/p&gt;

&lt;p&gt;第二，小而美是我的优点。&lt;/p&gt;

&lt;p&gt;我非常的简洁，几乎没有任何冗余。以至于我的库函数，嗯，都少得可怜。&lt;/p&gt;

&lt;p&gt;这有利有弊，有利的是，上手难度几乎为 0，除了指针难以被新手控制意外，其他的基础语法都很容易上手。&lt;/p&gt;

&lt;p&gt;与此同时，由于库函数的缺失，导致新手在开发任何一块小程序的时候都必须得亲力亲为。&lt;/p&gt;

&lt;p&gt;很多编程语言都受到了我的影响，比如说 Java、C++、C#、Python、Go 等等。&lt;/p&gt;

&lt;p&gt;《指环王》里有这样一句话：“one ring to them all”，可以把 ring 换成 language，这个 language 就是我，恐怕没有人会不同意。&lt;/p&gt;

&lt;p&gt;但我也必须得承认，如果大学只学我这一门编程语言，毕业后的就业形势确实不容乐观，因为你们当中的大多数人，都不会从事嵌入式开发和硬件驱动开发。&lt;/p&gt;

&lt;p&gt;当然了，以后嵌入式会不会也火起来，也不一定，比如说，在眼镜里植入一个芯片，让镜片变得更轻更薄更智能，就只能用我来搞定了。总不能再装个 JDK 吧，哈哈哈。&lt;/p&gt;

&lt;p&gt;最后我想说的是，如果你想成为特别牛逼的程序员，一定要对计算机原理、编译原理有所了解，那么我更接近底层，显然是绕不开的。&lt;/p&gt;

&lt;p&gt;像 CSAPP 这本经典书，例子就是用我编写的。&lt;/p&gt;

&lt;p&gt;大家懂我了吗？&lt;/p&gt;

&lt;h3 id=&quot;c&quot;&gt;C++&lt;/h3&gt;

&lt;p&gt;大家好，我是 C++，对，比 C 多了两个+号，意味着我就是 C语言的增强版本。&lt;/p&gt;

&lt;p&gt;20 世纪 80 年代，比雅尼·斯特劳斯特鲁普博士在贝尔实验室工作期间发明并创造了我。瞧，就他——你们眼中的 C++之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/7e1d2f33e884e0080ac9e39d89ba71f8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;从诞生之初，我就一直不停地增长，添加了诸多的新特性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;虚函数&lt;/li&gt;
  &lt;li&gt;运算符重载&lt;/li&gt;
  &lt;li&gt;多继承&lt;/li&gt;
  &lt;li&gt;标准模板库&lt;/li&gt;
  &lt;li&gt;异常处理&lt;/li&gt;
  &lt;li&gt;运行时类型信息&lt;/li&gt;
  &lt;li&gt;命名空间&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我必须得承认，我不适合作为第一门编程语言来入门，除非你极具天赋，否则你可能会因为我“从入门到放弃”的。在学习我之前，必须得搞一波 C 语言。&lt;/p&gt;

&lt;p&gt;如果你想以后开发高性能的客户端或者游戏服务器，建议学我。&lt;/p&gt;

&lt;h3 id=&quot;java&quot;&gt;Java&lt;/h3&gt;

&lt;p&gt;大家好，我是 Java。&lt;/p&gt;

&lt;p&gt;一开始，我叫 Oak，1990 年，我就由詹姆斯高斯林等人创造发明了，算是雏形吧。瞧，就他——你们眼中的 Java 之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/584e07179f783af256e844cc77180b87.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;说起来，也挺有意思的。我当初瞄准的是智能家电这块，也打算搞嵌入式呢，父亲曾把我起名为 C++ ++ —，哈哈哈。直到 1995 年，我才正式改名为 Java。&lt;/p&gt;

&lt;p&gt;我的优势主要有四点：&lt;/p&gt;

&lt;p&gt;第一就是学习资料丰富，几乎遍地都是，这就极大地降低了学习的成本。&lt;/p&gt;

&lt;p&gt;就连培训班，为了品牌的宣传，都忍痛割爱把视频教程开源到 B 站上了，直接就能白嫖，可以说是省了一大笔培训费，哈哈哈哈。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub 上这份星标 200+ 的《Java 程序员进阶之路》不错啊，顺带推荐一把&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/itwanger/toBeBetterJavaer&quot;&gt;https://github.com/itwanger/toBeBetterJavaer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/189ca61e5fdb4775b10c21664ac5d35a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6buY546L5LqM,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;第二就是就业前景乐观，虽然我现在已经很卷了，但是需求量仍然很大，因为我的生态好，车轮子多，能节省开发成本，不管是大厂，还是小厂，都比较钟爱。&lt;/p&gt;

&lt;p&gt;像阿里、美团，都是我的重度用户。&lt;/p&gt;

&lt;p&gt;如果要说哪门语言在国内找工作最吃香？&lt;/p&gt;

&lt;p&gt;如果我喊是我，那绝对没有第二门编程语言出来瞎逼逼。&lt;/p&gt;

&lt;p&gt;像企业级 Web 开发、大数据分析处理、微服务、云计算、移动开发都是我的主战场。还有图像处理、桌面应用开发、分布式系统开发、嵌入式等等，我也都能自由切入。&lt;/p&gt;

&lt;p&gt;第三就是我搞出来了一个 JVM，可以跨平台，你只需要敲一次代码，编译好，就能在所有平台上运行。&lt;/p&gt;

&lt;p&gt;第四就是我把指针这块给砍掉了，这对新手来说，简直就是福音。你只管折腾，内存什么的我来帮你搞定。当然了，也不能太瞎糊弄，OOM 也是会发生的。一旦发生，找起来问题就也挺头大的。&lt;/p&gt;

&lt;p&gt;综合实力来看，我应该是编程语言中的大王。&lt;/p&gt;

&lt;h3 id=&quot;python&quot;&gt;Python&lt;/h3&gt;

&lt;p&gt;大家好，我是 Python。&lt;/p&gt;

&lt;p&gt;由吉多·范罗苏姆发明创造，第一版发行于 1991 年。瞧，就他——你们眼中的 Python 之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/26f03394d9604ca94415f3f264ec0f60.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的优势就在于简单易上手。&lt;/p&gt;

&lt;p&gt;但讲真，我的两大核心应用领域，比如说人工智能、数据分析，对学历都是有比较高的要求的。&lt;/p&gt;

&lt;p&gt;还有爬虫这块，如果作为学习，比如说去爬爬网易云音乐下的评论，豆瓣上的高分电影，我觉得还可以。&lt;/p&gt;

&lt;p&gt;但爬虫这块说实话，有风险。尤其是一些需要付费的内容，或者比较私密的数据，尽量不要去爬。&lt;/p&gt;

&lt;p&gt;我比较疑惑的一点是，有些学校，明明牌子不是很响亮，却特别喜欢拿我来给学生讲。&lt;/p&gt;

&lt;p&gt;恐怕以后的就业真的是大问题。&lt;/p&gt;

&lt;p&gt;如果你是一名编程爱好者，那么推荐你来学我，写一些自动化的测试脚本了，我觉得蛮 OK 的，因为学习曲线比较平缓。&lt;/p&gt;

&lt;p&gt;如果你想以我为生，那么尽最大可能提高你的学历，很关键。&lt;/p&gt;

&lt;h3 id=&quot;go&quot;&gt;Go&lt;/h3&gt;

&lt;p&gt;大家好，我是 Go，也可以叫我 Golang。&lt;/p&gt;

&lt;p&gt;对了，我爸是 Google，背靠大树好乘凉啊。主创人员主要有三个，都是计算机领域的宗师级大牛：Rob Pike、Ken Thompson 和 Robert Griesemer。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/6c6f40f833a0331e381ebdcc32360ded.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;像 docker、k8s 都是用我编写的。&lt;/p&gt;

&lt;p&gt;我敢这么拍着胸脯说，我就是目前发展最迅猛的编程语言了，没有之一，国内很多大厂都开始张开双臂拥抱我了。&lt;/p&gt;

&lt;p&gt;国内的字节就是重度用户。&lt;/p&gt;

&lt;p&gt;为什么大厂会青睐我呢？&lt;/p&gt;

&lt;p&gt;因为第一，微服务和云原生已经成为一种趋势，而我作为一款高性能的编译型语言，非常适合承载落地微服务的实现，又容易生成跨平台的可执行文件，相比于其他语言，也更容易在 docker 上部署。&lt;/p&gt;

&lt;p&gt;第二，我兼具了 Java 和 C语言的量大优势，比如说 Java 的垃圾回收，但 Java 需要 JVM 才能运行，我可以像 C语言一样直接编译运行。&lt;/p&gt;

&lt;p&gt;第三，我是用 Goroutine（协程）实现的并发，避免了上下文切换的额外耗费，兼顾了多线程的优点，简化了高并发程序的复杂。&lt;/p&gt;

&lt;p&gt;但我也有自身的缺陷，比如说，不支持多态，没有注解，缺少框架等等。&lt;/p&gt;

&lt;h3 id=&quot;c-1&quot;&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;大家好，我是 C#，似乎比 c++ 又多了两个 ++。&lt;/p&gt;

&lt;p&gt;对了，我爸是微软，由C和C++派生出来的面向对象的编程语言。由安德斯·海尔斯伯格主持开发，2000 年首次发布，我爸的野心也很大，就是为了取代 Java 的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/b1ebfdd7e4e0f13aea80fd925aabd93b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;怎么评价我自己呢？&lt;/p&gt;

&lt;p&gt;前后端的事都可以办，但是，主要是针对 Windows，跨平台性差。&lt;/p&gt;

&lt;p&gt;当然了，最大的问题还是封闭性吧，再加上多次推倒重来的反复摩擦，铁粉都离我而去了，伤心。&lt;/p&gt;

&lt;p&gt;国内的职位还有一定数量，但大多集中在工具定制开发、游戏开发（unity 3d）等方面。&lt;/p&gt;

&lt;h3 id=&quot;php&quot;&gt;PHP&lt;/h3&gt;

&lt;p&gt;大家好，我是 PHP。&lt;/p&gt;

&lt;p&gt;1995 年由拉斯姆斯·勒多夫开发，瞧，就他&lt;strong&gt;——&lt;/strong&gt;你们眼中的 &lt;strong&gt;PHP&lt;/strong&gt; 之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/e22647209c12671d5f2ed3d2faa147d5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对，“我曾是世界上最好的编程语言”。&lt;/p&gt;

&lt;p&gt;曾几何时，我有多火，你们这些年轻一代的同学都想象不到。2000 年到 2010 年，可以说是我最辉煌的十年，几乎每一家中小型公司的后台都是用我开发的。&lt;/p&gt;

&lt;p&gt;你们知道吗？曾经，我才是 BAT 最主流的编程语言。现如今，他们都在冷落我。。。。。。&lt;/p&gt;

&lt;p&gt;从神坛上跌落的我，有多伤心难过，你们恐怕也是难以想象。&lt;/p&gt;

&lt;p&gt;但不管怎么说，不管是开发传统网站还是前后端分离的网站，还是开发小程序和App的后端接口，我绝对是开发速度最快的语言，没有之一。&lt;/p&gt;

&lt;p&gt;当然了，这也可能是我被人诟病的地方，入门简单意味着门槛低，很多开发者在使用我的时候就不那么注重代码规范，只管代码跑起来完事。&lt;/p&gt;

&lt;p&gt;害，总之，我。。。。。。哭了。。。。。。&lt;/p&gt;

&lt;h3 id=&quot;javascript&quot;&gt;JavaScript&lt;/h3&gt;

&lt;p&gt;大家好，我是 JavaScript，作为压轴的表演嘉宾，你们能想象到，我的分量有多重。&lt;/p&gt;

&lt;p&gt;布兰登·艾克在1995年5月仅花了十天时间就把我的原型设计出来了。woc，真的牛逼坏了！瞧，就他——你们眼中的 JavaScript 之父。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/img_convert/c16e7359e2eec693ff85e2ab1a72dcc1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;一开始，我叫 &lt;strong&gt;Mocha&lt;/strong&gt;，后来网景公司为了让我蹭点 &lt;strong&gt;Java&lt;/strong&gt; 的“热度”，就把我临时改名为了 &lt;strong&gt;JavaScript&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;以至于后来的很多初学者还以为我是 &lt;strong&gt;Java&lt;/strong&gt; 的脚本语言呢，害！&lt;/p&gt;

&lt;p&gt;世界上的大多数网站都是我的使用者，主流的浏览器（&lt;strong&gt;Chrome&lt;/strong&gt;、&lt;strong&gt;IE&lt;/strong&gt;、&lt;strong&gt;Firefox&lt;/strong&gt;、&lt;strong&gt;Safari&lt;/strong&gt;）都支持我。&lt;/p&gt;

&lt;p&gt;讲真，我也没想到我会发展得这么好。&lt;/p&gt;

&lt;p&gt;对于前端程序员来说，我、HTML、CSS 是三巨头，缺一不可，我们可以说是相得益彰吧。&lt;/p&gt;

&lt;p&gt;以前，我仅限于客户端，也就是浏览器这边，随着 Node 的横空出世，我竟然可以跨界到服务器端，着实爽了一把。&lt;/p&gt;

&lt;p&gt;可能有人诋毁我，说我烂，屎山很多，但只要有浏览器在的那一天，我就会拥有众多的佣歹。&lt;/p&gt;

&lt;h3 id=&quot;总结&quot;&gt;总结&lt;/h3&gt;

&lt;p&gt;好了，就到这吧，这几个家伙 BB 了这么多，是时候安静一会了。&lt;/p&gt;

&lt;p&gt;作为群主，二哥就来简单总结一下吧。&lt;/p&gt;

&lt;p&gt;编程语言没有优劣之分，只有适不适合。&lt;/p&gt;

&lt;p&gt;学习编程，千万不要贪多，既想学这个，又想学那个，可能到最后，哪一个也不精通，不，精通这个词可能过了，哪一个都不熟练。&lt;/p&gt;

&lt;p&gt;也千万不要有这种想法，这个简单点，我学这个，学了一段时间后，发现有点难，觉得另外一个容易，换另外一个。那可真的是糟蹋了自己的大学时光啊。&lt;/p&gt;

&lt;p&gt;哪怕只是大一，时间也是宝贵的。&lt;/p&gt;

&lt;p&gt;如果你想走开发这条路，考虑到招聘岗位和学习成本，第一门编程语言首选 C 语言（科班）、Java（后端）、JavaScript（前端）。&lt;/p&gt;

&lt;p&gt;其次，可以选择 C++、Go、Python、C#。&lt;/p&gt;

&lt;p&gt;当然了，对于编程语言的学习来说，我是极度不推荐新手看书学习的，因为书要考虑到严谨性，很难兼顾趣味性。&lt;/p&gt;

&lt;p&gt;这就导致很多初学者还没入门就劝退了。&lt;/p&gt;

&lt;p&gt;我推荐前期跟着视频入门，然后不断 coding 加深理解，最后再看书深入浅出。&lt;/p&gt;

&lt;p&gt;完美的节奏，perfect。&lt;/p&gt;

&lt;p&gt;有想要不同编程语言的学习路线和学习资料的吗？可以在评论区里喊出来。&lt;/p&gt;
</description>
        <pubDate>Mon, 06 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/java/2021/09/06/biancheng.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/java/2021/09/06/biancheng.html</guid>
        
        <category>java</category>
        
        
        <category>java</category>
        
      </item>
    
      <item>
        <title>❤️用武侠小说的形式来阅读LinkedList的源码，绝了！</title>
        <description>&lt;p&gt;大家好，我是 LinkedList，和 ArrayList 是同门师兄弟，但我俩练的内功却完全不同。师兄练的是动态数组，我练的是链表。&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;一linkedlist-的剖白&quot;&gt;一、LinkedList 的剖白&lt;/h3&gt;

&lt;p&gt;大家好，我是 LinkedList，和 ArrayList 是同门师兄弟，但我俩练的内功却完全不同。师兄练的是动态数组，我练的是链表。&lt;/p&gt;

&lt;p&gt;问大家一个问题，知道我为什么要练链表这门内功吗？&lt;/p&gt;

&lt;p&gt;举个例子来讲吧，假如你们手头要管理一推票据，可能有一张，也可能有一亿张。&lt;/p&gt;

&lt;p&gt;该怎么办呢？&lt;/p&gt;

&lt;p&gt;申请一个 10G 的大数组等着？那万一票据只有 100 张呢？&lt;/p&gt;

&lt;p&gt;申请一个默认大小的数组，随着数据量的增大扩容？要知道扩容是需要重新复制数组的，很耗时间。&lt;/p&gt;

&lt;p&gt;关键是，数组还有一个弊端就是，假如现在有 500 万张票据，现在要从中间删除一个票据，就需要把 250 万张票据往前移动一格。&lt;/p&gt;

&lt;p&gt;遇到这种情况的时候，我师兄几乎情绪崩溃，难受的要命。师父不忍心看到师兄这样痛苦，于是打我进入师门那一天，就强迫我练链表这门内功，一开始我很不理解，害怕师父偏心，不把师门最厉害的内功教我。&lt;/p&gt;

&lt;p&gt;直到有一天，我亲眼目睹师兄差点因为移动数据而走火入魔，我才明白师父的良苦用心。从此以后，我苦练“链表”这门内功，取得了显著的进步，师父和师兄都夸我有天赋。&lt;/p&gt;

&lt;p&gt;链表这门内功大致分为三个层次：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;第一层叫做“单向链表”，我只有一个后指针，指向下一个数据；&lt;/li&gt;
  &lt;li&gt;第二层叫做“双向链表”，我有两个指针，后指针指向下一个数据，前指针指向上一个数据。&lt;/li&gt;
  &lt;li&gt;第三层叫做“二叉树”，把后指针去掉，换成左右指针。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;但我现在的功力还达不到第三层，不过师父说我有这个潜力，练成神功是早晚的事。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;先赞后看&lt;/strong&gt;：《Java 程序员进阶之路》专栏在 GitHub 上已经开源了，有 GitHub 账号的小伙伴，来安排一波 star 呀！看能不能冲一波 trending 榜单，求求各位了。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;GitHub 地址：&lt;a href=&quot;https://github.com/itwanger/toBeBetterJavaer&quot;&gt;https://github.com/itwanger/toBeBetterJavaer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;二linkedlist-的内功心法&quot;&gt;二、LinkedList 的内功心法&lt;/h3&gt;

&lt;p&gt;好了，经过我这么样的一个剖白后，大家对我应该已经不陌生了。那么接下来，我给大家展示一下我的内功心法。&lt;/p&gt;

&lt;p&gt;我的内功心法主要是一个私有的静态内部类，叫 Node，也就是节点。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;它由三部分组成：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;节点上的元素&lt;/li&gt;
  &lt;li&gt;下一个节点&lt;/li&gt;
  &lt;li&gt;上一个节点&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我画幅图给你们展示下吧。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/collection/linkedlist-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;对于第一个节点来说，prev 为 null；&lt;/li&gt;
  &lt;li&gt;对于最后一个节点来说，next 为 null；&lt;/li&gt;
  &lt;li&gt;其余的节点呢，prev 指向前一个，next 指向后一个。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我的内功心法就这么简单，其实我早已经牢记在心了。但师父叮嘱我，每天早上醒来的时候，每天晚上睡觉的时候，一定要默默地背诵一遍。虽然我有些厌烦，但我对师父的教诲从来都是言听计从。&lt;/p&gt;

&lt;h3 id=&quot;03linkedlist-的招式&quot;&gt;03、LinkedList 的招式&lt;/h3&gt;

&lt;p&gt;和师兄 ArrayList 一样，我的招式也无外乎“增删改查”这 4 种。在此之前，我们都必须得初始化。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;LinkedList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LinkedList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;师兄在初始化的时候，默认大小为 10，也可以指定大小，依据要存储的元素数量来。我就不需要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1）招式一：增&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;可以调用 add 方法添加元素：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;沉默王二&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;沉默王三&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;沉默王四&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;add 方法内部其实调用的是 linkLast 方法：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;linkLast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;linkLast，顾名思义，就是在链表的尾部链接：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;linkLast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;modCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;添加第一个元素的时候，first 和 last 都为 null。&lt;/li&gt;
  &lt;li&gt;然后新建一个节点 newNode，它的 prev 和 next 也为 null。&lt;/li&gt;
  &lt;li&gt;然后把 last 和 first 都赋值为 newNode。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此时还不能称之为链表，因为前后节点都是断裂的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/collection/linkedlist-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;添加第二个元素的时候，first 和 last 都指向的是第一个节点。&lt;/li&gt;
  &lt;li&gt;然后新建一个节点 newNode，它的 prev 指向的是第一个节点，next 为 null。&lt;/li&gt;
  &lt;li&gt;然后把第一个节点的 next 赋值为 newNode。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此时的链表还不完整。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/collection/linkedlist-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;添加第三个元素的时候，first 指向的是第一个节点，last 指向的是最后一个节点。&lt;/li&gt;
  &lt;li&gt;然后新建一个节点 newNode，它的 prev 指向的是第二个节点，next 为 null。&lt;/li&gt;
  &lt;li&gt;然后把第二个节点的 next 赋值为 newNode。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此时的链表已经完整了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/collection/linkedlist-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我这个增的招式，还可以演化成另外两个：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addFirst()&lt;/code&gt; 方法将元素添加到第一位；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addLast()&lt;/code&gt; 方法将元素添加到末尾。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;addFirst 内部其实调用的是 linkFirst：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;linkFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;linkFirst 负责把新的节点设为 first，并将新的 first 的 next 更新为之前的 first。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;linkFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;newNode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;modCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;addLast 的内核其实和 addFirst 差不多，就交给大家自行理解了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2）招式二：删&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我这个删的招式还挺多的：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remove()&lt;/code&gt;：删除第一个节点&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remove(int)&lt;/code&gt;：删除指定位置的节点&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remove(Object)&lt;/code&gt;：删除指定元素的节点&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;removeFirst()&lt;/code&gt;：删除第一个节点&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;removeLast()&lt;/code&gt;：删除最后一个节点&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;remove 内部调用的是 removeFirst，所以这两个招式的功效一样。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remove(int)&lt;/code&gt; 内部其实调用的是 unlink 方法。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkElementIndex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unlink&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;unlink 方法其实很好理解，就是更新当前节点的 next 和 prev，然后把当前节点上的元素设为 null。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unlink&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// assert x != null;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;modCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;remove(Object) 内部也调用了 unlink 方法，只不过在此之前要先找到元素所在的节点：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;unlink&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;unlink&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这内部就分为两种，一种是元素为 null 的时候，必须使用 == 来判断；一种是元素为非 null 的时候，要使用 equals 来判断。equals 是不能用来判 null 的，会抛出 NPE 错误。&lt;/p&gt;

&lt;p&gt;removeFirst 内部调用的是 unlinkFirst 方法：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;removeFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NoSuchElementException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unlinkFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;unlinkFirst 负责的就是把第一个节点毁尸灭迹，并且捎带把后一个节点的 prev 设为 null。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unlinkFirst&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// assert f == first &amp;amp;&amp;amp; f != null;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// help GC&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;modCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3）招式三：改&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;可以调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set()&lt;/code&gt; 方法来更新元素：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;沉默王五&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;来看一下 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set()&lt;/code&gt; 方法：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkElementIndex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oldVal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oldVal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;首先对指定的下标进行检查，看是否越界；然后根据下标查找原有的节点：&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// assert isElementIndex(index);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prev&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;size &amp;gt;&amp;gt; 1&lt;/code&gt;：也就是右移一位，相当于除以 2。对于计算机来说，移位比除法运算效率更高，因为数据在计算机内部都是二进制存储的。&lt;/p&gt;

&lt;p&gt;换句话说，node 方法会对下标进行一个初步判断，如果靠近前半截，就从下标 0 开始遍历；如果靠近后半截，就从末尾开始遍历。&lt;/p&gt;

&lt;p&gt;找到指定下标的节点就简单了，直接把原有节点的元素替换成新的节点就 OK 了，prev 和 next 都不用改动。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4）招式四：查&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我这个查的招式可以分为两种：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;indexOf(Object)：查找某个元素所在的位置&lt;/li&gt;
  &lt;li&gt;get(int)：查找某个位置上的元素&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;indexOf 的内部分为两种，一种是元素为 null 的时候，必须使用 == 来判断；一种是元素为非 null 的时候，要使用 equals 来判断。因为 equals 是不能用来判 null 的，会抛出 NPE 错误。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;get 方法的内核其实还是 node 方法，这个之前已经说明过了，这里略过。&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;E&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkElementIndex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其实，查这个招式还可以演化为其他的一些，比如说：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getFirst()&lt;/code&gt; 方法用于获取第一个元素；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getLast()&lt;/code&gt; 方法用于获取最后一个元素；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;poll()&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pollFirst()&lt;/code&gt; 方法用于删除并返回第一个元素（两个方法尽管名字不同，但方法体是完全相同的）；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pollLast()&lt;/code&gt; 方法用于删除并返回最后一个元素；&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;peekFirst()&lt;/code&gt; 方法用于返回但不删除第一个元素。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;四linkedlist-的挑战&quot;&gt;四、LinkedList 的挑战&lt;/h3&gt;

&lt;p&gt;说句实在话，我不是很喜欢和师兄 ArrayList 拿来比较，因为我们各自修炼的内功不同，没有孰高孰低。&lt;/p&gt;

&lt;p&gt;虽然师兄经常喊我一声师弟，但我们之间其实挺和谐的。但我知道，在外人眼里，同门师兄弟，总要一较高下的。&lt;/p&gt;

&lt;p&gt;比如说，我们俩在增删改查时候的时间复杂度。&lt;/p&gt;

&lt;p&gt;也许这就是命运吧，从我进入师门的那天起，这种争论就一直没有停息过。&lt;/p&gt;

&lt;p&gt;无论外人怎么看待我们，在我眼里，师兄永远都是一哥，我敬重他，他也愿意保护我。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;好了，LinkedList 这篇就到这了。&lt;/p&gt;

&lt;p&gt;如果大家有闲情逸致的话，建议手撕一下链表，可以从单向链表开始撕起。&lt;/p&gt;

&lt;p&gt;叨逼叨：我已经输出了近百篇 Java 方面的系列文章，应很多小伙伴的请求，现已开源到 GitHub 上了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/fe4d33127f6f42a1912e1c1cee1e30bb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;有 Java 核心语法、Java 集合框架、Java IO、Java 并发编程、Java 虚拟机等，只讲重点，累计已有 10 万+字，通俗易懂、风趣幽默，很多小伙伴都发来私信表示感谢&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;GitHub 开源地址（如果你也需要，欢迎 star）：&lt;a href=&quot;https://github.com/itwanger/toBeBetterJavaer&quot;&gt;https://github.com/itwanger/toBeBetterJavaer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;希望大家能&lt;strong&gt;点赞&lt;/strong&gt;下，给我注入一点点更新的动力。我也会不断地提升品质，给大家带来更硬核的技术文章，笔芯~&lt;/p&gt;

</description>
        <pubDate>Fri, 03 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/java/2021/09/03/java-linkedlist.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/java/2021/09/03/java-linkedlist.html</guid>
        
        <category>java</category>
        
        
        <category>java</category>
        
      </item>
    
      <item>
        <title>程序员，在北上广深杭赚够100万，就逃回二三四线城市生活，靠谱吗？</title>
        <description>&lt;p&gt;无意间刷到一个话题，北漂程序员，赚够 100 万，然后回三四线城市享受生活，不确定这个想法靠不靠谱。&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;讲真，我觉得我在这个话题上还是挺有话语权的。就来给大家唠唠，看能不能提供一丢丢参考价值。&lt;/p&gt;

&lt;p&gt;我没有在北京搬砖过，但在苏州搬砖过，苏州和北上广深杭比起来，肯定有差距，但不得不承认，苏州的发展速度确实是有目共睹的。&lt;/p&gt;

&lt;p&gt;目前已经在三线城市洛阳生活了多年，生活品质不能说有多高，但生活的基础条件我觉得都还过得去。尤其是其中很重要的一点，教育资源是能跟得上的。&lt;/p&gt;

&lt;h3 id=&quot;01十分怀念那苏州&quot;&gt;01、十分怀念那苏州&lt;/h3&gt;

&lt;p&gt;说实话，还是挺怀念苏州那段时光的。苏州不仅环境美、人也很 nice，和领导、和同事，之间的关系都很和谐，工资说不上有多高，但维持生活的同时，稍微存点钱还是可以的。&lt;/p&gt;

&lt;p&gt;就说一点，小米 1 刚出来的时候，特别想支持雷军一把，结果还是买了一部 iPhone 4。&lt;/p&gt;

&lt;p&gt;不是因为挣得多，而是心态很放松。前一部手机还用的是诺基亚的，黑白带按键的那种，总共也就 200 多块钱吧，电池超级耐用，充一次电，抗一周没问题。&lt;/p&gt;

&lt;p&gt;我起点属于比较低的那种，能被公司破格录用，我觉得除了自己的努力之外，就是我一直比较幸运，没遇到过过不去的坎。&lt;/p&gt;

&lt;p&gt;工作算不上很累吧，项目紧的时候加班是肯定的，我记得最多的时候，差不多每天都是 11 点左右回宿舍，周末也不例外。&lt;/p&gt;

&lt;p&gt;有那么一个月，加班费比工资还要多。工资到账的那一刻，一点累的感觉也没有，就是觉得：咦，好像加班还挺香的。&lt;/p&gt;

&lt;p&gt;项目不紧的时候，基本上是到点就走。我记得女票暑假去找我的那段时间，我基本上都是第一个冲上班车的（下班的时候），嘿嘿。&lt;/p&gt;

&lt;p&gt;但我一直有个不良习惯，就是寅吃卯粮，经常是不紧当月工资花得精光，还要借同事点补一下缺口。&lt;/p&gt;

&lt;p&gt;可能还是因为挣得太少吧，也一直没有理财的观念。&lt;/p&gt;

&lt;p&gt;所以，三年半后回洛阳的时候（带上实习期一年），手上存款少得可怜，2015 年打算在洛阳买婚房的时候连首付都不够，这还是带上取走的公积金的那部分钱。&lt;/p&gt;

&lt;h3 id=&quot;02毅然决然回洛阳&quot;&gt;02、毅然决然回洛阳&lt;/h3&gt;

&lt;p&gt;之所以回洛阳，肯定不是因为钱挣够了，离 100 万远着呢。&lt;/p&gt;

&lt;p&gt;也不是因为发展得不好，走的时候刚签了一次合同，涨了薪，领导也是一直卡着不让走，我还去求了好几次。&lt;/p&gt;

&lt;p&gt;原因其实很简单，第一，为了爱情；第二，还是念家。&lt;/p&gt;

&lt;p&gt;我这人没什么理想，感觉属于得过且过的那种吧。最喜欢的不是“天生我材必有用”，而是“天外有天人外有人”，哈哈哈。&lt;/p&gt;

&lt;p&gt;所以，我的职业规划很早就注定了。&lt;/p&gt;

&lt;p&gt;如果二嫂当时考上了同济大学的建筑系研究生，我可能会从苏州转战上海；结果二嫂差点运气没考上，回了洛阳的建筑所，那我自然而然、早早晚晚都是要回洛阳的。&lt;/p&gt;

&lt;p&gt;在外地，最大的麻烦就是一年只能回一次两次家。逢年过节，最难买的就是车票。就算是回了家，最多也只能停留一周左右的时间。&lt;/p&gt;

&lt;p&gt;走的时候，真的是不舍，都不敢多看父母一眼，生怕眼泪会控制不住，倾盆而下。&lt;/p&gt;

&lt;p&gt;回来了，这些问题都迎刃而解了。&lt;/p&gt;

&lt;h3 id=&quot;03真的是明智的选择吗&quot;&gt;03、真的是明智的选择吗&lt;/h3&gt;

&lt;p&gt;回来的第一年，二人世界过得不要太舒服，简直就像神仙眷侣一样。&lt;/p&gt;

&lt;p&gt;住的条件真的很一般，是二嫂公司的宿舍，旧房子，两室一卫一厨，同住的还有一对情侣。但是，却无比的快乐。&lt;/p&gt;

&lt;p&gt;早上一起做早餐，中午一起做午餐，晚上一起做晚餐。时间多的情况下，就去逛街看电影。周末还可以和同住的小何一起去打篮球。&lt;/p&gt;

&lt;p&gt;我的体重也是涨的飞快，回来的时候 100 斤出头，三个月的时间，飞速涨到 135 斤左右，从苏州带回来的很多裤子都穿不上了。&lt;/p&gt;

&lt;p&gt;第二年，1200 一个月租了一套三室两厅两卫的房子（二嫂同事家的平）。现在想想，真的是奢侈。房东后来说 100 万左右可以卖给我们，可惜当时木有这 100 万啊！！！！！！！&lt;/p&gt;

&lt;p&gt;要是有，就好了。那套房拆迁后能换到 190 多平的房子，目前一平能卖到 2 万左右。还是学区房，还在地铁口。&lt;/p&gt;

&lt;p&gt;2015 年下半年，我和二嫂的婚期逐渐提上了日程，所以每个周末，我们都跑去看房了。看看房价，再看看银行卡上的钱，还是觉得买房压力挺大的。&lt;/p&gt;

&lt;p&gt;因为有了买房的压力，所以那段时间还是挺迷茫的，俩人开始起一些争吵。我内心也在怀疑，回来到底是不是一个明智的选择，当初是不是应该坚持在苏州工作，或者去上海尝试一下。&lt;/p&gt;

&lt;p&gt;这种心态大概持续了三四个月的时间，直到入手第一套房子后。有了属于我们自己的房子后，突然就豁然开朗了。租房和买房之间的差别还是挺大的，买了房，意味着自己握有了这座城市最基本的入场券，最重要的是，有了学区资源。&lt;/p&gt;

&lt;p&gt;2016 年有了女儿后，更加地觉得，当初毅然决然回来的决定，实在是太明智了。&lt;/p&gt;

&lt;p&gt;人生突然有了新的奔头，感觉整个人的精气神就完全不一样了。&lt;/p&gt;

&lt;p&gt;由于后来换了工作，时间上也更自由，所以我把大把的时间都花在了陪女儿上，很多二嫂做不来的事情，我都能做得得心应手。&lt;/p&gt;

&lt;p&gt;女儿一岁多的时候，二嫂公司组织去呼伦贝尔大草原旅游，她不忍心去，我硬是把她推走了，拍着胸口信誓旦旦地给二嫂说，“放心吧，我能照顾好女儿”，我还真的做到了。&lt;/p&gt;

&lt;p&gt;现在，女儿五岁半了，我们一家三口基本上是形影不离。&lt;/p&gt;

&lt;p&gt;这周末，一起回到县城，在老丈人家，只管吃饭码字，觉得还是舒服。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/100wan-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;04收入跟不上怎么办&quot;&gt;04、收入跟不上怎么办&lt;/h3&gt;

&lt;p&gt;我觉得人分三种，一种争强好胜，一种随遇而安，一种两者皆有。&lt;/p&gt;

&lt;p&gt;我应该属于最后一种。放在任何一个环境里，我肯定不是最优秀的那一个，也不是最差的那一个。&lt;/p&gt;

&lt;p&gt;从一线城市回到三四线城市，一开始收入上肯定是有差距的。这也是很多人害怕回三四线城市的根本原因，甚至有些人，因为受不了三四线城市的低收入，重新回到一线城市。&lt;/p&gt;

&lt;p&gt;人在很多时候，靠的不只是自己的努力，还有选择啊、机遇啊。当你选择对了，机遇来了，同样可以在三四线城市赚到一线城市才能赚到的钱。&lt;/p&gt;

&lt;p&gt;前提条件是，你一定要准备好。&lt;/p&gt;

&lt;p&gt;比如说，我回洛阳的时候，网上的招聘信息过了一遍，发现有公司特别需求 PHP，我还自学了四个月的 PHP，哈哈哈。&lt;/p&gt;

&lt;p&gt;再比如说，为了每个月的绩效奖里能多一点点钱，我开始了写作，并且一直坚持到现在。&lt;/p&gt;

&lt;p&gt;现在是互联网时代，网上的机会很多时候都是公开透明的，能不能抓得住，其实和你在什么城市的关系不是特别大，不像以前。&lt;/p&gt;

&lt;h3 id=&quot;05人生没有一成不变&quot;&gt;05、人生没有一成不变&lt;/h3&gt;

&lt;p&gt;我的建议是，职业生涯的初期，多在一线城市闯荡下，看自己能否跃迁，能跃迁就留下；不能，也没什么，回到二三四线城市，还能给家乡的发展做一点点贡献。&lt;/p&gt;

&lt;p&gt;人生本来就不是一成不变的。&lt;/p&gt;

&lt;p&gt;不是所有人都需要挤破脑袋去一线，去大厂；逃离北上广深杭，选择国企、外企、创业团队，也不见得就是一件退而求其次的选择，可能是一种更好的选择。&lt;/p&gt;

&lt;p&gt;很多东西，别人说出来的，不一定是真的，只有自己亲身去感受了，才知道。&lt;/p&gt;

&lt;p&gt;赚够 100 万，就从一线城市跑到三四线城市，靠不靠谱，其实还是要和人挂钩起来。&lt;/p&gt;

&lt;p&gt;有的人，觉得不靠谱；有的人，就觉得靠谱。&lt;/p&gt;

&lt;p&gt;说实在的，100 万多不多，就现在的房价来说，真不多，在洛阳就不一定能拿下一套两居室的房子，就别提北上广深杭了。&lt;/p&gt;

&lt;p&gt;但即便是没有这 100 万，也是可以选择跑路的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;我们需要做的，就是时刻保持学习的动力，让自己保持竞争力，也只有这样，无论你身处哪个城市，肉体和灵魂才能同时装得下&lt;/strong&gt;。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;推荐下我在 GitHub 上开源的 Java 教程吧，风趣幽默，通俗易懂，目前已经更新 52 讲，共计 10万+字，看过的都说好，对 Java 初学者极度友好，&lt;strong&gt;快来 star 吧&lt;/strong&gt;！&lt;/p&gt;

  &lt;p&gt;《Java程序员进阶之路》专栏 GitHub 地址：&lt;a href=&quot;https://github.com/itwanger/toBeBetterJavaer&quot;&gt;https://github.com/itwanger/toBeBetterJavaer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;国家一直在发展，从一线城市归来的人才，在三四线城市可能会有更大的发展空间，最好时刻保持对家乡的注意力。&lt;/p&gt;

&lt;p&gt;一起加油吧！&lt;/p&gt;

</description>
        <pubDate>Thu, 26 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/08/26/100wan.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/08/26/100wan.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>想去读个研究生了！</title>
        <description>&lt;p&gt;大家好，我是突然有点想考研的二哥呀！&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;之前看到 Guide 哥发的一篇想去读个研究生了，真的是心生感慨。&lt;/p&gt;

&lt;p&gt;这让我想起我的大学同学石磊，他今年考研成功了，算是我们同学当中非常励志的一个了。他默默地坚持着，为了心中的那道光，锲而不舍，即使碰壁了，也从来没有退缩过。&lt;/p&gt;

&lt;p&gt;就像 Guide 哥说的那样：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;不论是还在学校读书的同学，还是已经工作的同学，很多都会有读研的想法，或是提升学历，或是继续在学校深造。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我以前是比较反对考研的，因为我觉得考研很浪费时间，如果研究生阶段再遇到一个不那么靠谱的导师，做点不靠谱的项目，很可能就把宝贵的三年时光给浪费掉了。&lt;/p&gt;

&lt;p&gt;再加上不是所有的人都能考研成功，考虑到考研失败带来的压力，我觉得并不划算。还不如提前进入社会这所大熔炉里面接受磨炼，不仅可以尽早积累社会经验，还可以早一点赚钱，减轻父母的压力。工作当中照样可以提升技术实力。&lt;/p&gt;

&lt;p&gt;但随着时间的推移，我的观念在悄然发生改变。&lt;/p&gt;

&lt;p&gt;拿一个朋友的亲身经历来说吧，他是双非本科，大三之前，coding 能力一般，学习成绩也一般，去互联网大厂基本上是不太现实的。如果本科后直接参加工作，就只能去小公司，甚至外包。&lt;/p&gt;

&lt;p&gt;但这个朋友一直怀揣这去大厂的梦，于是毅然决然地选择了考研。&lt;/p&gt;

&lt;p&gt;研一的时候，他自学了 Python 和深度学习，参加了 2 个算法比赛；研二的时候，由竞争激烈的 CV 算法转到了 Java 研发，并且去了两家互联网公司实习；毕业的时候，拿到了互联网大厂的工作机会。&lt;/p&gt;

&lt;p&gt;他说，读研给了他很好的缓冲期，不仅提升了学历，技术也得到了提升，让他的人生有了更多、更好的选择。&lt;/p&gt;

&lt;p&gt;这里给大家分享一个他收割大厂 offer 的公式，以 Java 岗为例：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;技术栈知识+算法+项目+实习+加分项（竞赛/开源项目/博客）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;具体可以参考他的一篇分享：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;https://zhuanlan.zhihu.com/p/349912761&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;我之所以萌生考研的想法，很大一部分原因就是因为身边人的潜移默化，另外就是希望能给自己提供一个可以专心学习的环境&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;Guide 哥在他那篇文章里推荐了 8 个 GitHub 上开源的考研项目，我都认真看了，里面的一些内容对考研的同学确实挺有帮助的，就再给大家安利一波。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1）cskaoyan&lt;/strong&gt;，收集了各个大学的计算机考研初试真题&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/yanjiusheng-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;河南一个没有，哭了&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;项目地址：https://gitee.com/SnailClimb/cskaoyan&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2）2021-Postgraduate-408&lt;/strong&gt;，推荐了一些公认的视频资料、教辅资料&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/yanjiusheng-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;其实这些资料即便是不用考研，也是可以去看的，我之前也有推荐过。&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;项目地址：https://github.com/hao14293/2021-Postgraduate-408&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3）Hello_HDU&lt;/strong&gt;，主要针对的是杭州电子科技大学计算机考研信息汇总。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/yanjiusheng-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;这个研究生奖助政策，感觉真心不错。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/yanjiusheng-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;项目地址：https://github.com/ztygalaxy/Hello_HDU &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;关于考研这件事，对每个人来说，永远没有标准答案，&lt;strong&gt;你永远只能自己选择自己走的路&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;有一说一，计算机考研的难度并不算小，对于跨专业的同学来说，难度更大。短短半年时间，要考数学、政治、英语和计算机专业课，时间实在是太少了。&lt;/p&gt;

&lt;p&gt;如果我决定考研的话，打算报个班，一是避免采坑，二是刺激自己，毕竟花了钱。&lt;/p&gt;

&lt;p&gt;悄悄地告诉大家，二哥还是很拼的，已经研究了计算机考研的重点，嘻嘻。这里就不藏着掖着了，给大家分享下。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1）数据结构&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;重点学会如何计算时间复杂度和空间复杂度；&lt;/li&gt;
  &lt;li&gt;掌握基本的数据结构，比如说线性表、栈、队列等；&lt;/li&gt;
  &lt;li&gt;掌握树与二叉树，着重掌握递归的思想；&lt;/li&gt;
  &lt;li&gt;掌握图的各种存储方式和遍历方法；&lt;/li&gt;
  &lt;li&gt;学会排序和查找。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;数据结构本身并不难，难的是各种算法的设计，所以一定要学会举一反三，记住什么问题可以用什么算法解决。&lt;/p&gt;

&lt;p&gt;教材：严蔚敏的《数据结构》&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2）计算机组成原理&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;下图是我在看哈尔滨工业大学的计算机组成原理时截的图。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/yanjiusheng-05.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;计算机组成原理应该是计算机所有专业课里面比较难的一门了，因为涉及到有很多抽象的物理概念，以及晦涩的理论知识。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;计算机系统概论&lt;/li&gt;
  &lt;li&gt;运算方法和运算器&lt;/li&gt;
  &lt;li&gt;内部存储器&lt;/li&gt;
  &lt;li&gt;指令系统&lt;/li&gt;
  &lt;li&gt;CPU&lt;/li&gt;
  &lt;li&gt;总线&lt;/li&gt;
  &lt;li&gt;输入输出设备&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;学习计算机组成原理的时候，会涉及到很多很多概念，每个概念剥茧抽丝后，又会牵扯出很多相关的概念，比如说你想理解 CPU 是如何实现加法运算的，你就会遇到算术逻辑单元这个概念，然后还要理解计算机是如何把整数表示成二进制数的等等。&lt;/p&gt;

&lt;p&gt;教材：唐朔飞的《计算机组成原理》以及配套的学习指导和习题解答。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3）操作系统&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;进程管理，进程的互斥和同步是最难也是最爱考的知识点了；&lt;/li&gt;
  &lt;li&gt;内存管理；&lt;/li&gt;
  &lt;li&gt;文件管理，主要是磁盘的调度算法；&lt;/li&gt;
  &lt;li&gt;输入输出管理，和计算机组成原理有一定的关联。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;教材：汤子瀛的《计算机操作系统》&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4）计算机网络&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;计算机网络这门课的知识点非常多，也非常杂。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;计算机网络的体系结构，重点掌握 ISO/TCP 协议的参考模型以及模型各层的功能；&lt;/li&gt;
  &lt;li&gt;物理层，重点掌握物理层的通讯技术；&lt;/li&gt;
  &lt;li&gt;网络层，重点掌握拥塞控制方法，IP 协议，以及路由器的工作原理；&lt;/li&gt;
  &lt;li&gt;传输层，重点掌握 TCP/UDP；&lt;/li&gt;
  &lt;li&gt;应用层。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;教材：谢希仁的《计算机网络》&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;讲真，石磊考研这件事对我触动真的挺大的。原本我已经把考研这扇门上了锁，现在不知不觉已经把钥匙插进了钥匙孔，如果再使点劲，可能就真的去卷在职研究生了。&lt;/p&gt;

&lt;p&gt;至于全日制的，还是非全的，其实差别不大，即便是非全，考试也不会轻松，都要参加 12 月全国研究生统一考试。&lt;/p&gt;

&lt;p&gt;2016 年以前，非全可以参加 10 月份的考试，难度比 12 月统考的难度略低，毕业后发单证，2016 年已经取消了。可能有一部分人对非全的偏见正来源于此。&lt;/p&gt;

&lt;p&gt;非全和全日制只是学习模式不同而已，“研究生”才是正儿八经的标准。&lt;/p&gt;

&lt;p&gt;最后呢，二哥还是想说一句。&lt;/p&gt;

&lt;p&gt;考不考研，最核心的还是能力，这才是你最硬核的武器，只想通过考研提升学历的想法并不可取。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;推荐下我在 GitHub 上开源的 Java 教程吧，风趣幽默，通俗易懂，目前已经更新 52 讲，共计 10万+字，&lt;strong&gt;快来 star 吧&lt;/strong&gt;！&lt;/p&gt;

  &lt;p&gt;《Java程序员进阶之路》专栏 GitHub 地址：&lt;a href=&quot;https://github.com/itwanger/toBeBetterJavaer&quot;&gt;https://github.com/itwanger/toBeBetterJavaer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;三分天注定，七分靠打拼，读研不是目的，学习和成长才是&lt;/strong&gt;，我们一起加油吧~&lt;/p&gt;

</description>
        <pubDate>Mon, 23 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/08/23/yanjiusheng.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/08/23/yanjiusheng.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>IT 农民工被官方石锤了！</title>
        <description>&lt;p&gt;想必大家的票圈都炸了吧，关于官方认证我们程序员为农民工这件事。我看大多数人心态都挺稳的，只有极少数人有点崩，我就来谈谈我的看法吧。&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;推荐下我在 GitHub 上开源的 Java 教程吧，风趣幽默，通俗易懂，目前已经更新 51 讲，通过二哥与三妹对话的形式，还穿插了不少精美的手绘图，&lt;strong&gt;快来 star 吧&lt;/strong&gt;！&lt;br /&gt;
《教妹学Java》专栏 GitHub 地址：&lt;a href=&quot;https://github.com/itwanger/jmx-java&quot;&gt;https://github.com/itwanger/jmx-java&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;官方认证后，父亲和我都是农民工了，哈哈哈。父亲是老年代农民工，我是新生代农民工，以后我们俩的话题就多了呀！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nongmingong-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我能想到的一个词就是——子承父业，完美！&lt;/p&gt;

&lt;p&gt;其实在官方认证之前，我们程序员就自诩为“码农”、“IT农民工”了。很多人还批评我们傲娇，现在名也正了、言也顺了。&lt;/p&gt;

&lt;p&gt;确实，计算机行业除了也算是知识密集型产业之外，和农民工之间的相似之处实在是太多了：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;大家都把青春和热血洒在了大城市，却又很难在大城市落户安家。&lt;/li&gt;
  &lt;li&gt;起得比鸡早、睡得比狗晚，工作时长是出了名的长。&lt;/li&gt;
  &lt;li&gt;老年代农民工在工地搬砖，新生代农民工在写字楼搬砖。&lt;/li&gt;
  &lt;li&gt;老年代农民工干的是体力活，新生代农民工 996/007 也是在身体力行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;来看一下新生代农民工的定义：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;出生在 1980 年后，进城从事非农业生产 6 个月及以上的，常住地在城市，户籍在乡村的劳动力，是新时代的产业工人。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;讲真，我完全符合这个定义。户口在我们老家，常住地在洛阳涧西区，从事的是软件和信息技术服务业，工龄超过 13 年。&lt;/p&gt;

&lt;p&gt;其实说白了，只要你是农村户籍，然后在外打工，不管你打的什么工，不管你什么学历，不管你月薪多少，不管你福利待遇怎么样，统统都是农名工。&lt;/p&gt;

&lt;p&gt;还有符合定义的小伙伴吗？可以在评论区举个手。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nongmingong-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;农民之所以进城打工，原因有两个，一个就是打工挣的钱确实会比务农多一点；另外一个就是打工是不分季节的，而冬季是没办法务农的。&lt;/p&gt;

&lt;p&gt;我上学的时候，父亲外出打工都是趁农闲的时候。&lt;/p&gt;

&lt;p&gt;我去苏州实习那年，家里的负担一下子减轻了一大半，于是父亲和母亲就下定了决心：离开农村，走向城市。那是他们以前想都不敢想的事情，因为怕不种庄稼后没有稳定的收入，影响我上学。&lt;/p&gt;

&lt;p&gt;他们本身就很节俭，少了我的支出后，外出打工时就没有了后顾之忧。于是家里的地都丢给了我小叔，俩人去了三门峡。没来洛阳一是因为我们村离三门峡市更近一点，二是三门峡的消费水平比洛阳低一些。&lt;/p&gt;

&lt;p&gt;估计父母也没想到，他们辛苦供我上学，想让我通过知识改变命运，没成想，还是接了他们的班，哈哈哈。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;真应了那句话：出走半生，归来仍是农民工（狗头）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;当然了，我比父母稍微好一点的是，能在洛阳这样的三线城市买套房，握了一张入场券，女儿可以在城市上学读书，只要以后不做程序媛，没准经过三代人的努力就真的改变命运了。&lt;/p&gt;

&lt;p&gt;讲点现实的吧。因为做自媒体嘛，就认识了很多朋友和读者，但能在北上广深杭这些城市落户的，还真的是极少数。&lt;/p&gt;

&lt;p&gt;即便是在北京一线大厂的，比如说字节跳动（薪资真不算低了），也是考虑在老家成都买套房，再干两三年回去。&lt;/p&gt;

&lt;p&gt;大多数人都逃不过，干上三五年，积攒了一定的原始成本后，回二三线城市买房结婚。甚至有些即便是结了婚，买了房，也很少敢下定决心，回到二三线城市生活。&lt;/p&gt;

&lt;p&gt;可能有少数人觉得自己这么拼，辛辛苦苦上学，兢兢业业打工，最后竟然被定义成了农民工，心里不舒服，但其实真没啥，以后程序员被欠薪了，咱就可以走农民工讨薪渠道啦。&lt;/p&gt;

&lt;p&gt;多好。&lt;/p&gt;

&lt;p&gt;不管是「新生代农民工」还是「码农」，这样的称谓都不影响我们这个群体为社会发展所做出的贡献。就像报告里指出来的，2020 年监测数据显示，新生代农民工占比达到 50.1%，也就是说我们至少贡献了一半的力量。&lt;/p&gt;

&lt;p&gt;送大家一段话吧，武卫东说的，感觉特别好。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;码农的草帽底下，是一颗充满创造力的自由不羁的头脑。他们遵从最佳实践而痛恨陈规教条，他们欣赏天才而不迷信权威，他们喜欢思考而不轻易苟同。&lt;/p&gt;

  &lt;p&gt;他们是技术人，却追求人文理想；他们敢于呐喊，说出自己的观点和主张，也更善于脚踏实地，用自己的点滴工作去改变现状。&lt;/p&gt;

  &lt;p&gt;码农们是勤奋的，加班加点的工作是常有的事情，城市夜间的灯火，有多少是在码农们的办公室和居所点燃？周末四处举办的技术交流和讲座，又活跃着多少码农的身影？线下读书，线上讨论，冥思苦想，动手实践，新技术驱动着码农们的脚步，码农们在改变着我们的生活。&lt;/p&gt;

  &lt;p&gt;生存离不开农民，生活离不开码农。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;新生代的农民工可以把&lt;strong&gt;点赞&lt;/strong&gt;安排一个了，我看看有多少人哈。&lt;/p&gt;

&lt;p&gt;把我的座右铭送给大家吧：&lt;strong&gt;没有什么使我停留——除了目的，纵然岸旁有玫瑰、有绿荫、有宁静的港湾，我是不系之舟&lt;/strong&gt;。&lt;/p&gt;
</description>
        <pubDate>Thu, 19 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/08/19/nongmingong.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/08/19/nongmingong.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>大二上半学期还挂科两门，大三上半学期就找到了外企实习工作，半年时间，我是怎么逆袭的？</title>
        <description>&lt;p&gt;大家好，我是二哥呀！&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;虽然十多年过去了，但回想起大一时候的光景，仍然历历在目。&lt;/p&gt;

&lt;p&gt;由于计算机专业是学校新开的专业，所以老师们也没有多少教学经验，于是我们第一学期就直接开搞 Java  这门编程语言了，教材用的是大名鼎鼎的《Java 编程思想》和《Java 开发宝典》。&lt;/p&gt;

&lt;p&gt;由于没有一丁点编程基础，所以上课的时候完全听不懂，看书就像是看天书一般，心里很慌，但也没什么好办法。&lt;/p&gt;

&lt;p&gt;和我类似情况的同学还有不少，能在下半学期转到其他专业的都转了；不能转的，就和我一样瞎胡混着。&lt;/p&gt;

&lt;p&gt;现在想想，这有点小庆幸呀，要是当时我学习成绩再好点，转了专业，说不定真的后悔一辈子，哈哈哈。&lt;/p&gt;

&lt;p&gt;不知道大家有没有类似的经历哈，包括玩游戏耽误课程，最后自暴自弃，甚至有些小伙伴毕业的时候毕业证都没能顺利拿到，特别耽误事。&lt;/p&gt;

&lt;p&gt;作为“侥幸”走出来的“过来人”，给大家提几点个人建议吧。&lt;/p&gt;

&lt;h3 id=&quot;01大学同样需要自律&quot;&gt;01、大学同样需要自律&lt;/h3&gt;

&lt;p&gt;上高中的时候，老师天天给我们灌输这样一种理念：“同学们，好好学呀，等你们上了大学就可以彻底放松了，那时候再也没有人管你们，想怎么浪随你们的便。”&lt;/p&gt;

&lt;p&gt;实际情况呢，如果大学真的彻底放纵了，之前多少年的努力都可能化为乌有。&lt;/p&gt;

&lt;p&gt;之前就有几个小伙伴给我倾诉心声，说自己大学没有好好学，毕业后找不到工作，又害怕进培训班被坑，后悔的要命。&lt;/p&gt;

&lt;p&gt;确实呀，大学同样需要自律。我们班就有这么三四个同学，比如说我提到的石磊同学，他上大学的时候就有自己的规划，所以编程功底一直都很好。&lt;/p&gt;

&lt;p&gt;还有一个叫海洋的同学，现在在苏州，已经做到技术总监的位置。大学的时候，他经常把自己锁在机房，独自学习编程。&lt;/p&gt;

&lt;p&gt;我呢，经常是拿着笔记本电脑打单机游戏，日子过得一塌糊涂。&lt;/p&gt;

&lt;p&gt;这里叮嘱大家一句哈，大学千万不要贪图享乐，每个学期都应该给自己提前规划好，比如说要刷撒币算法题，要学习数据结构，要吃透 CSAPP。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;要像一块海绵一样，疯狂地吸收知识，也只有这样，才能找到满意的工作&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;可以少参加一些社群，多泡泡图书馆，多读一些计算机经典书籍，比如说《代码整洁之道》、《浪潮之巅》等等，还有各种黑皮书。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;02只要开始就不怕晚&quot;&gt;02、只要开始就不怕晚&lt;/h3&gt;

&lt;p&gt;我是大二下半学期才开始意识到危机的，因为当时汇编和计算机网络都挂科了。再这么下去，拿毕业证都成问题，这简直对我打击太大了。&lt;/p&gt;

&lt;p&gt;于是就下定决心，一定要弥补一下。&lt;/p&gt;

&lt;p&gt;当时也没有很好的学习路线，网上的资源也没有现在这么丰富，手头上有的一份视频资料就是李兴华老师的讲课视频。讲 Java 的，很激情。&lt;/p&gt;

&lt;p&gt;我去，刚刚去搜了一下，竟然还能搜得到李老师讲课的视频！关键是，智能ABC输入法还在！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;一开始，还是挺难的，因为基础太差，很多听不懂。没办法，我只好一遍听不懂，就再听一遍，前前后后一套视频看了有三遍吧。&lt;/p&gt;

&lt;p&gt;当然了，编程是看不会的，也听不会的，只能练，我不仅照抄李老师的代码，自己还把谷歌拼音输入法给卸载了，切换成了智能 ABC。以至于我现在打字仍然是最多只敲两个字，除非是成语。&lt;/p&gt;

&lt;p&gt;我是先看李老师在讲义上的代码，然后暂停，自己去理解，理解不了就去背，然后脑子里有点东西的时候就下手去敲。卡壳的时候，就重复之前的动作，直到代码的完整逻辑全部都吸收到了脑子里。&lt;/p&gt;

&lt;p&gt;两个月时间过去后，就有了点编程基础，然后就尝试自己主动去修修改改，看是不是还能跑的通。&lt;/p&gt;

&lt;p&gt;等到大三的时候，也许是努力得到了老天的眷顾，就拿到了一家外企的实习offer。&lt;/p&gt;

&lt;h3 id=&quot;03认清现实很重要&quot;&gt;03、认清现实很重要&lt;/h3&gt;

&lt;p&gt;我在实习的时候，有主动去看 C++ 的书，就是那本《C++ Primer》，第四版的，现在那本书以及习题册还在家里摆着，算是陪伴了快十年的时间了吧。&lt;/p&gt;

&lt;p&gt;没有丢掉它，因为前辈有给我说，以后有机会，还是要学习一下 C++ 的，这门编程语言实在是太经典了。前辈的话，让我对 C++ 充满敬畏。&lt;/p&gt;

&lt;p&gt;但时间过去了这么多年，仍然没有机会和时间去学习 C++，因为一入 Java 深似海啊！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;前几天我画了一张思维导图，重新梳理了 Java 后端工程师的学习路线图（参照自我的偶像程序羊），发现 Java 这个海是真的大呀~&lt;/p&gt;

&lt;p&gt;之前有小伙伴问我，学 Java 太难了，要不要转前端？&lt;/p&gt;

&lt;p&gt;有一说一，经过这么多年的发展，其实前端要学习的东西也不少！&lt;/p&gt;

&lt;p&gt;我们一定要认清现实，学编程并非一朝一夕的事情。不能说 Java 难就转前端，前端难就转测试，到最后可能什么都没学好。&lt;/p&gt;

&lt;p&gt;大二下半学期认真补了一把 Java 后，虽然时间短，很多东西只学到了皮毛，比如说并发编程、Java 虚拟机，但经过这半年的刻苦努力，确实入门了。&lt;/p&gt;

&lt;p&gt;有了这个基础，实习的时候虽然做的都是比较简单的任务，但基本上能独立完成任务了。&lt;/p&gt;

&lt;p&gt;能独立完成任务后，整个人的精气神就完全不一样了，学习的欲望和动力就有了，整个人经常能进入一种沉浸的状态，疯狂地吸收，人也越来越自信，之前的那种颓丧的感觉终于一扫而光了。&lt;/p&gt;

&lt;p&gt;虽然我们学习的是计算机科学与技术，要学习计算机组成原理、操作系统、数据结构与算法，但大多数情况下，我们还是应该把编程语言给学好了，只有这件事做好了，你才能在学习编程的这条道路上走得更远。&lt;/p&gt;

&lt;p&gt;所以大家在大一的时候尽量就确认好自己要学习哪一门编程语言，尽量不要来回切换，虽然编程思想是相通的，但语法上的切换仍然是需要花费时间和精力的。&lt;/p&gt;

&lt;p&gt;我的建议是，大一上半学期尽量选择 C 语言来打基础，有了 C 语言作为基础，大一下半学期就可以无缝切换到 Java 语言上来。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-05.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果真的很有天赋，在学完 C 语言后可以尝试实现一个自己的编程语言，可以参照下面这个项目路线，一个 1000 行左右代码的简单 Lisp：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;https://www.shiyanlou.com/courses/670&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;当然了，如果遇到困难，比如说 C 语言的指针实在是吃不透，也没关系的，完全可以直接跳过，开搞 Java。&lt;/p&gt;

&lt;p&gt;Java 语言的好处就不用我多吹了，我只说一点，Java 后端开发岗的薪资是真的挺香的，另外就是工作岗位是真的挺多的。&lt;/p&gt;

&lt;p&gt;卷并快乐着~&lt;/p&gt;

&lt;p&gt;选择 Java，就意味着工作岗位就稳了，这是最实际的考虑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;零基础学习 Java 的话，首推二哥连载的《教妹学Java》专栏&lt;/strong&gt;，风趣幽默，通俗易懂：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://github.com/itwanger/jmx-java&quot;&gt;https://github.com/itwanger/jmx-java&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;通俗易懂，风趣幽默，已更新到第 51 篇，喜欢这个专栏的可以帮二哥多多宣传一下，GitHub 上虽然只有 99 个 star，但二哥有信心把它推到 1000 个 star，嘿嘿嘿。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-05.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;（强烈暗示了哈）&lt;/p&gt;

&lt;h3 id=&quot;04学编程没有捷径&quot;&gt;04、学编程没有捷径&lt;/h3&gt;

&lt;p&gt;学习从来无捷径，循序渐进登高峰。&lt;/p&gt;

&lt;p&gt;很长一段时间内，我都是一名偏应用型的选手，就是公司给我安排的任务，我就是能解决（哈哈，主要靠搜索引擎），但是要我讲理论知识，真的是抓瞎。&lt;/p&gt;

&lt;p&gt;一般来说，学编程的人分两种。&lt;/p&gt;

&lt;p&gt;一种从理论基础开始；一种从应用实战开始。&lt;/p&gt;

&lt;p&gt;大学科班一般走的是第一种，培训班出身或者自学的，一般走的是第二种。&lt;/p&gt;

&lt;p&gt;这两种学习方式我认为都没有问题，没有孰轻孰重。&lt;/p&gt;

&lt;p&gt;因为每个人的潜力不同，只要是奔着一个目的（把编程学好）去的，都没有捷径，必须得身经百战，才能成为一名合格的工程师。&lt;/p&gt;

&lt;p&gt;唯一我认为可以投机取巧的一点就是，趁早搞清楚自己要去哪一家公司，要应聘哪一个岗位。&lt;/p&gt;

&lt;p&gt;去招聘网站上，去公司主页上，去校园信息网上，找到岗位职责和技能清单。比如京东上的 Java 高级工程师。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/itwanger/itwanger.github.io/assets/images/2021/08/nixi-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;大学阶段，尽量不要把精力放到新技术和新框架上，不要说 RabbitMQ 很火，就去学 RabbitMQ，不要说 Kafka 很火，就去学 Kafka，而是要有的放矢。&lt;/p&gt;

&lt;p&gt;你想要去的岗位要求什么，就去学什么，那些新技术和新框架，完全可以放到工作以后，有需要的时候再去学，把有限的时间投放到最能表现出你个人价值的地方。&lt;/p&gt;

&lt;h3 id=&quot;05最后的建议&quot;&gt;05、最后的建议&lt;/h3&gt;

&lt;p&gt;学习，一定要选一门好的教程，无论是一本书，还是一个视频，还是在线的网课。如果不知道怎么选，就听二哥的，保准靠谱。&lt;/p&gt;

&lt;p&gt;选对了，就可以少走很多弯路。&lt;/p&gt;

&lt;p&gt;有一说一，如果我大一的时候就看的是李兴华老师的视频课程，而不是跟着学校老师走，也许我就不会在大一的时候对编程失去了兴趣。&lt;/p&gt;

&lt;p&gt;我的学习建议是，大一上半学期从 C 语言开始，大一下半学期从 Java 语言开始，而不是一上来就把重心放到操作系统、计算机网络、计算机组成原理这些课上，因为如果兴趣没有培养起来的话，可能就直接被劝退了。&lt;/p&gt;

&lt;p&gt;计算机专业的课，并没有想象中那么简单。&lt;/p&gt;

&lt;p&gt;我们需要先培养兴趣，比如说学了 C 语言，学了 Java 语言，做个小游戏，做个计算器，做个聊天室、做个在线商城、做个图书管理系统；等有了一定的编程基础后，大二的时候，就可以配合数据结构与算法、计算机组成原理这些基础课开始学，把自己打造成一名“六边形”战士。&lt;/p&gt;

&lt;p&gt;从大一开始，就按照招聘要求上的来，等到校招的时候，基本上你就超过了 95% 以上的同学了。&lt;/p&gt;

&lt;p&gt;不付出比他人更努力的代价，是不可能脱颖而出的。&lt;/p&gt;

&lt;p&gt;顺势而为，跟着学习欲望走，不要轻易中断，一旦你进入沉浸式的学习状态中，就可以在很短的时间内取得令人刮目相看的成绩。&lt;/p&gt;

&lt;p&gt;记得帮二哥三连哟，笔芯~&lt;/p&gt;
</description>
        <pubDate>Tue, 17 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://www.itwanger.com/life/2021/08/17/nixi.html</link>
        <guid isPermaLink="true">https://www.itwanger.com/life/2021/08/17/nixi.html</guid>
        
        <category>程序员</category>
        
        
        <category>life</category>
        
      </item>
    
  </channel>
</rss>
