精华内容
下载资源
问答
  • 先来看这样一个计划: 6:30 起床洗漱 7:30 早餐 8:00 背英语单词 9:30 健身,简单运动 12:00 美味午饭 ...but,如果能这样坚持一个寒假,算我输,不是已经成仙了! 说句实在话,临近放假了,我自己

    先来看这样一个计划:

    6:30 起床洗漱
    7:30 早餐
    8:00 背英语单词
    9:30 健身,简单运动
    12:00 美味午饭
    14:00 饭后午休/朋友谈心
    16:00 看部电影/学计算机编程
    18:00 舒心晚餐
    20:00 读书
    22:00 睡觉

    瞧瞧,瞧瞧,同学们瞧瞧,这个计划整得怎么样?很充实很详细吧!but,如果你能这样坚持一个寒假,算我输,你不是人,你已经成仙了!

    说句实在话,临近放假了,我自己都有点飘飘然,心不静,真的。工作上只求稳妥,不求表现,顺顺利利把这一周多的时间耗过去就是福啊,千万别出幺蛾子。

    说个我身边的例子吧。我妹,真的身边人,已经放假二十多天了,电脑就没打开过,一行代码都没敲过,所以我得赶紧整个靠谱的方案给她规划一下。

    PS:在此之前,我专门针对她写过一个回答:

    计算机学院的学生该怎样提高自己的编程能力?

    其实吧,我们也没必要自我欺骗,说要完成几个或者十几个目标,完成一两个目标就很不错了。毕竟,我们都是个平凡的人哪。

    寒假一个半月的时间,我认为一名大学生可以从 4 个方面着手,个人提升、学习考证、额外技能、面试刷题。

    01、个人提升

    假期的时间是最连贯的,几乎零打扰。除了偶尔约同学出去逛个街、喝个小酒,剩下的时间大把大把,真的是这样,饭不用做,衣服不用洗,父母给安排的明明白白的。

    时间这么充沛的情况下,通过视频来提升自己应该是最恰当的方式了,因为视频的整个体系都是非常完整的,比起白纸黑字,视频的观感也更符合大学生的诉求。

    在我看来,B 站是一个非常牛逼的学习网站(真心的),上面的内容包罗万象,应有尽有。比如计算机网络、计算机组成原理、操作系统、数据库、算法与数据结构,以及各种编程语言的学习教程。

    1)计算机网络

    当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。

    计算机网络方面的视频我推荐湖科大教书匠的《计算机网络微课堂》,制作得非常用心,是一部不可多得的佳作。目前更新了 73 小节,每节 20 分钟左右,很适合在假期刷。

    视频地址如下所示:

    https://www.bilibili.com/video/BV1c4411d7jb

    2)计算机组成原理

    众所周知,计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。

    弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。

    如果想深入学习计算机组成原理的话,我推荐哈工大的这门视频课,整体评价非常高。一共 128 节,每节课差不多 10 分钟左右,建议 1.5 倍速食用。

    视频地址如下所示:

    https://www.bilibili.com/video/BV1WW411Q7PF

    3)操作系统

    为什么要学习操作系统呢?第一,面试要考;第二,无论学习哪门子编程语言,比如说 Java、C/C++,还是 D++(走错片场了),都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;第三,学习操作系统,还能学到内存分配方面的知识。

    我推荐清华大学的《操作系统》课,虽然清华大学的校门进不去,清华大学的视频课还是可以白嫖的嘛。一共 98 小节,每节课差不多 15 分钟左右。

    视频地址如下所示:

    https://www.bilibili.com/video/BV1js411b7vg

    关于计算机网络、计算机组成原理、操作系统之间的关系,我们可以用一幅图来表示下。

    4) 数据库

    数据库,其实是一种经常被我们忽略,但实际上相当重要的课程,尤其是在海量数据的信息化时代。使用数据库可以高效且条理分明地存储数据,方便我们进行有效的检索和访问。一个软件如果没有数据库的支撑,就相当于空有一副皮囊却没有灵魂。

    要想学好数据,首先要学习一下 SQL,我推荐一个老外的视频课(中字版啦),内容制作得非常棒,所以完全不用担心听不懂。155 小节,但每节课大概只有 1 分钟或者 5 分钟的长度,真 10 个小时就能学完。

    视频地址如下所示:

    https://www.bilibili.com/video/BV1UE41147KC

    然后再学习一下市场占有率非常高的 MySQL,视频我推荐尚硅谷的一个课程,女老师讲的。不得不承认,老师讲得很精彩,嗯,弹幕里也很精彩。350 集,内容量巨大。

    视频地址如下所示:

    https://www.bilibili.com/video/BV12b411K7Zu

    目前大多数公司的存储都是 MySQL + Redis,MySQL 作为主要的存储方式,Redis 作为缓存,用来加快热点数据的读写速度,从而提高性能。所以学完 MySQL,可以趁热打铁学一下 Redis。我推荐狂神说的 Redis 课程,一共 36 小节,每节课差不多 20 分钟

    视频地址如下所示:

    https://www.bilibili.com/video/BV1S54y1R7SB

    5) 算法与数据结构

    无论什么时候,程序=数据结构+算法这种说法都是成立的。浙江大学的一个的课还是挺不错的(我推荐过很多次了),很系统很经典,适合小白入门。143 小节,每节课五六分钟,男女老师混合讲,不同的台风,学习起来也会轻松一些。

    视频地址如下所示:

    https://www.bilibili.com/video/BV1JW411i731

    6)编程语言

    学完基础课,就要学编程语言了,也只有学了编程语言,我们程序员才能写出有应用价值的程序,才能在毕业后找到一份称心如意的工作。如果时间充足的话,我建议先学习 C 语言打好基础,然后再学 C++ 或者 Java 作为工作语言。

    学习 C 语言的话,我推荐浙江大学的翁恺教授的课程,讲得非常棒,我已经是第 3 次推荐了吧。132 小节,每节课差不多 10 分钟,学习起来很轻松。老师背后的书是真的多,有不少是英文原版的,我偷偷地买了好几本,哈哈。

    视频地址如下所示:

    https://www.bilibili.com/video/BV19W411B7w1

    学习 C++ 的话,推荐侯捷老师的全家桶。不过,由于版权问题,B 站上已经全部下架了,很可惜。不过,油管上还可以看,直接搜「侯捷」就可以了。基本上看过的人都说好,强烈推荐。

    学习 Java 的话,推荐尚硅谷的一个课程,717 小节,我天呐,必须 2.0 倍速食用!

    视频地址如下所示:

    https://www.bilibili.com/video/BV1Kb411W75N

    02、学习考证

    考证方面,我认为大学最重要的就是四六级了,对于我们程序员来说,英语功底好一些,优势还是非常大的。四六级早点考的话,还可以吃一吃高中时候的老本。

    温馨提示,千万不要把四六级考试当做是走流程,报名费虽然不贵,但还是要心疼一下的。要想一次性过四级,难度应该不大,一次性过六级的话,可能有点难度,但重要的是,一定要多做真题,多做真题,多做真题。考试前的一个月,最好每天做 2 套真题。

    考试考的就是阅读理解,单词如果都不认识的话,上下文的意思就不可能读的懂。所以单词还是要背的,就像学习古诗词一样,如果背不会的,装文化人的时候会吃亏啊。

    然后就是听力,多刷刷美剧还是有好处的,推荐《绝望的主妇》、《老友记》、《生活大爆炸》。

    再然后是写作,这玩意必须多练,把近十年的真题全部过一遍,分门别类下,找出适合自己的套路。

    对了,除了四六级,还有个驾照,这个我之前也提到过,还是要趁大学的时候考一下。

    如果想考公务员或者考研,假期的时间一定要利用起来,提前规划好。

    03、额外技能

    现如今,我认为这 3 个额外技能非常非常非常重要:

    1、PS

    2、视频剪辑

    3、PPT

    先说 PS。

    我这个头像大家也看到了,很佛,像个四五十岁的大叔。一直想换一个年轻态点的头像,又怕这个头像形成了品牌文化,换一个后大家需要重新去记忆。

    一开始就迫切想要一张个性化的头像,但没找到合适的,就用的迈克尔杰克逊,后来掏了 36 块钱请一个专业设计师 PS 了一个(就是目前这个),虽然不太满意,但奈何自己不会 P。

    我大学那会是有 PS 这门课的,只不过那时候没有好好学,导致工作后 PS 个背景图了,或者搞个二维码了,还得找人 PS,很麻烦。想学 PS 的话,我推荐《敬伟 PS 教程全集》,202 集,制作非常精良。

    视频地址如下所示:

    https://www.bilibili.com/video/av18792821

    再说视频剪辑。

    啊,这篇内容已经推荐了好多好多视频了,可想而知,视频剪辑的重要性多么的不言而喻。不论是刷 B 站,还是刷抖音,每个视频都是经过精心处理的,如果不是精心处理过的,那基本上不会进入我们的视野,因为视频实在是太能喝了——海量啊。

    视频的商业价值就不用我再赘言了吧,瞧瞧 B 站的股价就能明白,瞧瞧张小龙对视频号的重视程度就知道。如果能够剪得一手好视频,大学就能自己养活自己。

    我推荐 vikk 的视频剪辑教学,一共就 8 节课,可以说是寓教于乐,干货满满。

    最后说说 PPT。

    这么说吧,如果能够写得一手好 PPT,不光能像贾跃亭那样揽财无数,还能在公开演讲、述职报告、年终总结、季度汇报上大放异彩。记得之前某个明星的危机公关都上的 PPT,嘿嘿嘿。

    至于 PPT 方面的视频,我就不再推荐了,算是留给同学们的作业题。

    04、面试刷题

    经常有同学问我刷题重不重要,这个问题真的不需要多问了,如果不重要的话,就不叫面试刷题了。公司怎么考核你,最简单的方法就是通过面试题,你平常学那么多,用了那么多功,到头来,怎么证明自己有能力,就是面试题。

    那有些同学可能要问了,我才大一,要刷题吗?

    当然要啊,提前做准备,把刷题的道路摸清楚它不香吗?临时抱佛脚可能有用,但长期的积累才是根本,对吧?

    提前就刷起来,到时候绝不会吃亏!我问了身边很多大佬,他们给我推荐一份刷题笔记,真心不错呀!来自一位 BAT 的大佬,真踏马强啊,不服不行。

    可通过下面的链接获取这份 PDF,加黑加粗!!!

    https://blog.csdn.net/qing_gee/article/details/111808908

    GitHub:https://github.com/itwanger/JavaBooks

    码云:https://gitee.com/itwanger/JavaBooks

    CodeChina:https://codechina.csdn.net/qing_gee/CSDN-Books

    05、总结

    寒假是个沉淀期,利用得好,开学后就会焕然一新;利用得不好,开学后就会感觉身上附了一层灰,还要花一点时间去适应,才能进入学习状态。

    每个人的喜好都是不同的,所以寒假到底怎么过没有标准的答案。但有一点很清楚,寒假绝不是让我们整天追剧打游戏的,也绝不是每天睡到太阳晒到屁股的。

    我不建议大家做什么天衣无缝的计划表,因为一旦落实不了反而背负上沉甸甸的愧疚感。该玩的时候尽情的玩,放松完了切记还有习要学,就对了。

    最后,希望大家在寒假的时候多陪陪父母吧,毕竟工作后可能就天南海北了,一年见不上几次面了。我当时就这样,毕业的时候去了苏州,每年回洛阳最多两次,有时候真的特别想家,但又不能想回就回。

    好了,就说这么多吧,加油!同学们

    看完两件事:

    如果你觉得这篇内容对你挺有帮助,我想邀请你帮我两个忙~

    1、点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓啊)

    2、年关将近,码字不易,记得关注 @沉默王二 哟,让我们成为长期关系。


    PPS:文中提到的BAT 大佬「LeetCode刷题手册」电子书下载地址:

    https://pan.baidu.com/s/12RT8pRk6OUNa1PuYkqZliw,密码:8w3m

    展开全文
  • 点击查看微信朋友圈好友设置仅展示最近3天动态是所有好友吗?还是针对某个人具体信息答:朋友圈显示三天是针对所有朋友,不...答:针对所有人答:不行的,设置以后是对所有人。 怎么设置朋友圈只展示最近三天的朋...

    点击查看微信朋友圈好友设置仅展示最近3天动态是对所有好友吗?还是针对某个人具体信息

    答:朋友圈显示三天是针对所有朋友,不能个别设置,个别设置只能设置让他不看你的朋友圈,以及陌生人可以或者不可以查看十张照片,不能设置个别只能显示三天朋友圈。 不过在新版微信中,这个功能将失灵,你不能向好友关闭朋友圈,但取而代之的是,你...

    答:针对所有人

    答:不行的,设置以后是对所有人。 怎么设置朋友圈只展示最近三天的朋友圈:打开【微信】,点击又下角【我的】,选择最下面【设定】,选择【隐私】,选择【允许朋友查看朋友圈的范围】,选择【最近三天】 然后选择【完成】即可。 微信朋友圈可直接发...

    答:不可以的 只能针对全部好友设置,或直接设置不能看你的朋友圈

    答:不可以哦

    答:是的,针对所有人设置的3天可见。 朋友圈虽然对你“仅三天内可见”, 但本人却是对你永远可见。 因为你不是需要我靠发朋友圈去维持的友情 也不仅仅只是活在我朋友圈里的朋友

    答:微信里的朋友仅展示半年朋友圈是对全部好友的。 设置方法如下: 打开微信--设置--隐私,在最后就可以看到“允许朋友查看朋友圈的范围”,打开即可设置成功。 当手机设置了该功能的好友查看朋友圈时,就会出现朋友仅展示最近半年的朋友圈。

    答:在设置,隐私,朋友圈查看范围,是针对所有的微信好友

    答:所有好友。

    答:完全可以的,微信可以设置对朋友显示三天或是半年以及全部等朋友圈权限设置,如图

    答:也只能针对一个人设置

    答:你的朋友设置了向好友只展现最近三天的动态,所以你进入到他的朋友圈就会展现这样的一句话。在设置——隐私里可以设置,允许朋友查看全部内容、最近半年内容、最近三天内容。根据自己的需求选择就可以,不过这个是针对所有的好友的,不是针对某一...

    答:不会,只会显示一部分朋友的,你能看到的一般是最新发表动态的

    答:1、首先打开朋友圈,点击右上角的相机图标,编辑发表的内容。 2、内容编辑完成后,点击箭头所指的“谁可以看”。 3、然后在谁可以看的界面,我们点击箭头所指的“部分可见”。 4、然后在新的界面内点击“从通讯录选择”。 5、在我们的微信通讯录选择完...

    答:对方设置了朋友圈不可让你观看最新消息!

    答:在微信——我——设置——隐私——朋友圈和视频动态里进行设置,允许朋友查看朋友圈的范围,可以选择最近半年,最近3天和全部,还可以选择查看人的范围,最大程度的保护个人隐私,可以说已经很人性化了。

    答:微信朋友圈设置“朋友仅展示近三天”的方法:点击进入我-设置-隐私-允许朋友查看朋友圈的范围-最近三天 具体步骤: 1、点击进入微信右下角的“我”。 2、在微信“我”页面点击“设置”选项 3、点击进入“隐私”选项 4、点击“允许朋友查看朋友圈的范围”选项...

    答:亲 这个是可以设置的!

    答:是所有人都只能看到3天的内容

    答:现在来看,如果他设置了三天关系,那麽不管是不是好友,都会显示:朋友仅展示最近三天的朋友圈

    是针对所有的人,他看你的朋友圈的时候会显示您只展现了三天的朋友圈

    三天是针对所有朋友,不能个别设置,个别设置只能设置让他不看你的朋友圈,以及陌生人... 安卓版也于日前更新。设置对朋友仅展示自己最近3天的朋友圈动态的方法:打开软件,点...

    你的朋友设置了向好友只展现最近三天的动态,所以进入到他的朋友圈就会展现这样的一句话,是对所有人都一样,隐私设置里面设置更改而已。微信朋友圈指的是腾讯微信上的一...

    没有,只是之前的动态别人看不到了,之前发表的用户自己可以看到

    刚刚删除好友后之前好友发的朋友圈还是能看到的,刷新或者退出重新登录微信账号就行... 在朋友圈找到这个微信好友A(暂时以A称呼)发的动态,点击A的头像。    2,、...

    那是微信朋友圈设置的,允许陌生人查看十张照片。 陌生人(附近的人、摇一摇交友场景)只能看到10张最近发的照片。

    他是这样设置的,他允许陌生人看前3天朋友圈动态。所以你看他的动态的时候,你是属于他的陌生人,但是在这之前,他设置了不允许你看他的朋友圈。所以就会出现你现在的这种...

    你的朋友设置了向好友只展现最近三天的动态,所以你进入到他的朋友圈就会展现这样的一句话

    最近三天”。设置了这个范围后,你的微信联系人只能看到你最近三天发布的朋友圈。如... 他们只会看到一行友情提示:朋友仅展示最近三天的朋友圈。截至2016年12月,微信及W...

    有调查显示,对于朋友圈设置成只显示最近三天的内容,30%的人觉得无所谓,每个人都有... 亲朋好友也可以通过微信朋友圈看到你的最新动态,大家相互交流学习,想想也是很好的...

    一般来说你如果没加他为好友的话,他,也就是你说的好友以外的人是进不到你的朋友圈里的。但是微信中有这样的一个功能,如果你不想让谁看你的朋友圈,那么你就把他点开,再...

    你好。 微信就是这么设计的,你只能看到和你是微信好友的人说的话。所以我朋友圈里别人的照片下面都像是主人的自言自语的感觉....其实只是因为外人看不到给他评论的人...

    微信朋友圈看不到不是好友的评论的主要原因是:软件设计的属性问题,每个平台都有自... 朋友圈的权限。不是好友无法查看用户之间的评论。所以,如果微信通讯录上没有的联系...

    这个办法也是可以的 查看原帖>>

    好像没有这个设置,反正我用了好几年了都没有看到有这个。 其实不需要这个功能的,朋友圈的好友评论只有自己的手机上面才能看到,别人看到的只有你的回复,没有别人的评论

    第一,登录微信→ 点击右上角的点点→点击设置→ 点击隐私→往下拉就看到“不让ta看朋友圈”的字样,然后点进去→点那个大方框中间有个加号的 →然后选择你要屏蔽的人就...

    不能设置个别只能显示三天朋友圈。不过在新版微信中,这个功能将失灵,你不能向好友关闭朋友圈,但取而代之的是,你可以只向朋友展示“最近3天朋友圈”。微信iOS版本更新...

    微信5.0 到微信下面的菜单 我 里,点 设置 > 隐私 有 朋友圈 栏目,把所有的微信好友都加入到黑名单。 就OK了 那么,我也问下题主,只有自己看的朋友圈,那还是朋友圈吗?...

    微信朋友圈发动态让指定人看见,别人不给看,具体设置步骤如下: 第一步:打开手机微信,选择“发现”如下图第二步:选择“朋友圈”如下图第三步:点击右上角相机按钮,如下图第...

    一直都是看不到的,要三方都加了彼此才能看到,不然只有加了好友的两个人才能看到,其它人看不见。这也正是微信的高明之处,让微友更注重发的内容,不从众,更看重质量。

    更多精彩内容推荐:

    展开全文
  • Java完全自学手册,要悄悄努力,然后惊艳所有人

    万次阅读 多人点赞 2021-11-04 12:12:43
    幂等性:指的是同样的请求不管执行多少次,效果一样,服务器状态也是一样的。具有幂等性的请求方法没有副作用。(统计用途除外) 如何保证幂等性 假设这样一个场景:有时我们在填写某些form表单时,保存按钮不...

    推荐专栏:《技术专家修炼》

    点击领取

    • 15张学习路线导图
    • 3G学习资料
    • 100本计算机书籍

    哈喽,大家好,我是一条~

    Java学习如逆水行舟,不进则退。一条一路自学过来,踩过很多坑,吃过很多苦。

    现在回想起来,当初要是能有一个完整的学习路线让我按图索骥就好了。

    思来想去,决定总结一份学习路线来帮助正在路上或者准备出发的Java新手。

    完整路线

    该路线图右侧为主路线,需循序渐进,步步为营;左侧为辅助路线,需贯穿始终,熟练掌握。

    建议做好时间规划,不断的提高自己的学习效率,学习过程中尽量把手机调至静音给自己一个安静的学习环境和氛围。

    同时,巧妇难为无米之炊,一条学习新知识的一般方法为先看视频学基础,再看书学原理,最后看博客查缺补漏,沉淀消化。

    最后,说一下这么多年学习java的一些心得,希望能帮助到大家。

    java基础

    学习任何语言,都是先从他的基本语法开始,如果你有C语言的基础,会容易许多,没有也不用现学。

    image-20211011130649245

    基本数据类型

    Java 语言提供了 8 种基本类型,大致分为 4 类(8位=1字节)

    • 整数型
      • byte - 1字节
      • short - 2字节
      • int - 4字节
      • long - 8字节,赋值时一般在数字后加上 lL
    • 浮点型
      • float - 4字节,直接赋值时必须在数字后加上 fF
      • double - 8字节,赋值时一般在数字后加 dD
    • 字符型
      • char - 2字节,存储 Unicode 码,用单引号赋值
    • 布尔型
      • boolean - 1字节,只有 true 和 false 两个取值,一个字节就够了

    引用数据类型

    简单来说,所有的非基本数据类型都是引用数据类型,除了基本数据类型对应的引用类型外,类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型都属于引用类型。

    主要有以下区别:

    1、存储位置

    • 基本变量类型在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的
    • 引用数据类型变量其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址

    2、传递方式

    • 基本数据类型是按值传递
    • 引用数据类型是按引用传递

    访问修饰符

    访问修饰符就是限制变量的访问权限的。

    比如你有个“赚钱”的方法,谁都不想给用,那就把方法设成private(私有);

    后来你有了老婆孩子,你想让他们也会赚钱,就得设置成default(同一个包);

    后来你又有了第二个孩子,但你发现他不会赚钱的方法,为啥呢?因为你被绿了(default不支持不同包的子类);

    可为了大局,你还是选择接受这个孩子,悄悄把方法设置成了proteced(保护子类,即使不同包);

    后来你老了,明白了开源才是共赢,就设置成了public(公有的);

    不知道你听懂了吗,估计看到被那啥了就不想看了吧,没关系,看图(也是绿的)

    image-20210805183734693

    static关键字

    主要意义:

    我日常调用方法都是对象.方法,static的主要意义就是可以创建独立于具体对象的域变量或者方法。也就是实现即使没有创建对象,也能使用属性和调用方法!

    另一个比较关键的作用就是 用来形成静态代码块以优化程序性能static块可以置于类中的任何地方,可以有多个。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次,可以用来优化程序性能

    通俗理解:

    static是一个可以让你升级的关键字,被static修饰,你就不再是你了。

    final关键字

    final翻译成中文是“不可更改的,最终的”,顾名思义,他的功能就是不能再修改,不能再继承。我们常见的String类就是被final修饰的。

    将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

    按照Java代码惯例,final变量就是常量,而且通常常量名要大写:

    • final关键字可以用于成员变量、本地变量、方法以及类。
    • final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
    • 不能够对final变量再次赋值。
    • final方法不能被重写。
    • final类不能被继承。
    • 接口中声明的所有变量本身是final的。
    • final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

    面向对象三大特性

    封装

    1.什么是封装

    封装又叫隐藏实现。就是只公开代码单元的对外接口,而隐藏其具体实现。

    其实生活中处处都是封装,手机,电脑,电视这些都是封装。你只需要知道如何去操作他们,并不需要知道他们里面是怎么构造的,怎么实现这个功能的。

    2.如何实现封装

    在程序设计里,封装往往是通过访问控制实现的。也就是刚才提到的访问修饰符。

    3.封装的意义

    封装提高了代码的安全性,使代码的修改变的更加容易,代码以一个个独立的单元存在,高内聚,低耦合。

    好比只要你手机的充电接口不变,无论以后手机怎么更新,你依然可以用同样的数据线充电或者与其他设备连接。

    封装的设计使使整个软件开发复杂度大大降低。我只需要使用别人的类,而不必关心其内部逻辑是如何实现的。我能很容易学会使用别人写好的代码,这就让软件协同开发的难度大大降低。

    封装还避免了命名冲突的问题。

    好比你家里有各种各样的遥控器,但比还是直到哪个是电视的,哪个是空调的。因为一个属于电视类一个属于空调类。不同的类中可以有相同名称的方法和属性,但不会混淆。

    继承

    继承的主要思想就是将子类的对象作为父类的对象来使用。比如王者荣耀的英雄作为父类,后裔作为子类。后裔有所有英雄共有的属性,同时也有自己独特的技能。

    多态

    多态的定义:

    指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    简单来说,同样调用攻击这个方法,后裔的普攻和亚瑟的普攻是不一样的。

    多态的条件:

    • 要有继承
    • 要有重写
    • 父类引用指向子类对象

    多态的好处:

    多态对已存在代码具有可替换性。

    多态对代码具有可扩充性。

    它在应用中体现了灵活多样的操作,提高了使用效率。

    多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    Java中多态的实现方式:

    • 接口实现
    • 继承父类进行方法重写
    • 同一个类中进行方法重载

    完整讲解

    Java基础完整讲解

    入门练习案例

    入门练习100例

    JavaWeb

    JavaWeb是用Java技术来解决相关web互联网领域的技术栈。Web就是网页,分为静态和动态。涉及 的知识点主要包括jsp,servlet,tomcat,http,MVC等知识。

    本章难度不高,但也不可忽视。其中前端基础不需花过多时间,重点放在Tomcat上,会陪伴你整个Java生涯。

    HTTP网络请求方式

    • GET:最常用的方式,用来向服务器请求数据,没有请求体,请求参数放在URL后面。
    • POST:用于向表单提交数据,传送的数据放在请求体中。
    • PUT:用来向服务器上传文件,一般对应修改操作,POST用于向服务器发送数据,PUT用于向服务器储存数据。没有验证机制,任何人都可以操作,存在安全问题。具有幂等性。
    • DELETE:用于删除服务器上的文件,具有幂等性。同样存在安全问题。
    • HEAD:用HEAD进行请求服务器时,服务器只返回响应头,不返回响应体。与GET一样没有请求体,常用于检查请求的URL是否有效。
    • PATCH:对资源进行部分修改。与PUT区别在于,PUT是修改所有资源,替代它,而PATCH只是修改部分资源。
    • TRACE:用来查看一个请求,经过网关,代理到达服务器,最后请求的变换。因安全问题被禁用。
    • OPTIONS:当客户端不清楚对资源操作的方法,可以使用这个,具有幂等性。

    GET和POST

    1. 作用不同:GET 用于获取资源,而 POST 用于传输实体主体。
    2. 参数位置不一样: GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。虽然GET的参数暴露在外面,但可以通过加密的方式处理,而 POST 参数即使存储在实体主体中,我们也可以通过一些抓包工具如(Fiddler)查看。
    3. 幂等性:GET是幂等性,而POST不是幂等性。(面试官紧接着可能就会问你什么是幂等性?如何保证幂等性?)
    4. 安全性:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。 GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

    幂等性

    是否具有幂等性也是一个http请求的重要关注点。

    幂等性:指的是同样的请求不管执行多少次,效果都是一样,服务器状态也是一样的。具有幂等性的请求方法没有副作用。(统计用途除外)

    如何保证幂等性

    假设这样一个场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。

    这是一个比较常见的幂等性问题,在高并发场景下会变得更加复杂,那怎么保证接口的幂等性呢?

    1.insert前select

    插入数据前先根据某一字段查询一下数据库,如果已经存在就修改,不存在再插入。

    2.加锁

    加锁可解决一切问题,但也要考虑并发性。

    主要包括悲观锁,乐观锁,分布式锁。

    悲观锁的并发性较低,更适合使用在防止数据重复的场景,注意幂等性不光是防止重复还需要结果相同。

    乐观锁可以很高的提升性能,也就是常说的版本号。

    分布式锁应用在高并发场景,主要用redis来实现。

    3.唯一索引

    通过数据库的唯一索引来保证结果的一致性和数据的不重复。

    4.Token

    两次请求,第一请求拿到token,第二次带着token去完成业务请求。

    常见的网络状态码

    网络状态码共三位数字组成,根据第一个数字可分为以下几个系列:

    1xx(信息性状态码)

    代表请求已被接受,需要继续处理。

    包括:100、101、102

    这一系列的在实际开发中基本不会遇到,可以略过。

    2xx(成功状态码)

    表示成功处理了请求的状态代码。

    200:请求成功,表明服务器成功了处理请求。

    202:服务器已接受请求,但尚未处理。

    204:服务器成功处理了请求,但没有返回任何内容。

    206:服务器成功处理了部分 GET 请求。

    3xx(重定向状态码)

    300:针对请求,服务器可执行多种操作。

    301:永久重定向

    302:临时性重定向

    303:303与302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源。

    301和302的区别?

    301比较常用的场景是使用域名跳转。比如,我们访问 http://www.baidu.com 会跳转到https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

    302用来做临时跳转比如未登陆的用户访问用户中心重定向到登录页面。

    4xx(客户端错误状态码)

    400:该状态码表示请求报文中存在语法错误。但浏览器会像200 OK一样对待该状态码。

    401:表示发送的请求需要有通过HTTP认证的认证信息。比如token失效就会出现这个问题。

    403:被拒绝,表明对请求资源的访问被服务器拒绝了。

    404:找不到,表明服务器上无法找到请求的资源,也可能是拒绝请求但不想说明理由。

    5xx(服务器错误状态码)

    500:服务器本身发生错误,可能是Web应用存在的bug或某些临时的故障。

    502:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

    ⚠️有时候返回的状态码响应是错误的,比如Web应用程序内部发生错误,状态码依然返回200

    转发和重定向

    上面提到了重定向,那你知道什么是转发吗?

    1.转发

    A找B借钱,B没有钱,B去问C,C有钱,C把钱借给A的过程。

    客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户。

    整个转发一个请求,一个响应,地址栏不会发生变化,不能跨域访问。

    2.重定向

    A找B借钱,B没有钱,B让A去找C,A又和C借钱,C有钱,C把钱借给A的过程。

    客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。

    两个请求,两个响应,可以跨域。

    Servlet

    servlet是一个比较抽奖的概念,也是web部分的核心组件,大家回答这个问题一定要加入自己的理解,不要背定义。

    servlet其实就是一个java程序,他主要是用来解决动态页面的问题。

    之前都是浏览器像服务器请求资源,服务器(tomcat)返回页面,但用户多了之后,每个用户希望带到不用的资源。这时就该servlet上场表演了。

    servlet存在于tomcat之中,用来网络请求与响应,但他的重心更在于业务处理,我们访问京东和淘宝的返回的商品是不一样的,就需要程序员去编写,目前MVC三层架构,我们都是在service层处理业务,但这其实是从servlet中抽取出来的。

    看一下servlet处理请求的过程:

    image-20210812201447743

    Servlet的生命周期

    Servlet生命周期分为三个阶段:

    • 初始化阶段 调用init()方法
    • 响应客户请求阶段  调用service()方法-àdoGet/doPost()
    • 终止阶段  调用destroy()方法

    session、cookie、token

    首先我们要明白HTTP是一种无状态协议,怎么理解呢?很简单

    夏洛:大爷,楼上322住的是马冬梅家吧?
    大爷:马冬什么? 
    夏洛:马冬梅。 
    大爷:什么冬梅啊? 
    夏洛:马冬梅啊。 
    大爷:马什么梅?
    夏洛:行,大爷你先凉快着吧。
    

    这段对话都熟悉吧,HTTP就是那个大爷,那如果我们就直接把“大爷”放给用户,用户不用干别的了,就不停的登录就行了。

    既然“大爷不靠谱”,我们找“大娘”去吧。

    哈哈哈,开个玩笑,言归正传。

    为了解决用户频繁登录的问题,在服务端和客户端共同维护一个状态——会话,就是所谓session,我们根据会话id判断是否是同一用户,这样用户就开心了。

    但是服务器可不开心了,因为用户越来越多,都要把session存在服务器,这对服务器来说是一个巨大的开销,这是服务器就找来了自己的兄弟帮他分担(集群部署,负载均衡)。

    但是问题依然存在,如果兄弟挂了怎么办,兄弟们之间的数据怎么同步,用户1把session存放在机器A上,下次访问时负载均衡到了机器B,完了,找不到,用户又要骂娘。

    这时有人思考,为什么一定要服务端保存呢,让客户端自己保存不就好了,所以就诞生了cookie,下一次请求时客户段把cookie发送给服务器,说我已经登录了。

    但是空口无凭,服务器怎么知道哪个cookie是我发过去的呢?如何验证成了新的问题。

    有人想到了一个办法,用加密令牌,也就是token,服务器发给客户端一个令牌,令牌保存加密后id和密钥,下一次请求时通过headers传给服务端,由于密钥别人不知道,只有服务端知道,就实现了验证,且别人无法伪造。

    MVC与三层架构

    三层架构与MVC的目标一致:都是为了解耦和、提高代码复用。MVC是一种设计模式,而三层架构是一种软件架构。

    MVC

    Model 模型

    模型负责各个功能的实现(如登录、增加、删除功能),用JavaBean实现。

    View 视图

    用户看到的页面和与用户的交互。包含各种表单。 实现视图用到的技术有html/css/jsp/js等前端技术。

    常用的web 容器和开发工具

    Controller 控制器

    控制器负责将视图与模型一一对应起来。相当于一个模型分发器。接收请求,并将该请求跳转(转发,重定向)到模型进行处理。模型处理完毕后,再通过控制器,返回给视图中的请求处。

    三层架构

    表现层(UI)(web层)、业务逻辑层(BLL)(service层)、数据访问层(DAL)(dao层) ,再加上实体类库(Model)

    • 实体类库(Model),在Java中,往往将其称为Entity实体类。数据库中用于存放数据,而我们通常选择会用一个专门的类来抽象出数据表的结构,类的属性就一对一的对应这表的属性。一般来说,Model实体类库层需要被DAL层,BIL层和UI层引用。
    • 数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作,DAL就是根据业务需求,构造SQL语句,构造参数,调用帮助类,获取结果,DAL层被BIL层调用
    • 业务逻辑层(BLL),BLL层好比是桥梁,将UI表示层与DAL数据访问层之间联系起来。所要负责的,就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据。

    完整讲解

    JavaWeb完整讲解

    集合

    工欲善其事必先利其器,集合就是我们的器。

    ArrayList

    底层实现

    由什么组成,我说了不算,看源码。怎么看呢?

    List<Object> list = new ArrayList<>();
    

    新建一个ArrayList,按住ctrlcommand用鼠标点击。

        /**
         * The array buffer into which the elements of the ArrayList are stored.
         * The capacity of the ArrayList is the length of this array buffer. Any
         * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
         * will be expanded to DEFAULT_CAPACITY when the first element is added.
         * 翻译
         * 数组缓冲区,ArrayList的元素被存储在其中。ArrayList的容量是这个数组缓冲区的长度。
         * 任何空的ArrayList,如果elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA,
         * 当第一个元素被添加时,将被扩展到DEFAULT_CAPACITY。
         */
        transient Object[] elementData; 
    

    毋庸置疑,底层由数组组成,那数组的特点就是ArrayList的特点。

    • 由于数组以一块连续的内存空间,每一个元素都有对应的下标,查询时间复杂度为O(1)。好比你去住酒店,每个房间都挨着,房门都写着房间号。你想找哪一间房是不是很容易。
    • 相对的,一块连续的内存空间你想打破他就没那么容易,牵一发而动全身,所以新增和删除的时间复杂度为O(n),想像你在做excel表格的时候,想增加一列,后面的列是不是都要跟着移动。
    • 元素有序,可重复。可用在大多数的场景,这个就不需要过多解释了。

    扩容

    我们知道数组是容量不可变的数据结构,随着元素不断增加,必然要扩容。

    所以扩容机制也是集合中非常容易爱问的问题,在源码中都可以一探究竟。

    1.初始化容量为10,也可以指定容量创建。

        /**
         * Default initial capacity.
         * 定义初始化容量
         */
        private static final int DEFAULT_CAPACITY = 10;
    

    2.数组进行扩容时,是将旧数据拷贝到新的数组中,新数组容量是原容量的1.5倍。(这里用位运算是为了提高运算速度)

    private void grow(int minCapacity) {
      int newCapacity = oldCapacity + (oldCapacity >> 1);
    }
    

    3.扩容代价是很高得,因此再实际使用时,我们因该避免数组容量得扩张。尽可能避免数据容量得扩张。尽可能,就至指定容量,避免数组扩容的发生。

    为什么扩容是1.5倍?

    • 如果大于1.5,也就是每次扩容很多倍,但其实我就差一个元素的空间,造成了空间浪费。
    • 如果小于1.5,扩容的意义就不大了,就会带来频繁扩容的问题。

    所以,1.5是均衡了空间占用和扩容次数考虑的。

    线程安全问题

    怎么看线程安全?说实话我以前都不知道,看网上说安全就安全,说不安全就不安全。

    其实都在源码里。找到增加元素的方法,看看有没有加锁就知道了。

        public void add(int index, E element) {
            rangeCheckForAdd(index);
    
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            System.arraycopy(elementData, index, elementData, index + 1,
                             size - index);
            elementData[index] = element;
            size++;
        }
    

    没有加锁,所以线程不安全

    在多线程的情况下,插入数据的时可能会造成数据丢失,一个线程在遍历,另一个线程修改,会报ConcurrentModificationException(并发修改异常)错误.

    多线程下使用怎么保证线程安全?

    保证线程安全的思路很简单就是加锁,但是你可没办法修改源码去加个锁,但是你想想编写java的大佬会想不到线程安全问题?

    早就给你准备了线程安全的类。

    1.Vector

    Vector是一个线程安全的List类,通过对所有操作都加上synchronized关键字实现。

    找到add方法,可以看到被synchronized关键字修饰,也就是加锁,但synchronized是重度锁,并发性太低,所以实际一般不使用,随着java版本的更新,慢慢废弃。

    public void add(E e) {
                int i = cursor;
                synchronized (Vector.this) {
                    checkForComodification();
                    Vector.this.add(i, e);
                    expectedModCount = modCount;
                }
                cursor = i + 1;
                lastRet = -1;
            }
    

    2.Collections

    注意是Collections而不是Collection

    Collections位于java.util包下,是集合类的工具类,提供了很多操作集合类的方法。其中Collections.synchronizedList(list)可以提供一个线程安全的List

    对于Map、Set也有对应的方法

    3.CopyOnWrite(写时复制)

    写时复制,简称COW,是计算机程序设计领域中的一种通用优化策略。

    当有多人同时访问同一资源时,他们会共同获取指向相同的资源的指针,供访问者进行读操作。

    当某个调用者修改资源内容时,系统会真正复制一份副本给该调用者,而其他调用者所见到的最初的资源仍然保持不变。修改完成后,再把新的数据写回去。

    通俗易懂的讲,假设现在有一份班级名单,但有几个同学还没有填好,这时老师把文件通过微信发送过去让同学们填写(复制一份),但不需要修改的同学此时查看的还是旧的名单,直到有同学修改好发给老师,老师用新的名单替换旧的名单,全班同学才能查看新的名单。

    共享读,分开写。读写分离,写时复制。

    在java中,通过CopyOnWriteArrayListCopyOnWriteArraySet容器实现了 COW 思想。

    平时查询的时候,都不需要加锁,随便访问,只有在更新的时候,才会从原来的数据复制一个副本出来,然后修改这个副本,最后把原数据替换成当前的副本。修改操作的同时,读操作不会被阻塞,而是继续读取旧的数据。

        /** The lock protecting all mutators */
        final transient ReentrantLock lock = new ReentrantLock();
    
        /** The array, accessed only via getArray/setArray. */
        private transient volatile Object[] array;
    

    源码里用到了ReentrantLock锁和volatile关键字,会在《资深程序员修炼》专栏中做全面深度讲解。

    LinkedList

    LinkedListArrayList同属于List集合。其共同特点可归纳为:

    存储单列数据的集合,存储的数据是有序并且是可以重复的。

    但两者也有不同,往下看吧

    底层实现

    LinkedList类的底层实现的数据结构是一个双向链表。同时还实现了Deque接口,所以会有些队列的特性,会在下面讲。

    class LinkedList<E>
        extends AbstractSequentialList<E>
        implements List<E>, Deque<E>, Cloneable, java.io.Serializable
    

    先简单说一下链表这种数据结构,与数组相反,链表是一种物理存储单元上非连续、非顺序的存储结构,一个最简单的链表(单链表)有节点Node和数值value组成。通俗的讲,就像串在一起的小鱼干,中间用线连着。

    transient Node<E> first;
    
    transient Node<E> last;
    

    链表中保存着对最后一个节点的引用,这就是双端链表

    在单链表的结点中增加一个指向其前驱的pre指针就是双向链表,一种牺牲空间换时间的做法。

    双端链表不同于双向链表,切记!

    关于链表更详细代码级讲解会放《糊涂算法》专栏更新。敬请期待!

    简单了解过后分析一下链表的特点:

    • 查询速度慢,因为是非连续空间,没有下标。想像你需要在一份名单上找到你的名字,没有序号,你只能从头开始一个一个的看。
    • 删改速度快,因为非连续,也就没有那么多约束。想像从一根项链上扣下来一块,只需要改变引用就可以了,不会牵一发而动全身。
    • 元素有序,可重复。

    如何解决查询慢的问题?

    如果我查找的元素在尾部,则需要遍历整个链表,所以有了双端链表。

    即使不在尾部,我如果只能一个方向遍历,也很麻烦,所以有了双向队列,牺牲空间换时间。

    那么空间可不可以再牺牲一点?

    可以,就是跳跃链表,简称「跳表」。

    通过建立多级索引来加快查询速度。

    线程安全问题

    老办法,看看add()方法。分为「头插法」和「尾插法」。

        /**
         * Inserts the specified element at the beginning of this list.
         *
         * @param e the element to add
         */
        public void addFirst(E e) {
            linkFirst(e);
        }
    
        /**
         * Appends the specified element to the end of this list.
         *
         * <p>This method is equivalent to {@link #add}.
         *
         * @param e the element to add
         */
        public void addLast(E e) {
            linkLast(e);
        }
    

    都没加锁,百分之一百的不安全。

    如何解决线程不安全问题

    1.ConcurrentLinkedQueue

    一个新的类,位于java.util.concurrent(juc)包下。实现了Queue接口。

    class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
            implements Queue<E>, java.io.Serializable{}
    

    使用violate关键字实现加锁。

     private transient volatile Node<E> head;
    
     private transient volatile Node<E> tail;
    

    1.Collections

    ArrayList一样,使用Collections.synchronizedList()

    Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复

    和ArrayList对比一下

    共同点:有序,可重复。线程不安全。

    不同点:底层架构,查询和删改的速度

    完整讲解

    集合完整讲解

    JVM

    重点来了,Java程序员一定要深入研究的内容

    完整讲解

    JVM完整讲解

    多线程

    理解多线程,才能更好的理解框架源码,进行高并发的架构设计,重中之重。

    并行和并发

    并行:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。

    并发:多个处理器或多核处理器同时处理多个任务。

    举例:

    并发 = 两个队列和一台咖啡机。

    并行 = 两个队列和两台咖啡机。

    线程和进程

    一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。

    守护线程

    守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。

    创建线程4种方式

    • 继承 Thread 重新 run 方法;

    • 实现 Runnable 接口;

    • 实现 Callable 接口。

    • 线程池

    synchronized 底层实现

    synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。

    在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。

    但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。

    synchronized 和 volatile 的区别

    volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。

    volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。

    volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

    synchronized 和 Lock 区别

    synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

    synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁。

    lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

    通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

    synchronized 和 ReentrantLock 区别

    synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。

    主要区别如下:

    ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;

    ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;

    ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

    volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。

    设计模式

    好多人觉得设计模式模式,那是因为你学的还不够深入,还没有看过源码,所以我特意将设计模式往前放了。

    今天我们一块看一下简单工厂模式,其实他不属于23种设计模式,但为了更好的理解后面的工厂方法抽象工厂,我们还是需要先了解一下。

    image-20211004190949835

    定义

    官方定义

    定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

    通俗解读

    我们不必关心对象的创建细节,只需要根据不同参数获取不同产品即可。

    难点:写好我们的工厂。

    结构图

    代码演示

    本文源码:简单工厂模式源码 提取码: qr5h

    目录结构

    建议跟着一条学设计模式的小伙伴都建一个maven工程,并安装lombok依赖和插件。

    并建立如下包目录,便于归纳整理。

    pom如下

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    
    

    开发场景

    汽车制造工厂,既可以生产跑车,也可以生产SUV,未来还会生产新能源汽车。

    代码实现

    1.创建抽象产品Car

    public abstract class Car {
        public String color;
        abstract void run();
    }
    

    2.创建具体产品

    SuvCar

    public class SuvCar extends Car{
        public SuvCar(){
            this.color="green";
        }
    
        @Override
        public void run() {
            System.out.println("SuvCar running---------");
        }
    }
    

    SportsCar

    public class SportsCar extends Car{
    
        public SportsCar(){
            this.color="red";
        }
    
        @Override
        public void run() {
            System.out.println("SportsCar running-------");
        }
    }
    

    3.创建静态工厂

    在简单工厂模式中用于被创建实例的方法通常为静态方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)

    /**
     * 简单/静态工厂,少数产品
     */
    public class CarFactory {
    
       public static Car getCar(String type){
            if (type.equals("sport")){
                return new SportsCar();
            }else if (type.equals("suv")){
                return new SuvCar();
            }else {
                return null;
            }
        }
    }
    

    4.编写测试类

    public class MainTest {
        public static void main(String[] args) {
            SportsCar sport = (SportsCar) CarFactory.getCar("sport");
            sport.run();
            System.out.println(sport.color);
        }
    }
    

    5.输出结果

    接口和抽象类

    补充一个知识

    接口和抽象类有什么区别?

    什么时候用接口,什么时候用抽象类?

    接口和抽象类有什么区别?

    • 接口是针对方法的整合,抽象类是针对子类的整合。
    • 人有男人,女人,人是抽象类。人可以吃东西,狗也可以吃东西,吃东西这个动作是接口。
    • 接口可以多继承,抽象类不行。
    • 接口中基本数据类型为static, 而抽类象不是。
    • 抽象类有构造器,方法可以实现,除了不能被实例化,和普通类没有区别,接口不是。

    什么时候用接口,什么时候用抽象类?

    • 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
    • 再简单点说,有属性定义的时候,用抽象类,只有方法的时候,用接口。

    应用场景

    • 工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂

    • 客户端只知道传入工厂类的参数,对如何创建对象不关心

    • 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

    总结

    优点

    • 通过工厂类,无需关注生产的细节,只需要传递对应参数即可。
    • 可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

    缺点

    • 违背开闭原则,扩展不易。
    • 工厂类职责过重,一旦异常,系统瘫痪。
    • 无法动态的增加产品,扩展困难。

    问题:在不修改的工厂的前提下,怎么生产新能源汽车?下一节的工厂方法模式给大家讲解。

    更多设计模式

    更多设计模式

    SSM框架

    这对于初学者来说,是一个坎,前几年学完这些,已经可以开始找工作了,所以恭喜你能坚持带这里,胜利就在前方。

    Redis

    随着QPS的逐渐升高,传统的mysql数据库已经无法满足。所以有了基于内存的redis缓存数据库来存储热点数据。

    Zookeeper

    Zookeeper作为统一配置文件管理和集群管理框架,是后续学习其他框架的基础,在微服务中,还可以用来做注册中心。

    Kafka

    学习心得

    1.按计划行事

    凡事预则立,不预则废。一个好的计划是成功的一半,而这一半,一条已经帮你整理好了,你只需要收藏即可。

    该路线图左侧为主路线,需循序渐进,步步为营;右侧为辅助路线,需贯穿始终,熟练掌握。

    建议做好时间规划,不断的提高自己的学习效率,学习过程中尽量把手机调至静音给自己一个安静的学习环境和氛围。

    2.抱团生长

    独脚难行,孤掌难鸣,一个人的力量终究是有限的,一个人的旅途也注定是孤独的。当你定好计划,怀着满腔热血准备出发的时候,一定要找个伙伴,和唐僧西天取经一样,师徒四人团结一心才能通过九九八十一难。

    在学习过程中看下自己身边有没有Java这方面的大神,尽量多问,多交流,如果没有的话,来找我,我一定知无不言言无不尽,还可以给你找一群志同道合的人。水涨船高,柴多火旺,就是这个道理,闭门造车注定会半途而废。

    3.贵在坚持

    驽马十驾,功在不舍。自学Java非一日之功,你知道的越多,不知道的也越多。所以,为自己找一个动力,为了改变命运,或是为了心爱的人,或是为了让别人高看一眼。男儿何不带吴钩,收取关山十五州。岁月无情,余生有涯,请将生活扛在肩上,只顾风雨兼程。


    ⭐️路线导图、3G学习资料、100本电子书⭐️
    👇点击下方卡片 关注后回复「1024」获取👇
    展开全文
  • Linux 笔记分享八:文件权限的设定

    千次阅读 2021-05-12 11:51:06
    一、文件权限的设定-rw-r--r--第一个-是文件类型(-代表文件,d代表目录,|代表软链接文件)关于后9位rw-r--r--u所有者g所属组o其他r是读权限,w是写权限,x是执行权限1、chmod修改文件的权限chmod [选项] 模式 ...

    一、文件权限的设定

    -rw-r--r--

    第一个-是文件类型(-代表文件,d代表目录,|代表软链接文件)

    关于后9位

    rw-

    r--

    r--u所有者

    g所属组

    o其他人

    r是读权限,w是写权限,x是执行权限

    1、chmod

    修改文件的权限

    chmod [选项] 模式 文件名

    选项

    -R: 递归操作(赋予目录权限时,目录下所有文件都进行赋予权限)

    模式

    [ugoa][+-=][mode=421]

    [ugo]和[+-]的方式不方便,需要知道文件的权限是什么,才能操作

    a是all的意思,指所有人

    文件所有者加上执行权限

    chmod u+x cangls.av

    文件所属组和其他人加上写权限

    chmod g+w,o+w cangls.av

    把上面给予的权限去掉

    chmod u-x,g-w,o-w cangls.av

    等于方式赋予权限

    chmod u=rwx,g=rw cangls.av

    以all和等于的方式赋予权限,即所有人一样的权限,不现实,不常用

    chmod a=rw cangls.av

    最方便的权限赋予方式

    权限的数字表示

    r ---- 4

    w ---- 2

    x ---- 1

    例如:

    rwx

    r-x

    r-x7

    5

    5

    原因:

    数字权限其实是用3位二进制表示的,其转换为十进制数对应的就是4,2,1

    赋予文件最高权限

    chmod 777 cangls.av

    常用数字权限

    777 --- 代表所有人都有最高权限

    755 --- 执行文件的常用权限

    644 --- 普通文件的常用权限

    二、文件权限的作用

    1、权限对文件的作用

    r: 读取文件内容(cat more head tail)

    w: 编辑、新增、修改文件内容(vi echo)

    但不包括删除文件

    x: 可执行

    2、关于为什么有文件的写权限,却不能删除文件的问题解释

    对于某个目录或文件拥有的权限,针对的是里面的内容,而不是文件本身

    由此,对文件的删除是对文件所在目录的写,故必须有目录的写权限才可以

    3、权限对目录的作用

    r: 可以查询目录下文件名(ls)

    w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)

    x: 可以进入目录(cd)

    4、总结

    对文件来讲: 最高权限是 x(执行)

    对目录来讲: 最高权限是 w(写)

    对文件要少赋执行权限,对目录要少赋写权限

    对于目录的权限

    对目录仅赋予读权限没有意义

    对目录仅赋予执行权限没有意义

    有意义的三种权限: 0(没有任何权限)、5(读和执行,基本权限)、7(读、写和执行,最高权限)

    5、举个栗子哈(一步一步来看)

    root下创建一个用户,并赋予密码

    [root@localhost ~]# useradd user1

    [root@localhost ~]# passwd user1

    另外再登录一个shell,用户是user1

    root下进入user1的家目录,并创建测试目录和文件

    [root@localhost ~]# cd /home/user1

    [root@localhost user1]# mkdir 123

    [root@localhost user1]# touch 123/abc

    此时目录123的权限是: drwxr-xr-x(755)

    root下修改123目录的权限和abc文件的权限,使其他人的权限为0

    [root@localhost user1]# chmod 750 123

    [root@localhost user1]# chmod 640 123/abc

    此时user1下不能进入123目录和查看123目录

    root下修改123目录的权限,使其他人的权限为仅读

    [root@localhost user1]# chmod 754 123

    此时user1下不能进入123目录,但查看123目录乱码,不能用

    root下修改123目录的权限,使其他人拥有基本权限

    [root@localhost user1]# chmod 755 123

    此时user1下能查能进入123目录,但是不能在里面创建、删除文件或目录,并且对abc文件没有读写执行权限

    root下修改abc文件,使其他人拥有只读权限

    [root@localhost user1]# chmod 644 123/abc

    此时user1下可以读abc内容,但不能执行和修改

    root下修改abc文件,使其他人拥有读写权限

    [root@localhost user1]# chmod 646 123/abc

    此时user1下可以读和修改abc内容,但不能执行,且不能删除此文件,因为123目录对于user1没开放写权限

    root下修改123目录的权限,使其他人拥有最高权限

    [root@localhost user1]# chmod 757 123

    此时user1下可以在123目录下,创建和删除文件

    6、我的总结

    针对目录

    755是最常用的权限设定方式,(目录所有者可以删除和创建目录下文件,其他人只能进入看看)

    稍微严谨一点是750,其他人进都进不来

    极端严谨一点是700,就我自己能进能看能改,其他所有拒之门外

    针对普通文件

    644是最常用的权限设定方式,(文件所有者能看能改,其他人只能看)

    640是其他人不能看不能改

    600是其他所有人不能看不能改

    针对可执行文件

    754是最常用的权限设定方式,(文件所有者可以看改执行,组内可以执行,其他人只能看)

    750、740、700都是可以的

    还有一点

    文件所有者必须为7或者是6,要不就是傻逼

    三、其它权限命令

    1、chown

    修改文件的所有者

    chown 用户名 文件名

    例如:

    chown ds fengj.av

    同时改变所属组

    chown root:root fengj.av

    2、chgrp

    修改文件的所属组

    chgrp 组名 文件名

    例如:

    chgrp group1 fengj.av

    完全可以用chown改变所属组,因此这个命令作用就不是那么重要了

    3、让用户对文件及目录拥有一定的权限

    要求

    拥有一个av目录

    让加藤老师拥有所有的权限(7)

    让本课程学员有查看的权限(5)

    其他所有人不许查看这个目录(0)

    4、总结

    分配文件基本权限时,核心原则:

    在最小权限情况下能够实现要求即可!

    严谨不负责任的赋777这样的二逼权限!

    四、文件默认权限

    Windows在目录中创建文件是继承的目录权限,Linux则不是

    1、umask

    查看默认权限

    umask

    返回:

    0022

    第一位0: 文件特殊权限

    022: 文件默认权限

    文件默认权限

    文件默认不能建立为执行文件,必须手工赋予执行权限

    所以文件默认权限最大为666

    默认权限需要换算成字母再相减

    建立文件之后的默认权限,为666减去umask值

    例如:

    文件默认最大权限666,umask值022

    -rw-rw-rw- 减去 -----w--w- 等于 -rw-r--r--

    再例如:

    文件默认最大权限666,umask值033

    -rw-rw-rw- 减去 -----wx-wx 等于 -rw-r--r--

    目录的默认权限

    目录默认权限最大为777

    默认权限需要换算成字母再相减

    建立文件之后的默认权限,为777减去umask值

    例如:

    目录默认最大权限为777,umask值022

    -rwxrwxrwx 减去 -----w--w- 等于 -rwxr-xr-x

    修改默认权限

    umask 0033

    命令修改只是临时生效,想要永久生效需要修改/etc/profile文件

    本作品采用《CC 协议》,转载必须注明作者和本文链接

    我们是一群被时空压迫的孩子。 ---- 爱因斯坦

    展开全文
  • 上帝在基督里赦免了所有人的罪

    千次阅读 2021-06-08 18:39:32
    原作者:Dr....这个上午我们想要将我们的注意力转到罪人在上帝面前称义这一重要的教义上,这个教义常常被称为基督教的核心教义,路德宗来说尤其如此。 使徒保罗在他给罗马的信中说:“上帝……称不.
  • 东京发布会结束后,任天堂发布了一个关于Switch主机的官方资料单,基本上所有你想知道的数据在这里了。不过遗憾的是,这份单子仍然没有公开详细的硬件规格。产品概述Switch是任天堂开发的新家庭视频游戏系统。除了...
  • 你都用 Python 来做什么?

    万次阅读 多人点赞 2021-12-12 16:50:33
    在开发中 python 这一个语言就像是小叮当,而 python 的第三方库则是“百宝箱”,只要想着某一个方向进行开发,那么这个“百宝箱”就会给想要的东西。 由于我是在开发多年后接触到的 python,我来说自从接触...
  • 普通如何像天才一样快速学习?

    万次阅读 多人点赞 2021-01-25 16:45:12
    就像学习其他技能一样,这也是一项技能。也可以通过后天学习,提高自己的学习速度。 在一年内完成大学学业,会说九种语言是极端的例子。然而,提高的学习速度,即使是一点点,也会给带来巨大的长期好处。 ...
  • 知道程序是怎么处理时区问题的么?

    万次阅读 多人点赞 2021-01-20 21:59:25
    前端处理 业务前端的要求是:不管使用的是移动端还是PC端,应该正确的显示当时时间,包括有夏令时制的时间。 如果在中国的话,就比较好处理,没有DST机制,统一使用东八区即GMT/UTC + 08:00即可,前端服务的...
  • 的意中人进行密集、强烈甚至带有威胁意味的目的接触,是让对方爱上的第一步。将的视线死死锁定对方,制造那种你们已经相爱的暧昧气氛。 “时刻准备着” 技巧1 打扮妥当,随时等待爱情 男性来说,衣着...
  • 面试官震惊,这网络基础可以啊!

    万次阅读 多人点赞 2021-07-10 15:27:09
    网络的基础认识<1>.组网方式<2>.OSI七层模型<3>.TCP/IP五层(四层模型)<4>.封装分用的理解2.网络数据传输<1>局域网(1)认识IP和MAC(2)网络数据传输的特性(3)网络数据传输流程1)...
  • 今年春晚不一样,XR技术如何打造移步换景

    千次阅读 多人点赞 2021-02-14 10:11:38
    不知道大家发现没有,相比前几届春晚,《2021年春节联欢晚会》的视觉效果可谓焕然一新,很多节目可以看到新科技的东西,比如AR、XR、电影特效技术等将现实舞台上无法完成的效果精彩呈现,融通虚拟空间与现实世界。...
  • 心态?好多跟我一样

    千次阅读 2021-11-22 21:17:13
    每个人对一件事,有一个基准的期望值, 然后实际情况的反应也有不同的敏感程度。 这就造就了不同的心态,我并不想特意通过什么精神法去调节心态, 因为我觉得这就是我,也有就会下意识的调整的心态。 就比如某人...
  • 他从阿里的第一位程序员,做到了阿里的合伙,是神一样的人物 蔡景现,花名“多隆”,在阿里创立之初,就加入阿里,是阿里的第一位程序员。 2003年4月的一天,马云给了多隆一份新的合同,问他有一个新的项目他要...
  • 男生有第一次约女生出门的时候,这时候的男生没有任何的经验。而在和女生在约会的过程中,又存在着很多无法确定的因素,男生就会特别害怕自己哪里做得不好,惹男生生气。这时候,男生会在网上百度学习一字儿技巧和...
  • 本文是众多使用技巧中其中的一篇,全部使用技巧点击链接查看,或直接查看本专栏其他文章, 保证收获满满 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页...
  • RABE 路径覆盖 就是选取足够多的用例,保证程序的所有路径至少执行一次,如果存在环形结构,也要保证此环的所有路径至少执行一次。 (1)a=1,b=1,x=1(满足a,b≠0,a≠2,x的条件),执行路径为RABE (2)a=2,b=0,x=2...
  • 作为一门基于 LLVM 的可编译的静态类型语言,Crystal 的整体设计很接近 Ruby 的体验,语法与各种标准库的接口也几乎和 Ruby 一样。 Crystal 利用了工具链中内置的所有优化,它的类型检查系统在编译期间可以捕获...
  • 本文介绍了Python的图形化界面应用开发工具PyQt的功能和开发框架,通过PyQt的这些重要的工具、功能和框架机制,开发...通过以上内容的介绍,有助于PyQt或Qt不了解的初学者提了解PyQt的基本开发框架、应用界面风格。
  • 早安情话 1.新的一天,同样是爱的一天 2.今天我上班迟到了,因为我梦见,就...9.我发现特别黏,昨天一整夜在我梦里,早上醒来,又在我脑子里 10.现在我超级想你 想扑进的怀里。 11.遇见你是我所有美好故事
  • 有哪些事是当了程序员之后才知道的?

    万次阅读 多人点赞 2021-05-24 01:35:47
    这几乎是大家程序员的刻板印象,在许多眼中,他们每日在电脑前日夜奋战,长相平平无奇、发型万年不变、牛仔裤百穿不厌、性格木讷不善交际、每天不是在制造bug就是在解决bug的路上…… 甚至很多时候你都能在地铁...
  • 老师的评价和建议

    千次阅读 2021-03-17 10:36:04
    篇一:学生教师评语学生教师的评价()老师授课的方式非常适合我们,他根据本课程知识结构的特点,重点突出,层次分明。理论和实际相结合,通过例题使知识更条理化。但授课速度有点快,来不及记录。()老师授课有...
  • 手把手教用Java设计并实现一个城市公交查询系统

    千次阅读 多人点赞 2020-12-19 10:11:33
    不同的是,CGI每个客户请求打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),...
  • 这使得 sed 编辑器要比交互式编辑器快得多,可以快速完成数据的自动修改。 有了上面核心理论的了解,下面我们就可以sed进行实操演练了: sed 使用的语法格式: sed options script file 常用参数罗列: -e ...
  • 和载物的场景分别要在这4个维度上做不同的取舍,但本质上,无论是特定场景,还是半开放、开放道路,背后的技术可以是一样的。 具体如何落地? 驭势科技的核心技术路线是,基于自主和可商业化的硬件方案,通过...
  • 关于看得懂看不懂的罗永浩

    万次阅读 多人点赞 2021-01-14 12:55:24
    我之前罗永浩印象是,这个似乎有种魔力。 做什么,砸什么。 做手机,锤子变坚果归入字节名下, 做电子烟,“野”完不到二十分钟国家发布了禁烟令。 于是被笑称“行业冥灯”。 “收购苹果啥进展了” “的子弹...
  • 满意答案wanafanwei2013.07.04采纳率:54%等级:12已帮助:14665在逻辑代数中常把对偶式描述为:设F 是一个逻辑函数式,如果将F 中的所有的* 变成+,+ 变成*,0 变成1,1 变成0,而变量保持不变,所得到的新逻辑...
  • 大学计算机系最努力的同学是如何学习的?

    千次阅读 多人点赞 2021-06-23 17:47:54
    经常会有读者跟小林发私信,说我的图解系统和图解网络在面试中帮到他们,而且不少是拿到了一线的大厂。 于是,我就在想,能不能邀请这些优秀的读者来分享他面试心得和学习经验。 因为小林读者里肯定还有很多是在校...
  • 每一种情绪状态有对应的能量指数,一般有抑郁问题或其他心理问题的人群处于“负能量”的底层,来看看的能量层级是多少吧~一、关于霍金斯和能量表霍金斯是美国的著名心理学家、灵性导师。他提出了一个非常著名...
  • bomblabcsapp bomblab1—6+secret,较为全面,每个的题不一样。bomb-1bomb-2bomb-3 csapp bomblab1—6+secret,较为全面,每个的题不一样。 bomb-1 黑盒子,里面又一句口令,找到口令即可。 1.反汇编 命令行输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,758,575
精华内容 703,430
关键字:

原来你对所有人都一样