博文

目前显示的是 六月, 2019的博文

SuperScenePack3

图片
一、背景 有些同学提出“ArrayList的public <T> T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray() 方法为啥不利用泛型返回List的泛型类型的数组”?这个问题。 那让我们看下源码研究一下吧。另外我将介绍一下通用解决这类问题的方法,方便大家举一反三。 二、研究 无参源码java.util.ArrayList#toArray()        public Object[] toArray() {             return Arrays.copyOf(elementData, size);         } 底层函数java.util.Arrays#copyOf(T[], int)         @SuppressWarnings("unchecked")         public static <T> T[] copyOf(T[] original, int newLength) {             return (T[]) copyOf(original, newLength, original.getClass());         } 的确这里支持泛型。 但是我们看一下ArrayList真正存储对象的变量: transient Object[] elementData; 它的类型为Object数组。 因此从源码来看,返回值必然是Object数组了。 为啥不给转成E[] 这样呢? 一...

SuperScenePack2

图片
一、背景 程序员学到一定程度,更倾向于把技术、工作、生活联系起来,发现一些共性。 利用生活知识去类比来学习技术,并且利用技术知识反向促进生活效率的改进。 本文介绍几个提高工作效率的技巧。 下面举几个栗子。 二、举两个例子 2.1 多线程并发的思维 如果是单线程卡住了,后续任务就无法执行。Java多线程是一个很重要的概念,可以并发执行。 图 2.1 这就像我们写代码的时候如果卡壳了,可能没有及时切换到其他的任务,可能一直卡几分钟,几十分钟甚至几个小时。 其实人脑就像单核CPU,我们通过并发的形式完成更多的任务。 如果在某个地方卡住,如果不是很紧急切换到其他任务上,然后再切换回来搞(搞不定寻求帮助,有时候自己怎么都看不出来,别人一下就get到原因,节省很多时间),可以实现整体效率的最大化。 2.2 优先级队列思维 那么工作上也是这样,很少只有一项任务,可能干着干着新的任务就得插进来。 这有点像优先队列,优先级高的在前面。 注:下图并不是画优先级队列的底层结构图,只是一种方便理解的图示。 图2.2-1 如果新任务优先级更高,那么抓紧切换到新任务上去。 图2.2-2 比如任务a刚要执行完,任务d进来,d的优先级高,插入到b前面。 这里的优先级往往只是一个维度,如重要性,如紧急程度。 但是我们不能只根据紧急程度来决定优先级,有一个经典的四象限法则来指导我们的工作生活。 图2.2-3     四象限法则是时间管理理论的一个重要观念是应有重点地把主要的精力和时间集中地放在处理那些重要但不紧急的工作上,这样可以做到未雨绸缪,防患于未然。在人们的日常工作中,很多时候往往有机会去很好地计划和完成一件事。     但常常却又没有及时地去做,随着时间的推移,造成工作质量的下降。     因此,应把主要的精力有重点地放在重要但不紧急这个“象限”的事务上是必要的。     要把精力主要放在重要但不紧急的事务处理上,需要很好地安排时间。     一个好的方法是建立预约。建立了预约,自己的时间才不会被别人所占据,从而有效...

SuperScenePack

图片
前言 图片不显示这个问题在safari上会出现,不管是PC还是手机端,而其他浏览器是可以正常预览 问题 效果图 image.png safari(桌面、手机)不显示图片,其他浏览器都是正常的。 代码如下 <script> import png_no_message from '@assets/layout/message/no_message.png'; export default {   name: 'NoMessage',   render() {     return (       <div class="no-message">         <img class="no-message__img" src={png_no_message} />         <div class="no-message__desrc">暂时没有任何消息啦~</div>       </div>     );   } }; </script> <style lang="scss" scoped> .no-message {   height: 80vh;   @include flex(column);   &__img {     display: block;     width: 376px;     height: 350px;   }   &__desrc {     font-size: 32px;     color: #302c48;   } } </style>   ...

超实用的IDEA插件推荐

    里巴巴Java代码风格检查插件         名称 :Alibaba Java Coding Guidelines         插件地址:https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines         开发中遇到不符合规范的情况,会给出提示。     Codota         插件地址:https://plugins.jetbrains.com/plugin/7638-codota-       官网:https://www.codota.com/         智能代码提示         使用快捷键可以搜索知名开源项目中该类或者方法的使用案例,超赞。     Material Theme UI     插件地址 https://plugins.jetbrains.com/plugin/8006-material-theme-ui     颜值控的福音     Background Image Plus     插件地址:https://plugins.jetbrains.com/plugin/8502-background-image-plus     在IDE里设置漂亮小姐姐当背景图,写代码是不是很有效率?     Sexy Editor 也是背景图插件,支持调节透明度和位置等 https://plugins.jetb...

开发方向校招准备的正确姿势,机会留给有准备的人

一、背景 马上就快到校招的时间了。 网上有很多分享面经的地方,也有一些博文分享作者的面试经历,尤其是大公司的面试经历。 大多数是分享具体的问题,而没有系统的总结出方法论。导致大家只不过是在刷题!仅此而已! 当然刷题没错,面试常见的问题就那么多,而且这些也是未来工作需要掌握的基础。 但是我们更应该掌握怎么准备校招,找到哪些是重点,了解面试面哪些能力。  由于本人是Java工程师(前网易Java开发工程师),推荐的资料部分可能推荐的Java居多,但是通用能力是可以参考的。 注:社招也可以适当参考本文,只不过社招的要求高一些,但是部分面试能力是通用的。 二、诡异的感受 有些同学面试的时候会觉得啥都答上来的,问的问题很简单啊,咋最后没过呢?? 这种情况很大概率是稍微难一点的问题就答不上来,答上来的不全面,没深度,不想问了敷衍一下罢了。 比如问你http的请求方法是啥,你很happy的回答,有GET POST两种,xxxx。绝大多数人都可以回答上来,你的优势在哪里? 可以看这里  https://www.runoob.com/http/http-methods.html 如果你不仅可以回答GET POST,其他的都可以回答出来,甚至提到HTTP1.1新增的是哪些是不是更有优势呢?(不过小心他问你,1.1有的其他特性,需要准备下) 比如问你HTTP响应码有哪些,你脱口而出200,400,500,然后感觉自己好牛的样子,很开心,问到了自己会的问题,so easy!! 其实正确姿势可能是这样,参见https://www.runoob.com/http/http-status-codes.html 回答出2,3,4,5开头的分别啥含义,常见的有哪些,甚至还可以分析哪些场景下会出现这些情况。 比如问你线程池的优点,so easy! 准备到了! 然后问你ExecutorService 是主要的实现类,其中常用的有哪些? so easy,面试官真好,都是会的,然后巴拉巴拉: Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()。 都是干啥的,特点是啥回答完了,好开心的说。 当然这样没啥问题,但是同学你没有超出期待,你和其他同学比,...

几个本地搭建练习项目来学习的小技巧分享

一、背景 在实际开发过程中我们不了解某个类的用法,我们直接写在公司项目里? 在开发过程中我们想对比候选框架的性能,直接写在公司项目里? 很多情况是不适合写在公司项目里的,或者有把握之后再写到公司项目里。 而且我们希望这可以保存起来,未来不断丰富或者可以回头看,肿么办? 二、方法 2.1 创建git私有项目写一些demo 创建一个私有项目,可以把实验性的代码,想研究的类,在这里写单测来研究。 可以添加各种jar包,比如学习mokito, 学习Orika,甚至spring,dubbo都可以创建包或者子模块来demo学习。 还要就是这样可以永久保存,比如写了一个Stream的例子,后面忘了,或者想实验没用过的特性,直接找到之前的StreamTest类,继续写。 2.2 tutoris fork到本地 自己增删 网上有一个涉及java各方面知识的一个开源的项目,可以fork到自己仓库,随意增删修改。 https://github.com/eugenp/tutorials 2.3 如果不熟悉某个类的用法 有时候都懒得去写demo,单纯想知道常见的用法,可以用codota搜索. 常见的不常见的几乎都可以搜到,都是知名开源项目关于这些类的用法,超赞。 https://www.codota.com/code 2.4 开发过程中拉取底层jar包源码,或者平时拉取常用的技术栈源码到本地 有时候有时间想深入的了解”为什么会这样“的时候。 两种思路, 一个是开发调试的时候,进入jar包,IDEA提示你是否下载源码,你选择下载,然后源码里有注释方便你理解,而且可以打断点,观察调用栈,对学习研究有极大的帮助。 比如像研究某个jar包,点进去然后上面提示你”Download Source“ 你点击,下载某个jar包的源码 也可以在这里 也可以直接在maven选项卡里下载 另外一种是平时有时间直接拉取开源项目的源码到本地,运行单元测试专门研究某个类。或者运行其demo调试一下用法。 比如dubbo源码,可以带着某个问题去研究,也可以看某些源码指导来研究。 ---------------------

任务分解与函数拆分以及面向未来编程的思想分享

一、背景 本文可能和很多人想的不一样,没有那么高深莫测,但是可能很实用,可能更容易避免出错。 业务开发中很多人可能面临这种情况: 1、任务每次都延期,任务时间并没有通过拆分后单个评估,而是全凭拍脑袋 2、很多函数超过80行,大的意群没空行,没拆分出子函数,导致别人阅读你的代码非常痛苦 3、写代码没有灵活性,比如加了缓存的功能,后面需要拿掉,还得重新修改代码发布等。 4、到上线了发现经常担心遗漏一些配置啥的 本文先介绍任务分解和函数拆分的概念和联系,然后简单介绍一下面向未来编程的习惯。 我这里指的 “面向未来编程”是指写代码的时候要适当考虑未来的修改。 二、探讨 2.1 任务分解 极客时间《10x程序员工作法》     大多数人对于可执行的粒度认识是不足的,低估了任务分解的程度,做到好的分解你需要达到“微操作”的程度。有了分解得很小的任务,我们就可以很容易完成一个开发循环,也就让计划调整成为了可能。软件行业在倡导拥抱变化,而任务分解是拥抱变化的前提。     动手做一个工作之前,请先对它进行任务分解 有些公司提供一套完整的效率平台,包括任务的状态,项目中每个人的拆分,项目涉及的文档等等。 开发前需要对任务进行分解并且估时。 任务拆分的合理,预估的时间相对就准确,对风险的把控能力就强,如果额外加入了几个小时的紧急事情,那么比预计晚多久就相对容易评估出来。 任务分解使任务变得更容易执行,并且时间更容易评估,可以非常清晰的了解当前任务的执行进度,剩余时间。 建议大家可以借鉴类似的思想来做项目。 另外估时可以适当预留单测的时间,预留应对突然事件的时间,极少数情况会开发的这段时间不需要处理任何紧急插入的其他事务。 如果公司没有提供工具的话,可以考虑trello 或者teambition 甚至也可以在有道云笔记里,创建待办来实现。 2.2 函数拆分 很多人喜欢把所有代码写到一起,导致一个函数可能好几百行,如果其他人修改你的代码,极其痛苦。 而且自己时间久了需要修改的时候,如果注释还不够完善,自己也会浪费很多时间,而且也极容易理解错误。     《阿里巴巴Java开发手册》中建议一个函数的代码长度不要超过80行。 为了更好的编写业务函数,我们应该把业务函数拆分成几个逻辑单元,比如参数检查,查询,...

谈舒适区和成长

一、背景 好多工作的朋友聊天,总是后悔大学里没有意识到工作中该用什么东西,大学里没有主动学习某些技术。 总有一种感触:“如果大学里能够早点学习,xxx这些技术该多好啊”。 可是哪怕现在告诉自己的学弟学妹,他们依然没有这个意识。(文末再谈这个问题) 我们先一个很有意思的场景,有个人在群里问一个问题 他认为第二个参数就是下标,第三个也是。但是IDEA提示第二个是下标,第三个是元素的个数。 然后提问如何去掉这个“没用”的白色提示。 另外也有人问“IDEA好难用啊”,但是用过IDEA的绝大多数人,甚至包括开始用的时候不适应的人,都不会认为IDEA比Eclipse更难用。 还有一些人说“用MAC的纯粹,装X”等等,但是很多大公司的程序员用MAC的比用windows的更多,我想也说明了点什么。 往往是得不到的才觉得有xxx没用,往往是我们没做过某些事,没用过某些方法就倾向于盲目的否定它。 这是阻碍我们进步重要原因之一。 二、思考 以截图为例,那个提示明确告诉你,第二个是索引,第三个是长度,却因为自己不了解,意识不到它的好处而想去掉。 很多人以为这是个例,其实学习和生活中这种事情还有很多。 关于舒适区,百度百科如下定义:     舒适区(Comfort zone)指的是一个人所表现的心理状态和习惯性的行为模式,人会在这种状态或模式中感到舒适。舒适区,又称为心理舒适区。     在这个区域里,每个人都会觉得舒服、放松、稳定、能够掌控、很有安全感。     一旦走出这个区域,人们就会感到别扭、不舒服,或者不习惯。     例如,习惯了右手刷牙的人,让他用左手刷牙,他会很不舒服。     如果他是使用右手写字的人,请他用左手写字,他也会不适应。     也就是说,在他的心理舒适区内,他只能使用右手刷牙、右手写字。 我也有亲身体会,之前用了几年的Eclipse很顺手,但是周围人都开始用IDEA,我尝试第一次用IDEA,快捷键都不一样,好多熟悉的功能都找不到,感觉“不好用”,然后换了回去。 后来发现好多人都说好用,然后紧绷不住诱惑再次试了一次,适应了几天,发现IDEA颜值更高,插件很丰富,功能也很强大并没什么不好。...