sqlyog sql语句单引号在sqlyog里面成功运行在java查询就失败

&p&作者:633_重庆森林&/p&&p&链接:&a href=&https://link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/50439%3Ftype%3D0%26order%3D0%26pos%3D5%26page%3D5& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&nowcoder.com/discuss/50&/span&&span class=&invisible&&439?type=0&order=0&pos=5&page=5&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&来源:牛客网&/p&&p&&br&&/p&&p&从八月初开始投简历笔试面试,大大小小面了二十家左右的公司,一路上从牛客网上也得到了很多的干货,感谢有牛客网这个平台。前两天拿到了满意的offer,所以写一波秋招的面经总结回馈给各位牛油。&/p&&hr&&p&楼主是中部某985计算机硕士,本科非计算机相关专业,无实习,无牛逼项目,之前也没有过校招的经验。一开始处处碰壁,笔试挂,面试挂,但还好楼主稳住了心态,挂了一家,就总结自己的不足以及薄弱点,抓紧时间补强,而不是自怨自艾。最后在挂了一个半月之后,九月中旬开始的面试突然都顺利了起来,也意外拿到了满意的offer。&/p&&hr&&blockquote&校招是实力和运气的结合,缺一不可。&br&&/blockquote&&hr&&p&心态一定要摆正,毕竟我们不可能让所有人都认可你。&br&而且每家公司每个面试官的要求和风格都不一样,所以我们不要因为某家公司或者某个面试官的评价而怀疑自己。&/p&&hr&&p&挂了没有关系,咱们这个专业的优势不就在于就业面广么,现在基本上只要是个公司,就需要计算机相关专业的同学。所以大不了,再投另一家。&/p&&hr&&p&此外,楼主觉得比较重要的就是前期尽量多参加面试,多在牛客网看面经,不要觉得自己还没准备好就不敢去,面试是一个积累实战经验和提高的过程,多参加面试就是准备校招最直接最有效的方法。多投一些内推和提前批,不管是电话面试还是现场面试,前期尽量多参加,可能你最后并不会去这家公司,但是前期多面试多积累经验,多发现自己的不足,对后面的校招,轮到你真正想去的公司的面试的时候,你就有足够的(失败)经验了,不管是心态还是薄弱点都调整的差不多了。如果已经拿到理想的offer的时候,再去考虑选择性的参加也不迟。&/p&&hr&&p&主要有以下公司的面经:&/p&&ul&&li&Cvte提前批&/li&&li&阿里内推&/li&&li&便利蜂内推&/li&&li&小米内推 &/li&&li&金山wps内推&/li&&li&多益网络&/li&&li&拼多多学霸批 &/li&&li&搜狗校招 &/li&&li&涂鸦移动 &/li&&li&中国电信it研发中心&/li&&li&中兴&/li&&li&华为&/li&&li&苏宁内推&/li&&li&美团内推 &/li&&li&百度 &/li&&li&腾讯 &/li&&li&招商银行信用卡 &/li&&li&招银网络科技 &/li&&li&网易 &/li&&li&Vivo &/li&&/ul&&blockquote&此外楼主还整理了一份pdf版的面经,可以私信我&br&&/blockquote&&h2&Cvte提前批&/h2&&p&一面(电话)&/p&&ol&&li&自我介绍 &/li&&li&介绍你的项目 &/li&&li&加密解密了解么?几种算法,讲一下你了解的 &/li&&li&多线程了解么?什么是线程安全? &/li&&li&说一个你最熟悉的设计模式 &/li&&li&讲一下你项目中用到了哪些设计模式 &/li&&li&Java的hashmap的原理 &/li&&li&Hashmap的线程安全性,什么是线程安全的?如何实现线程安全 &/li&&/ol&&p&&br&&/p&&p&二面(视频)&/p&&ol&&li&自我介绍 &/li&&li&介绍项目 &/li&&li&Mysql的数据库引擎,区别特点 &/li&&li&设计模式了解?讲一下最熟悉的 &/li&&li&写一个单例模式,答主写的是双检查锁单例,问了为什么用Volatile,synchronize移到方法最外面会怎么样? &/li&&li&单例模式在你项目里哪些应用? &/li&&li&数据连接池 &/li&&li&对高负载有了解么 &/li&&li&你意向的技术方向是哪块?(答主回答的高并发,然后面试官说他是做高负载的) &/li&&li&对高并发有了解么? &/li&&/ol&&h2&阿里内推&/h2&&p&一面(电话)&/p&&ol&&li&听说你有博客,博客里大概有什么内容? &/li&&li&项目介绍,最复杂的表 &/li&&li&Hashmap的原理 &/li&&li&Hashmap为什么大小是2的幂次 &/li&&li&介绍一下红黑树 &/li&&li&Arraylist的原理 &/li&&li&场景题:设计判断论文抄袭的系统 &/li&&li&堆排序的原理 &/li&&li&抽象工厂和工厂方法模式的区别 &/li&&li&工厂模式的思想 &/li&&li&object类你知道的方法 &/li&&li&哪里用到了工厂模式 &/li&&li&Forward和redirect的区别 &/li&&/ol&&p&&br&&/p&&p&二面(视频)&br&1,
自我介绍&br&2,
项目介绍&br&3,
项目架构&br&4,
项目难点&br&5,
Synchronize关键字为什么jdk1.5后效率提高了&br&6,
线程池的使用时的注意事项&br&7,
Spring中autowire和resourse关键字的区别&br&8,
Hashmap的原理&br&9,
Hashmap的大小为什么指定为2的幂次&br&10,
讲一下线程状态转移图&br&11,
消息队列了解么&br&12,
分布式了解么&/p&&h2&便利蜂内推&/h2&&p&一面(电话)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&volatile和synchronized
&/li&&li&来个算法题:一个无序数组,其中一个数字出现的次数大于其他数字之和,求这个数字 (主元素) &/li&&li&答完再来一个:一个数组,有正有负,不改变顺序的情况下,求和最大的最长子序列
&/li&&li&项目用到什么数据库?隔离级别?每个隔离级别各做了什么 &/li&&li&数据库的索引?mysql不同引擎索引的区别
&/li&&li&垃圾回收算法的过程 &/li&&li&你了解的垃圾收集器? Cms收集器的过程 &/li&&li&怎样进入老年代?
&/li&&li&平时用到了什么设计模式?
&/li&&li&讲一下你最熟的两个设计模式 &/li&&li&用过什么系统?shell写过脚本吗? &/li&&/ol&&h2&小米内推&/h2&&p&一面(电话)&/p&&ol&&li&自我介绍 &/li&&li&看你最近博客写的是redis,介绍redis和mysql的区别 &/li&&li&Redis的应用场景 &/li&&li&Hashmap的原理 &/li&&li&Hashmap中jdk1.8之后做了哪些优化 &/li&&li&垃圾回收的过程 &/li&&li&Jvm的参数设置 &/li&&li&项目中的优化 &/li&&/ol&&h2&金山wps内推&/h2&&p&一面(电话)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&对Java的面向对象的理解 &/li&&li&对java多线程的理解 &/li&&li&数据库的索引 &/li&&li&数据库的隔离级别 &/li&&li&设计模式的理解 &/li&&li&讲几个设计模式 &/li&&li&对算法有什么了解?答主先回答了动态规划,解释了一下dp的思想 &/li&&li&快排的思想讲一下 &/li&&/ol&&p&&br&&/p&&p&二面(电话)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Tcp怎么保证可靠传输(中间穿插了好多小问题) &/li&&li&Tcp的拥塞控制 &/li&&li&让你设计一个即时聊天的系统 &/li&&li&支付宝转账,是如何实现,几个小时通知转账成功的(面试官想让回答长连接,答主一直没get到点) &/li&&li&解释一下长连接 &/li&&/ol&&h2&多益网络&/h2&&p&一面(视频)&/p&&ol&&li&自我介绍 &/li&&li&对面向对象的理解 &/li&&li&介绍多态 &/li&&li&Java新建线程有哪几种方式 &/li&&li&线程池的作用 &/li&&li&看过框架源码么 &/li&&/ol&&h2&拼多多学霸批&/h2&&p&一面(现场面)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&手撕算法:一棵二叉排序树,给定一个数,找到与给定数差值最小的数 &/li&&li&场景题:设计一个系统,解决抢购时所需要的大量的短链接的功能,如何保证高并发,如何设计短链接 &/li&&/ol&&p&二面(现场面)&/p&&ol&&li&代码量多少 &/li&&li&给了一张纸,各种名词,会的写出来 &/li&&li&然后给它解释那些会的 &/li&&li&设计题:设计一个系统,记录qq用户前一天的登录状态,提供16g内存和2tb的硬盘,要做到查询指定qq号的前一天的登录状态,快速查询O(1)复杂度 &/li&&/ol&&h2&搜狗校招&/h2&&p&一面(现场):&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&手撕算法:两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,答主用的二分,时间复杂度为O(log (m+n))。结果面试官不满意,让用归并的思想做,时间复杂度其实更高了 &/li&&li&介绍网络编程 &/li&&/ol&&h2&涂鸦移动&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&数据库的索引原理 &/li&&li&索引使用的注意事项 &/li&&li&数据库的引擎 &/li&&li&Java垃圾回收机制 &/li&&li&Java的finalize,finally,final三个关键字的区别和应用场景 &/li&&li&String类可以被继承么&br&手撕算法:假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。&br&给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。 &/li&&/ol&&p&&br&&/p&&p&二面(电话)&/p&&ol&&li&自我介绍 &/li&&li&对游戏的了解 &/li&&li&项目介绍 &/li&&li&算法题:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 &/li&&li&红黑树 &/li&&li&Redis的应用 &/li&&/ol&&h2&中国电信it研发中心&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&项目里用的什么服务器 &/li&&li&自己写一个tomcat服务器,你会怎么写 &/li&&li&分布式服务器会出现哪些问题 &/li&&li&怎么解决session一致性缓存的问题 &/li&&li&Redis的优势和特点 &/li&&li&一千万用户并发抢购,怎么设计 &/li&&li&如果成功的用户有10万,redis存不下怎么处理 &/li&&li&你项目中的难点 &/li&&/ol&&p&&br&&/p&&p&二面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&介绍spring中的熟悉的注解 &/li&&li&让你实现autowire注解的功能你会如何实现 &/li&&li&Redis和mysql的区别 &/li&&li&Redis的持久化有哪些方式,具体原理 &/li&&/ol&&h2&中兴&/h2&&p&专业面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&你了解的设计模式,讲两个 &/li&&li&Java collection类,集合,讲两个你了解的,说实现原理 &/li&&li&Java线程池的作用 &/li&&li&你觉得你在你实验室处于什么水平 &/li&&/ol&&p&综合面试(现场)&br&说好的综合面试纯聊天呢?&br&1.
自我介绍&br&2.
项目介绍&br&3.
说一下你知道的设计模式&br&4.
画一个策略模式的uml图&br&5.
Java多线程的理解&br&6.
内存屏障是什么&br&7.
数据库索引&br&8.
项目中的优化&br&9.
然后开始聊人生&br&10.
你的缺点,你最不喜欢什么样的人,你的家庭等等&/p&&h2&华为&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&项目架构 &/li&&li&项目一个完整的执行流程(由于我是搞java的,而面试官是搞c的,所以全程尬聊) &/li&&li&项目优化 &/li&&/ol&&p&&br&&/p&&p&二面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&怎么管理项目进度 &/li&&li&平常的爱好 &/li&&li&感觉面试官也不是搞java的,所以又是一阵尬聊 &/li&&/ol&&h2&苏宁内推&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&面过哪些公司了 &/li&&li&有哪些offer了 &/li&&li&聊到多益,于是开始聊最近微博上很火的多益老板 &/li&&li&得出结论,我和面试官都觉得多益老板三观有问题,但做游戏就是要偏执的人 &/li&&li&你博客主要哪方面的 &/li&&li&多线程并发包了解么 &/li&&li&讲一下countDownLatch &/li&&/ol&&p&苏宁聊了20分钟八卦就面完了,一轮技术面&/p&&h2&美团内推&/h2&&p&一面(电话)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Redis介绍 &/li&&li&了解redis源码么 &/li&&li&了解redis集群么 &/li&&li&Hashmap的原理 &/li&&li&hashmap容量为什么是2的幂次 &/li&&li&hashset的源码 &/li&&li&object类你知道的方法 &/li&&li&hashcode和equals &/li&&li&你重写过hashcode和equals么,要注意什么 &/li&&li&假设现在一个学生类,有学号和姓名,我现在hashcode方法重写的时候,只将学号参与计算,会出现什么情况? &/li&&li&往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么 &/li&&li&Redis的持久化?有哪些方式,原理是什么? &/li&&li&讲一下稳定的排序算法和不稳定的排序算法 &/li&&li&讲一下快速排序的思想 &/li&&/ol&&p&&br&&/p&&p&二面(现场)&/p&&ol&&li&自我介绍 &/li&&li&讲一下数据的acid &/li&&li&什么是一致性 &/li&&li&什么是隔离性 &/li&&li&Mysql的隔离级别 &/li&&li&每个隔离级别是如何解决 &/li&&li&Mysql要加上nextkey锁,语句该怎么写 &/li&&li&Java的内存模型,垃圾回收 &/li&&li&线程池的参数 &/li&&li&每个参数解释一遍 &/li&&li&然后面试官设置了每个参数,给了是个线程,让描述出完整的线程池执行的流程 &/li&&li&Nio和IO有什么区别 &/li&&li&Nio和aio的区别 &/li&&li&Spring的aop怎么实现 &/li&&li&Spring的aop有哪些实现方式 &/li&&li&动态代理的实现方式和区别 &/li&&li&Linux了解么 &/li&&li&怎么查看系统负载 &/li&&li&Cpu load的参数如果为4,描述一下现在系统处于什么情况 &/li&&li&Linux,查找磁盘上最大的文件的命令 &/li&&li&Linux,如何查看系统日志文件 &/li&&li&手撕算法:leeetcode原题 22,Generate Parentheses,给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。 &/li&&/ol&&p&&br&&/p&&p&三面(现场)&br&三面没怎么问技术,问了很多技术管理方面的问题&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&怎么管理项目成员 &/li&&li&当意见不一致时,如何沟通并说服开发成员,并举个例子 &/li&&li&怎么保证项目的进度 &/li&&li&数据库的索引原理 &/li&&li&非聚簇索引和聚簇索引 &/li&&li&索引的使用注意事项 &/li&&li&联合索引 &/li&&li&从底层解释最左匹配原则 &/li&&li&Mysql对联合索引有优化么?会自动调整顺序么?哪个版本开始优化? &/li&&li&Redis的应用 &/li&&li&Redis的持久化的方式和原理 &/li&&li&技术选型,一个新技术和一个稳定的旧技术,你会怎么选择,选择的考虑有哪些 &/li&&li&说你印象最深的美团点评技术团队的三篇博客 &/li&&li&最近在学什么新技术 &/li&&li&你是怎么去接触一门新技术的 &/li&&li&会看哪些书 &/li&&li&怎么选择要看的书 &/li&&/ol&&h2&百度&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&Java中的多态 &/li&&li&Object类下的方法 &/li&&li&Finalize的作用和使用场景 &/li&&li&Hashcode和equals &/li&&li&为什么要同时重写hashcode和equals &/li&&li&不同时重写会出现哪些问题 &/li&&li&Hashmap的原理 &/li&&li&Hashmap如何变线程安全,每种方式的优缺点 &/li&&li&垃圾回收机制 &/li&&li&Jvm的参数你知道的说一下 &/li&&li&设计模式了解的说一下啊 &/li&&li&手撕一个单例模式 &/li&&li&快速排序的思想讲一下 &/li&&li&给个数组,模拟快排的过程 &/li&&li&手写快排 &/li&&li&设计题,一个图书馆管理系统,数据库怎么设计,需求自己定 &/li&&/ol&&p&&br&&/p&&p&二面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Redis的特点 &/li&&li&分布式事务了解么 &/li&&li&反爬虫的机制,有哪些方式 &/li&&li&手撕算法:反转单链表 &/li&&li&手撕算法:实现类似微博子结构的数据结构,输入一系列父子关系,输出一个类似微博评论的父子结构图 &/li&&li&手写java多线程 &/li&&li&手写java的soeket编程,服务端和客户端 &/li&&li&进程间的通信方式 &/li&&li&手撕算法: 爬楼梯,写出状态转移方程 &/li&&li&智力题:时针分针什么时候重合 &/li&&/ol&&p&&br&&/p&&p&三面(现场)&br&由于三面面试官不懂java,我不熟c加加,所以全程尬聊&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&手撕算法:给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
&/li&&li&然后继续在这个问题上扩展 &/li&&li&求出最短那条的路径 &/li&&li&递归求出所有的路径 &/li&&li&设计模式讲一下熟悉的 &/li&&li&会不会滥用设计模式 &/li&&li&多线程条件变量为什么要在while体里 &/li&&li&你遇到什么挫折 &/li&&/ol&&h2&腾讯&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Hibernate的作用,你的理解 &/li&&li&多线程的理解,如何保证线程安全 &/li&&li&mysql数据库的引擎和区别 &/li&&li&场景题:千万用户抢购,如何处理高并发,并且有一个链接,指向前一天抢购成功的用户,如何设计这个系统和数据库 &/li&&li&如果后台处理抢购请求的服务器,每次最多承受200的负载,系统该怎么设计 &/li&&li&手撕算法:最小公倍数和最大公约数 &/li&&/ol&&p&二面&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&项目里一个完整请求的流程 &/li&&li&项目的优化 &/li&&li&Hibernate和mybatis的区别 &/li&&li&为什么用ssh框架 &/li&&li&Mysql的容灾备份 &/li&&li&Redis和memcache 的区别 &/li&&li&为什么选择redis &/li&&li&Java的full gc &/li&&li&Full gc会导致什么问题 &/li&&/ol&&p&&br&&/p&&h2&招商银行信用卡&/h2&&p&一面&/p&&ol&&li&自我介绍 &/li&&li&分布式事务 &/li&&li&设计模式 &/li&&li&访问者模式 &/li&&li&装饰者模式 &/li&&li&有哪些offer &/li&&li&为什么还来我们这 &/li&&/ol&&h2&招银网络科技&/h2&&p&一面&/p&&ol&&li&自我介绍 &/li&&li&写一个两个有序链表合并成一个有序链表 &/li&&li&死锁是什么呢 &/li&&li&怎么解决死锁 &/li&&li&http请求流程 &/li&&li&为什么负载均衡 &/li&&li&怎么实现负载均衡 &/li&&li&数据库挂了怎么办?除了热备份还有什么方法 &/li&&li&讲讲你对spring的理解,不要把ioc和aop背给我听 &/li&&/ol&&p&二面&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&算法:找出两个数组相等的数,不能用其他数据结构 &/li&&li&算法:给定一个数字,一个数组,找出数组中相加等于这两个数的和,不能用数据结构 &/li&&li&算法:如何判断一个树是不是另一颗树的子树 &/li&&li&如何解决并发访问的错误 &/li&&/ol&&h2&网易&/h2&&p&一面(现场)&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&I++操作怎么保证线程安全 &/li&&li&场景题:设计一个下单系统,下单成功后可以给用户发优惠券 &/li&&li&接上面场景题:服务器挂了,优惠券还没发怎么办 &/li&&li&数据库挂了怎么怎么办 &/li&&li&怎么保证一致性 &/li&&li&分布式事务知道么 &/li&&li&介绍分布式事务 &/li&&li&你的职业规划 &/li&&/ol&&p&二面&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Nio的原理 &/li&&li&Channel和buffer &/li&&li&directBuffer和buffer的区别 &/li&&li&nio和aio的区别 &/li&&li&锁的实现原理 &/li&&li&怎么解决缓存和主存的一致性问题 &/li&&li&缓存还没更新到主存,服务器挂了怎么办 &/li&&li&数据库挂了怎么办 &/li&&/ol&&h2&Vivo&/h2&&p&一面&/p&&ol&&li&自我介绍 &/li&&li&项目介绍 &/li&&li&Hibernate的batch有数量限制么 &/li&&li&Jquery用过么 &/li&&li&Extjs的优缺点 &/li&&li&有没有扩展过extjs &/li&&li&读写锁 &/li&&li&什么时候用读锁 &/li&&li&什么时候用写锁 &/li&&li&Cas的原理,使用场景 &/li&&li&数据库的瓶颈&/li&&/ol&
作者:633_重庆森林链接:来源:牛客网 从八月初开始投简历笔试面试,大大小小面了二十家左右的公司,一路上从牛客网上也得到了很多的干货,感谢有牛客网这个平台。前两天拿到了满意的offer,所以写一波秋招的面经总结回馈给各位牛油。…
&h3&引言&/h3&&p&  首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字。&/p&&p&  写这篇文章的目的其实很简单,算是对之前LZ一篇文章的补充和完善。&/p&&p&  之前LZ写过一篇《&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life51.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议&/a&》,那篇文章LZ主要介绍了如何应对社招面试,以及如何进行Java学习。&/p&&p&  文章的反响还不错,不少猿友都感叹,“如果早看到这篇文章,说不定我已经成大神了。”&/p&&p&  但是LZ只能很遗憾的告诉你,LZ那篇文章并不能让你成为大神,只能让你成为一个比大部分人优秀一点的程序猿。而且LZ自己现在都还没成为大神,如何能让你成为大神?&/p&&p&  但是,LZ可以手把手的告诉你,LZ作为一个非科班毕业,出身于三流大学的草根,是如何凭借自己的努力,进入到国内一流互联网公司的。&/p&&h3&心态&/h3&&p&  看到这个标题,有的同学可能会说,“LZ,你不是要告诉我们如何进入BAT吗?怎么一上来就写心态?”&/p&&p&  没错,LZ第一个要说的,就是心态!&/p&&p&  原因很简单,文章下面即将提到的学习内容,如果你没有一个好的心态,是不可能进行下去的。所以,先过了心态这一关,再来谈别的吧,否则你肯定会死在半路上的。&/p&&p&  说起来,很多群里的新人都爱问LZ,“你是怎么学习的?为什么我学不进去呢?为什么我一看书就困呢?”&/p&&p&  以上这种现象,基本上就是两个原因,第一个原因是心态浮躁,总觉得看书好像没啥用啊,看了好像还是觉得没学到什么,过不了多久就忘了。第二个原因则是目标感不强,不知道自己要达到什么程度才算可以,所以也就干脆“一瓶子不满,半瓶子晃荡”了。&/p&&p&  针对第一个原因,说到底就是个心态问题。总想着看书能够立竿见影,从菜鸟一下子蜕变为大神,如果你老是抱着这样的心态去看书,你特么不瞌睡才是邪门了。&/p&&p&  而第二个原因,LZ觉得有时候人要适当的激发内心的欲望,无欲无求这种高逼格的事,等你七老八十了再说,现在趁着年轻,心中有点欲望其实并不是什么坏处,只要你没被欲望懵逼了双眼就行。&/p&&p&  说起欲望这事儿,LZ觉得有必要给大家看一下LZ当初的欲望,相信从这封邮件里,你就能感受出LZ当时的欲望。这种欲望,会激励着你前进,但是你要切记,在前进的途中,调整好自己的心态,戒骄戒躁。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-916ef0b9e941cf_b.jpg& data-rawwidth=&1197& data-rawheight=&542& class=&origin_image zh-lightbox-thumb& width=&1197& data-original=&https://pic3.zhimg.com/v2-916ef0b9e941cf_r.jpg&&&/figure&&br&&h3&学习&/h3&&p&  说完心态,咱们来谈谈学习这事儿,还是老规矩,由于LZ是Java后端出身,所以接下来的内容,会与Java后端息息相关,非Java后端的同学可以适当参考,但切勿照搬。&/p&&p&  本篇文章和《&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life51.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议&/a&》不同,那篇文章更多的是从学习的角度去谈的如何学习,而本篇既然咱们是要谈如何进入BAT,那么咱们就从面试的角度来谈学习这件事,LZ会谈谈一流互联网公司对于Java后端程序员的要求,相应的,也会谈谈如何达到这样的要求。&/p&&p&  为了简单起见,LZ将这些要求分为三个层次,分别为基本要求、可选要求以及加分要求,接下来,咱们就一个一个的来谈一谈。&/p&&h4&一、基本要求&/h4&&p&  基本要求就是指,你必须要学会的知识,而且这里面大部分内容,在面试里出现的概率都是极高的。因此,这部分内容你没有选择,只能选择啃下它,你可以花一年,也可以花十年,或者带到棺材里学习也可以。&/p&&p&  1)&strong&语言的基础部分:&/strong&&/p&&p&  基本要求的第一个,当然是语言的基础部分。基础部分其实就是语法以及一些关键字的作用,像一些if/else、for循环这类基础的语法,以及一些new、class、public这类的基础关键字,大部分情况下面试问的是比较少的,因为这部分内容,只要你写过几年Java,基本上都没有什么问题。&/p&&p&&strong&那么基础部分的重点,其实主要就是static、final、transient、volatile这一类的关键字,以及内部类、泛型这一类的高阶语法。&/strong&&/p&&p&  说到static,首先要记住的最重要的一点就是,类属性中被static所引用的变量,会被作为GC的root根节点。作为根节点就意味着,这一类变量是基本上不会被回收的。因此,static很容易引入内存泄漏的风险。&/p&&p&  如果一个面试官让你解释static关键字,你告诉他static可以修饰属性、方法和内部类,以及修饰之后又有什么效果的话,那么面试官基本上不会记住你这个回答,整个印象就是平庸。&/p&&p&  但是如果你说完以后,补充一下说道,你曾经遇到过一个内存泄漏的问题,就是因为static修饰的一个Map类型的变量导致的,最后排查了堆栈信息找到了问题的所在,并且解决了这个问题。那么,面试官这个时候内心中对你的印象,就会不自然的提升几分。&/p&&p&  而且,对于static,更深入的理解是,static会将所引用的属性、方法以及内部类,与类直接产生引用关系,而非与类的实例。这就是为什么,你可以使用类名.属性、类名.方法以及类名.内部类名,来直接引用一个被static所修饰的属性、方法或者内部类。&/p&&p&  如果你没有用static修饰,那么你就必须使用实例才能引用这些方法、属性或者是内部类,最典型的就是内部类。相信很多同学都好奇过,为什么一个没有被static修饰的内部类,必须要这么声明。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();
&/code&&/pre&&/div&&p&  因为你没有使用static修饰InnerClass,所以你必须new出来一个OutterClass的实例,才能在此基础上new出内部类的实例,因为内部类只能通过外部类的实例才能引用。如果你使用了static修饰,那么你就可以这样使用内部类。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();
&/code&&/pre&&/div&&p&  这两种方式最大的区别就是,第一种方式,如果你想要获得InnerClass的实例,你必须有一个OutterClass的实例,所有其实这种方式你创建了两个实例,所以有两个new关键字。而第二种方式就好理解一些,静态内部类不依赖于外部类的实例存在,因此只需要直接创建内部类的实例就可以了,所以只有一个new关键字。&/p&&p&  static说的有点多了,不过LZ其实不光说了static关键字,也一起连同内部类的语法也大致都说了下。那么接下来,基础部分还有一个比较考验人的东西,就是volatile关键字。&/p&&p&  这个关键字的重点就三个字,就是可见性。但是面试的时候,你说出可见性三个字,基本上满分100的话,最多只能得到20分。剩下的那80分,就要靠你用硬功夫去获得了。&/p&&p&  所谓的硬功夫,其实就是要整明白,在并发当中,可见性到底是什么意思。那么,为了弄明白可见性什么意思,就需要你了解什么叫主存和工作内存。&/p&&p&  只有把这些概念都搞明白了,你才会知道volatile的真正作用到底是什么。不过有一点要提醒你的是,volatile并不保证同步,这一点一定要记住。不光是应付面试官,在真正使用volatile的时候,也要注意这一点,否则很容易出现问题。&/p&&p&  好了,基础部分就说这么多吧,LZ挑了一些有代表性的说了下,归根结底,这一部分就是要你非常清晰的了解Java当中的关键字和语法,这里所谓的了解,是清晰的了解其实现原理,而非简单的会用而已。&/p&&p&&strong&2)Java运行时环境&/strong&&/p&&p&&strong&Java运行时环境就是JRE的中文翻译,本质上其实就是指JVM。&/strong&&/p&&p&  首先对于JVM必须要知道的是,JVM与Hotspot的关系。JVM更多的是指JVM规范,而Hotspot是JVM的一种实现,也是我们最常用的JVM实现。你可以把JVM规范当做接口,Hotspot当做实现类,这样去理解会比较简单一些。&/p&&p&  此外,&strong&JVM最重要的三个部分必须要非常清楚,内存划分、class加载机制以及GC策略。搞清楚这三部分不仅仅是为了面试,也是为了让你对于Java有更深刻的理解,这对于你的Java生涯非常有帮助。&/strong&&/p&&p&  而且,关于内存划分,还有一点要注意,咱们常说的划分方式,其实是指的Hotspot的划分方式,而非JVM规范所规定的。&/p&&p&  Hotspot的内存划分简单说分为三个部分,Young Generation(年轻代)、Old Generation(年老代)以及Perm Generation(永久代)。其中的Young Generation(年轻代),又分为Eden、From和To,其中From和To又统称为Survivor Spaces(幸存区)。&/p&&p&  正常情况下,一个对象从创建到销毁,应该是从Eden,然后到Survivor Spaces(幸存区),再到Old Generation(年老代),最后在某次GC下消失。&/p&&p&  当然,一个对象也可能直接在Eden里死掉,也可能一直在Old Generation(年老代)存活,这些都是有可能的。&/p&&p&  关于内存划分,可以自己没事用内存分析工具看看,比如jmap、jvisualvm等等,观察一下各个区域的内存变化,结合实际去了解一下。&/p&&p&  关于classloader机制的学习,可以结合tomcat去学习,了解清楚tomcat的classloader机制,看tomcat是如何保证各个APP之间的类隔离的。如果可能的话,看一下tomcat中classloader的源码,或者看一下LZ的一个开源项目&a href=&https://link.zhihu.com/?target=https%3A//github.com/xiaolongzuo/niubi-job& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&niubi-job&/a&,当中也包含了与tomcat类加载机制相似的部分。&/p&&p&  至于GC,需要清楚GC Roots都有哪些,以及如何判断一个对象可以被回收。此外,GC的算法和策略也要有大概的了解,具体的可以参见LZ关于这一系列的文章,地址为&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/category/508918.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JVM内存管理 - 随笔分类&/a&。&/p&&p&&strong& 3)并发知识与concurrent包&/strong&&/p&&p&  要想进入一线互联网公司,这部分内容必须要会,否则的话,你始终都只能停留在比较low的段位。&/p&&p&&strong&关于并发知识,最重要的两个概念一定要搞清楚,那就是可见性和原子性。&/strong&其中可见性与前面提到的volatile关键字是息息相关的,可见性只是并发领域里的一个概念,而volatile则是Java语言中,实实在在保证变量可见性的关键字。&/p&&p&  前面说了,要弄清楚可见性,就需要搞清楚主存和工作内存。关于主存和工作内存,其实又属于JVM的知识范畴。所以从这里就可以看出来,知识都是有关联性的。&/p&&p&  原子性其实相对于可见性来说,反倒更好理解一些,相信那个万年不变的银行汇款的关于事务的例子,就足以大部分人理解原子性这个概念了,它其实就是一个或多个操作,被视作一个整体的意思。&/p&&p&&strong&有了并发的基础知识以后,你就需要研究一下concurrent包了。&/strong&这里面的东西其实是一个宝藏,一旦你需要写并发相关的功能,你会发现这里面的东西非常实用。&/p&&p&  其中ConcurrentHashMap是面试最容易被问到的一个类,几乎所有的面试都会问你,ConcurrentHashMap和普通的同步HashMap有什么区别。&/p&&p&  这个问题其实需要你知道两个知识就可以了,一个是HashMap的数据结构,一个是锁分段的技术,具体的LZ这里就不解释了,大家自己下去找相关资料看吧。&/p&&p&&strong&此外,concurrent包里有一个非常重要的类,叫做AbstractQueuedSynchronizer,几乎所有的concurrent包内的并发工具类,都是基于这个抽象类扩展出来的。&/strong&因此,把AbstractQueuedSynchronizer这个类研究透彻,非常有助于你理解concurrent包。&/p&&p&  最后一点,面试的时候还经常会被问到的一个问题,就是ReentrantLock和synchronized关键字有什么区别。&/p&&p&  记得LZ之前组织过的YY面试活动里,LZ问过很多次这个问题,但几乎所有人都答不出来。这只能说明一个问题,那就是大部分人在用synchronized和ReentrantLock的时候,并不会考虑这两者到底用哪个好一些。&/p&&p&  其实它们的区别很简单,简单的说,就是synchronized由于是底层JVM实现的互斥,因此效率会高一些。而ReentrantLock的功能则比synchronized更多,比如定时获取某个锁,多个等待条件等。&/p&&p&  并发这一部分是一个程序员进阶的重要部分,希望所有Java程序员都可以重视这一部分。&/p&&p&&strong&4)设计模式和反射&/strong&&/p&&p&  设计模式和反射这部分内容,LZ个人觉得是一个高阶程序员必须精通的部分。&/p&&p&  用好了这部分知识,可以让你在实际开发中少写N多代码,而且还可以使得程序的结构更加良好。&/p&&p&  关于设计模式LZ这里就不多做介绍了,具体的可以看LZ的设计模式系列文章,地址是&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/category/509144.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&设计模式 - 随笔分类&/a&。&/p&&p&  关于反射,其实就是reflect包里的内容,这个包里的类其实并不难,主要是得多用,多看。比如Java领域里最常用的spring框架,里面其实大量充斥着设计模式和反射的真实使用场景,没事多研究一下,绝对让你受益匪浅。&/p&&p&&strong&5)文件IO、NIO、网络IO以及网络协议&/strong&&/p&&p&  文件IO、NIO以及网络IO这一部分也是工作当中要经常用到的部分,因此也必须要掌握。&/p&&p&  其中NIO更多的是了解其原理,此外,tomcat中有多种协议的实现,其中包括了BIO、NIO和APR,这三者一定非常清楚它们的区别,这个可以在connector的protocol属性配置。&/p&&p&  至于网络IO部分,其实就是net包里的内容。这里面的内容是非常常用的东西,比如你调用HTTP-API,那么就需要使用这里面的类。在这个restful-API泛滥的时代,你少不了要使用HTTP协议调用API。&/p&&p&  此外,在了解这部分的时候,网络协议也要适当的了解一下,最典型的TCP和HTTP协议是一定要了解的。&/p&&p&  在LZ参加的面试中,基本上TCP协议是一定会问的,虽然这可能和LZ的简历写了TCP协议有关,但比如TCP协议的重试机制,三次握手的过程,TCP与UDP的区别这一类的知识,还是要了解一下的。&/p&&p&  至于HTTP协议,相对来说就简单很多了,应用层的协议主要是知道其协议格式即可,比如都支持哪些header、每个header都是什么含义等等。&/p&&p&&strong&  6)小结&/strong&&/p&&p&  好了,到此为止,基本要求就差不多介绍完了。细心的猿友可能会注意到,这些内容其实和LZ上一篇文章&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life53.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。》&/a&,有不少的相通之处。&/p&&p&  没错,其实基本要求这部分,差不多就是要求你有扎实的Java基础。这也是所有一线互联网公司,基本都会写在招聘要求地前几条的要求。&/p&&p&  因此,要想进入BAT,那么这一部分的内容一定要了解,而且这部分的内容对你实际开发也是非常有帮助的,并不仅仅是为了应付面试。&/p&&h4&二、可选要求&/h4&&p&  看到可选要求四个字,或许不少人会认为这部分不太重要。但是LZ可以很负责的告诉你,这部分往往才是决定公司要不要你的重要指标。&/p&&p&  因为基本要求达标以后,公司主要挑选人才的标准其实就是可选要求这一部分,在之前《&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life51.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议&/a&》这篇文章中,LZ曾经提过差异性这个词,其实这一部分就是差异性的体现。&/p&&p&  接下来,LZ就带大家看看,到底都有哪些可选的要求。此外,LZ要提前说明的是,这些可选要求,没有必须会和必须不会的内容,尽可能多的了解,总是不会错的。&/p&&p&&strong&1)Spring、Mybatis框架&/strong&&/p&&p&  框架这部分其实不用多说了,spring和mybatis框架的原理和源码,如果你可以非常精通的话,那么这一定能成为你巨大的优势。&/p&&p&  如果你是专门做WEB开发的Java后端猿,那么spring和mybatis框架基本上你是肯定要用的。精通Spring和mybatis框架不仅为了面试,对于你日常开发也有巨大的帮助,你可以做很多架构上的优化,为你的战友省去很多重复性的工作。&/p&&p&  关于Spring框架,最核心的当然是IOC,其次便是AOP、MVC这两部分了。好好研究这三部分的源码,会让你从大部分程序员当中,脱颖而出。至于mybatis框架,主要还是关注它如何实现动态SQL。&/p&&br&&p&  而且,待你研究透彻以后,你完全可以自己尝试去造轮子,说不定能得到意想不到的收获。&/p&&p&&strong&2)Linux服务器&/strong&&/p&&p&  这一部分其实原本是运维应该精通的部分,但是作为一个Java后端猿,如果你可以精通linux服务器,那么对你排查线上问题,是有很大的帮助的。&/p&&p&  大部分程序员都只知道一些常用的Linux命令,对于Linux系统本身的文件系统、网络以及IO等等,是完全不了解的,这其实也包括LZ自己。但是,LZ见过身边有一些程序员,对于Linux玩的非常熟练,这不光光体现在多会几个命令,而是对整个Linux系统的了解。&/p&&p&  可以预见的是,这些人在排查问题的时候,往往会更容易找到问题的根本。因为程序问题往往并不是最难解决的,异常这东西见多了就都知道怎么回事了,大不了看看源码也总能找到原因。最难解决的是环境问题,而环境问题无非就是操作系统层面的问题。&/p&&p&  而显然大部分情况下,Java运行的操作系统都是Linux。&/p&&p&&strong&3)数据库优化&/strong&&/p&&p&  说完Linux,紧接着LZ要说的就是数据库了,这原本应该是DBA应该精通的部分,但作为一个Java后端猿,数据库基本上也是最经常打交道的了。&/p&&p&  而且大家都知道,一个应用的性能瓶颈,往往都出现在数据库这一端,因此,一个Java后端猿如果可以精通数据库的话,那么对于你工作的实际帮助,也是非常大的。&/p&&p&  相信不少人都碰到过SQL过慢的情况,这个时候,如何通过加索引、SQL分析和优化的手段,将SQL的执行时间优化到一个可接受的范围内,其实还是比较考验人的。&/p&&p&  反正,这玩意儿LZ是半斤八两的水平,基本的优化是没有问题的,但稍微复杂一些的就不行了。&/p&&p&  所以,这一部分足够成为你的优势,体现出你的差异性。&/p&&p&&strong&  4)消息服务&/strong&&/p&&p&  除了Linux和数据库以外,消息服务也是当今互联网公司里,必不可少的一个组件。&/p&&p&  常见的消息组件比如rabbitMQ、activeMq,包括一些其它的开源消息组件,比如rocketMq。这里面任何一个,如果你可以精通其原理的话,也会成为你有力的竞争条件。&/p&&p&  其实消息服务的重点,无非就是如何保证最终一致性、消息的顺序,包括消息事务等等这一类的问题。&/p&&p&  虽然LZ本人对此不是很了解,但LZ很确定,这一部分如果你可以有自己独到的见解的话,一定会大大增加你的成功率。&/p&&p&&strong&  5)缓存服务&/strong&&/p&&p&  说了消息服务以后,相信缓存服务大家也一定不陌生了。&/p&&p&  常见的缓存比如memcached、redis这两个,如果你能搞清楚其中一个的话,也会给你加分许多。毕竟现在的互联网应用,缓存也是必不可少的了,因此如果你能完全hold住缓存这一部分,那么你的差异性也就有了。&/p&&p&  在缓存服务当中,有几个问题也是比较常见的,比如缓存满了怎么办,缓存的实时性如何处理,内存结构如何规划,分布式的情况下如何处理增删节点时缓存的命中问题等等。&/p&&p&&strong&6)负载均衡器&/strong&&/p&&p&  负载均衡器,这是最后一个可选要求了。&/p&&p&  常见的负载均衡器就两种,一种是软负载均衡,比如nginx、Apache、lvs这一类的。另外一种则是硬件负载均衡,常见的主要就是F5。&/p&&p&  这两种方式各有优劣,其中硬件负载均衡如要用于简单应用、大访问量的场景,而软件复杂均衡则主要用于复杂应用,较小访问量的场景。当然了,两者还有一个不得不考虑的区别是,硬件复杂均衡一般都是非常贵的,而软负载均衡则基本上没有任何成本。&/p&&p&  在负载均衡器方面,也有一些问题是比较常见的。比如如何保持会话,如何做流量控制,负载均衡策略都有哪几种,如何检查后端服务器的健康状态等等。&/p&&p&&strong&7)小结&/strong&&/p&&p&  好了,到这里,可选要求就说的差不多了。&/p&&p&  细心的猿友会发现,这6个要求其实对应的就是Java后端开发中,最常接触到的一些东西。比如spring、mybatis框架和数据库,这两者基本上是个Java程序员都接触过吧。&/p&&p&  其余四个包括Linux服务器、消息服务、缓存服务以及负载均衡器,也是一样的,大家在实际工作当中,应该或多或少都接触过这几个东西。&/p&&p&  但是真正能对其中一个非常了解精通的人,相信并不会太多。也正因为如此,如果你做到了,才可以体现出你的差异性,这或许会是你拿下offer的重要筹码之一。&/p&&p&  但是,LZ这里必须要再强调一下的是,这几样东西大多数人或多或少都会有一些了解,包括上面LZ提到的问题,不少人也都知道答案。&/p&&p&  然而,光知道答案是远远不够的,这并不足以成为你的优势,你需要对这些问题有着深刻的了解,以及有着自己独特的见解,才足以让它成为你的优势。&/p&&h4&三、加分要求&/h4&&p&  最后一个便是加分要求了,加分要求虽然不如基本要求和可选要求重要,但它也与可选要求类似,往往拿下offer的最终原因,正是这些看似不是必要要求的部分。&/p&&p&  接下来,LZ就带大家一起来看一下,都有哪些可以加分的部分,这一部分其实在之前那篇文章《&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life51.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议&/a&》中已经提到过,这里就再详细说一下。&/p&&p&  此外,LZ要强调的是,这些加分要求中,在某些特殊情况下,可能会成为基本要求。&/p&&p&&strong&1)数据结构与算法&/strong&&/p&&p&  这一部分内容不用多说了,大家都懂的。精通数据结构与算法,绝对会成为你的一大亮点。&/p&&p&  因为大部分程序员的这一部分基础都不太好,包括LZ本人,面试的时候如果问到算法一类的问题,LZ基本上就两个字:不会。&/p&&p&  以前LZ还看过Java集合框架的一些源码,对于一些常用的数据结构还有一定的了解。但是现在,LZ已经基本上忘光了,就连最基本的冒泡排序,可能LZ都不一定能写的对。&/p&&p&  因此可以预见的是,数据结构与算法绝对是非常加分的一项。而且,在你面试一些与算法相关的职位时,这个加分要求还可能会成为基本要求。&/p&&p&&strong&2)计算机操作系统&/strong&&/p&&p&  计算机操作系统原理,是非常底层的内容。&/p&&p&  这部分内容比较难,里面讲的都是一些最基本的底层原理,例如内存、指令、系统IO等等。LZ之前也研读过一本关于操作系统的书,也写了一系列文章,地址是&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/category/518480.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机系统原理&/a&。&/p&&p&  不过LZ看的还是不够全面和深入,如果你可以将操作系统研究透彻的话,那么在面试的时候,你完全可以以此作为突破点,展示你的亮点。&/p&&p&&strong&3)计算机网络&/strong&&/p&&p&  其实网络这一部分,对于程序员来说还是比较重要的。&/p&&p&  LZ最近正在做的事情,就经常会碰到一些网络上的问题,虽然很多时候,这些问题其实可以找专门的网络人员去解决,但如果你自己对此不够了解的话,对于你的工作还是会造成很大的障碍。&/p&&p&  而且,要想精通TCP/IP协议,如果对计算机网络不了解的话,还是很难真正理解的。&/p&&p&  因此,计算机网络部分如果你可以精通的话,这也绝对会成为你的一个加分项。&/p&&p&&strong&4)熟练使用一种脚本语言&/strong&&/p&&p&  脚本语言在很多时候是很方便的,而且也非常实用。&/p&&p&  LZ最近就被迫正在使用Python做很多事情,其实用了以后你会发现,虽然Java也可以实现同样的目的,但确实选择合适的语言,会帮你节省大量的精力。&/p&&p&  因此,如果你可以熟练使用一种脚本语言,比如Python、shell等等,这也必定会成为你的加分项。&/p&&p&&strong&  5)你的github和博客&/strong&&/p&&p&  这点相信大部分人也都知道,如果你拥有自己的github和博客,并且里面有不少有价值的内容的话,那么一定会为你加不少分。而且,说起github和博客这件事,LZ还有一个关于自己真实的故事,在文章的最后给大家分享,这里就暂时不提了。&/p&&p&  此外,就不说面试这回事,平时在github写写代码,在博客里写写文章,总结总结自己的技术和职场,也是非常有好处的。相信不少猿友都已经体会到了这其中的益处,LZ也就不再多说了。&/p&&p&  毕竟说多了也无益,最主要的还是自己要真真实实的去做,如果你希望可以在这方面加分,那就从当前做起,并且坚持下去。&/p&&p&&strong&6)小结&/strong&&/p&&p&  到这里,加分的要求就说的差不多了。&/p&&p&  其实能够加分的内容还有很多,LZ只不过列出了比较常见的几种而已,比如你有其它一线互联网公司的背景,这也是可以加分的。只不过这种加分项比较难达到,而且,这里更多说的是草根程序员,因此LZ这里就没多说。&/p&&p&  总的来说,加分要求和可选要求一样,都是你致胜的关键部分,因此如果可能,还是要在加分要求上下一些功夫的。&/p&&h4&学习小结&/h4&&p&  关于学习这部分,到这里就说的差不多了。&/p&&p&  就像上一篇&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/zuoxiaolong/p/life53.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。》&/a&文章里说道的一样,其实大部分一线互联网公司,对于招人的技术要求就两个,扎实的Java基础和一个一技之长。&/p&&p&  扎实的Java基础,其实就是本文中基本要求的部分,而一技之长,其实就是可选要求和加分要求中任意挑选一个就可以了。&/p&&p&  当然了,不可否认的是,可选要求和加分要求中,你会的越多,成功率就越高,这点是毋庸置疑的。但是如果你一点优势都没有的话,就算你Java基础再扎实,其实也很难进去,因为你这样的人太多了,无法在众多面试者中脱颖而出。&/p&&p&  虽然不排除你运气特别好,当时公司正好急缺人,而且没有其他更好的面试者,导致你很幸运的拿到了offer,但毕竟这种概率实在是太小了一些。&/p&&p&  说来说去,知识是摆在那里的,不会跑也不会动,就看你学或不学,以及什么时候学。&/p&&p&  有的人毕业后一两年就达到了,有的人用了三五年才达到,而有的人,则是一辈子都没有达到。要做什么样的程序员,就全看你自己了。&/p&&h3&素养&/h3&&p&  说完了心态和学习,咱们来谈谈一个程序员应该有的素养。这部分虽然看似对面试没什么帮助,但其实LZ有时候觉得,这比技术更重要,因为它们可能会影响到你程序员生涯的发展。&/p&&h4&一、代码风格&/h4&&p&  说到程序员的素养,第一个就是代码风格。&/p&&p&  虽然代码风格并没有绝对正确的风格,但是在满足基本的Java代码风格的前提下,你应该逐渐形成自己的代码习惯,而且必须是一个好习惯。&/p&&p&  说个最简单的例子,不管你多么厉害,如果你的变量命名是用拼音来命名的话,那么别人对你的印象一定是,这是个非常low的程序员。&/p&&p&  其实程序员有时候和艺术家很像,一个专注于绘画的艺术家,一般都会有自己的风格。说得夸张一点,可能他的画只要拿出去,就有人能认出来,这其实就是一种风格。&/p&&p&  作为一个程序员,你也应该有你自己的代码风格,虽然在工作中,为了大家更好的通过代码沟通,你或多或少的需要做一些妥协,和大家保持一致的风格。&/p&&p&  但是你自己的开源项目,它应该是你的艺术品,你在雕琢它的同时,其实也是在形成你独特的代码风格。&/p&&p&  而且,有的时候,你的开源项目,可能可以直接或间接的帮助你,获得一份不错的offer。&/p&&h4&二、写作能力&/h4&&p&  看到这个或许有的人会很意外,但是LZ个人觉得,写作能力是一个程序员应该有的素养。&/p&&p&  代码风格只是你写代码的素养,你还需要有写文字的能力和素养。一个程序员是否专业,文档和注释也是一个很重要的衡量标准。&/p&&p&  因为不管你的技术多么厉害,别人看到的,除了你的代码以外,就是你的文档和注释。这部分能否写好,在很多时候,直接决定了别人对你的印象。&/p&&p&  因此,写作能力其实也是一个程序员应该有的素养,至少LZ一直是这么认为的。因为不管这个人的技术多么厉害,如果他的文档和注释写的一团糟,丝毫体现不出专业二字,那么他的形象一定会在LZ心中大打折扣。&/p&&h3&结尾&/h3&&p&  本文从心态、学习和素养三个方面简单谈了谈如何进入BAT,但其实这也是一个程序员学习和提高自己的过程。&/p&&p&  在提到github和博客时,LZ说了要在文章的最后,给大家讲一个关于LZ自己的真实故事,其实这个故事就是LZ来杭州的真实经历。&/p&&p&  LZ之所以能进入现在的公司,其实很大一部分就是因为LZ有一个经常更新的博客,和一个造了几个轮子的github。说起来,LZ真的是运气非常好,或者说是平时的努力,给LZ带来了好运气。&/p&&p&  两年多以前,LZ特别想进入中间件团队,但是发简历老是没有回音,于是LZ就给中间件团队的leader,写了一封求职邮件,表明自己非常想进入中间件团队,做服务于技术人员的工作,希望能够得到面试机会。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-69d5ecba48a175e6673f9_b.jpg& data-rawwidth=&1880& data-rawheight=&924& class=&origin_image zh-lightbox-thumb& width=&1880& data-original=&https://pic2.zhimg.com/v2-69d5ecba48a175e6673f9_r.jpg&&&/figure&&p&  可惜的是,当时这个中间件的前辈并没有回复LZ的邮件,原本LZ以为是自己的简历没有打动对方。不过LZ后来才知道,其实是因为当时这个前辈已经离开了中间件。&/p&&p&  不过,两年以后,也就是2016年过完年以后,LZ的博客里无意间收到了一封短信,正是中间件团队的成员发给LZ的邀请。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e2a879c1f3985d65fcbd027f25158c90_b.jpg& data-rawwidth=&1710& data-rawheight=&825& class=&origin_image zh-lightbox-thumb& width=&1710& data-original=&https://pic3.zhimg.com/v2-e2a879c1f3985d65fcbd027f25158c90_r.jpg&&&/figure&&p&  可以看到,这封短信正是今年过完年LZ收到的。刚开始的时候,LZ还没注意到有这么一封短信。直到过完年上了十来天班以后,差不多快三月份了,LZ才注意到短信箱里的这个短信。&/p&&p&  LZ清晰记得,当时看到的时候是周四,LZ看到的时候很意外。&/p&&p&  虽然当时LZ并没有跳槽的打算,那段时间也从未投过一封简历,不过出于不聊白不聊的原则,LZ还是当天就把简历发给了这位前辈。&/p&&p&  出乎意料的是,周四和周五仅仅两天,LZ接连不断的经过了四轮电话面试,就从前辈这里得知,LZ非常顺利的通过了面试,就等着拿offer就可以了。&/p&&p&  当时听到这个消息的时候,说实话,LZ真的觉得和做梦差不多。&/p&&p&  原本一两天前,LZ还处于刚过完年假的不适应期,同时还在纠结手里的需求怎么实现。突然之间就要奔赴杭州,进入自己期待已久的公司,期待已久的部门,展开另外一番职业生涯了。&/p&&p&  LZ当时真心觉得,这世间的事情,实在是太特么神奇了。当时LZ脑子里不自觉地冒出来的一句话就是,功夫不负有心人啊!&/p&&p&  LZ日积月累的写了这么多文章,终于没有白写,给LZ换来了一个机会。&/p&&p&  以前LZ觉得,像什么“功夫不负有心人”这一类的话,都是给别人灌鸡汤打鸡血的话而已。但真正自己遇到的时候,才会真切的体会到,有的时候道理就是这么简单,区别就在于你做还是没做。&/p&&p&  就像这篇文章里LZ写的一样,今天你看到了,你做了,那或许未来的某一天,你会感谢今天努力的你。但如果你看到了,没有做,或许你依旧还是那个,整天抱怨工作没劲,加班太累的人,然后在碌碌无为和怨天尤人中度过。&/p&&p&  LZ也不想给大家灌什么鸡汤,打什么鸡血,但是LZ想告诉大家,程序员这个职业很公平,相信不少人当初踏上这条路的时候,也是觉得程序员这个职业充满着奋斗的气息,可以依靠自己的努力改变自己的命运,而不像某些职业一样需要拼爹。&/p&&p&  在程序员这条路上,努力,你就有很大希望成就自己的目标和梦想。不努力,那你就基本上原地踏步下去,直到被后浪拍死在沙滩上。&/p&&p&  如何抉择,其实完全看你自己,只要你不后悔你的决定。所以,少点抱怨,多点行动。&/p&&p&  如果你能接受平庸下去,那就平庸下去,幸福的过完你的一生,也没什么不好。否则,你就坚持努力下去,直到达到你一个又一个目标。&/p&&p&  最怕的情况就是,心中充满了欲望,不甘于平庸,却又不愿意努力的人,这样的人,如果做了程序员,真的是一种悲哀。&/p&
引言 首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字。 写这篇文章的目的其实很简单,算是对之前LZ一篇文章的补充和完善。 之前LZ写过一篇《》,那篇文章LZ主…
&figure&&img src=&https://pic3.zhimg.com/v2-fbad8d21ace935c_b.jpg& data-rawwidth=&750& data-rawheight=&340& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic3.zhimg.com/v2-fbad8d21ace935c_r.jpg&&&/figure&&blockquote&&p&作者:JavaQ&/p&&p&原文链接:&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/1f1d& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java方向如何准备BAT技术面试答案(汇总版)&/a&&/p&&/blockquote&&p&这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分散,所以本篇做了一个汇总,同时对部分内容及答案做了修改,欢迎朋友们吐槽、转发。因为篇幅长度和时间的原因,部分答案我没有亲自总结。&/p&&h1&1.面向对象和面向过程的区别&/h1&&p&面向过程&br&优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。&br&缺点:没有面向对象易维护、易复用、易扩展&br&面向对象&br&优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护&br&缺点:性能比面向过程低&/p&&h1&2.Java的四个基本特性(抽象、封装、继承,多态)&/h1&&p&抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。&br&封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。&br&继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。&br&多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。&/p&&h1&3.重载和重写的区别&/h1&&p&重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。&br&重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。&/p&&h1&4.构造器Constructor是否可被override&/h1&&p&构造器不能被重写,不能用static修饰构造器,只能用public&br&private protected这三个权限修饰符,且不能有返回语句。&/p&&h1&5.访问控制符public,protected,private,以及默认的区别&/h1&&p&private只有在本类中才能访问;&br&public在任何地方都能访问;&br&protected在同包内的类及包外的子类能访问;&br&默认不写在同包内能访问。&br&6是否可以继承String类#&br&String类是final类故不可以继承,一切由final修饰过的都不能继承。&/p&&h1&7.String和StringBuffer、StringBuilder的区别&/h1&&p&可变性&br&String类中使用字符数组保存字符串,private&br&final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]&br&value,这两种对象都是可变的。&br&线程安全性&br&String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。&br&性能&br&每次对String 类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String 对象。StringBuffer每次都会对&br&StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用&br&StirngBuilder 相比使用&br&StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。&/p&&h1&8.hashCode和equals方法的关系&/h1&&p&equals相等,hashcode必相等;hashcode相等,equals可能不相等。&/p&&h1&9.抽象类和接口的区别&/h1&&p&语法层次&br&抽象类和接口分别给出了不同的语法定义。&br&设计层次&br&抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。&br&跨域不同&br&抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在&is-a&&br&关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,&like-a&的关系。&/p&&h1&10.自动装箱与拆箱&/h1&&p&装箱:将基本类型用它们对应的引用类型包装起来;&br&拆箱:将包装类型转换为基本数据类型;&br&Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。&/p&&h1&11.什么是泛型、为什么要使用以及泛型擦除&/h1&&p&泛型,即“参数化类型”。&br&创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。&br&Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。&br&类型擦除的主要过程如下:&br&1).将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。&br&2).移除所有的类型参数。&/p&&h1&12.Java中的集合类及关系图&/h1&&p&List和Set继承自Collection接口。&br&Set无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。&br&List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。&br&Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。&br&SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。&/p&&h1&13.HashMap实现原理&/h1&&p&具体原理参考文章:&br&&a href=&https://link.zhihu.com/?target=http%3A//zhangshixi.iteye.com/blog/672697& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入Java集合学习系列:HashMap的实现原理 - 莫等闲 - ITeye技术网站&/a&&br&&a href=&https://link.zhihu.com/?target=http%3A//www.admin10000.com/document/3322.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HashMap的工作原理 - 全栈开发者&/a&&/p&&h1&14.HashTable实现原理&/h1&&p&具体原理参考文章:&br&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/skywang12345/p/3310887.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例 - 如果天空不死 - 博客园&/a&&br&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/chdjj/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【源码】Hashtable源码剖析 - RowandJJ的小窝 - 博客频道 - CSDN.NET&/a&&/p&&h1&15.HashMap和HashTable区别&/h1&&p&1).HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。&br&2).HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。&br&3).HashTable有一个contains(Object&br&value)功能和containsValue(Object&br&value)功能一样。&br&4).HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。&br&5).HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。&br&6).哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。&/p&&h1&16.ArrayList和vector区别&/h1&&p&ArrayList和Vector都实现了List接口,都是通过数组实现的。&br&Vector是线程安全的,而ArrayList是非线程安全的。&br&List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。&/p&&h1&17.ArrayList和LinkedList区别及使用场景&/h1&&p&区别&br&ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。&br&LinkedList底层是通过双向链表实现的, LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(),&br&peek(), poll()等方法。&br&使用场景&br&LinkedList更适合从中间插入或者删除(链表的特性)。&br&ArrayList更适合检索和在末尾插入或删除(数组的特性)。&/p&&h1&18.Collection和Collections的区别&/h1&&p&java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。&br&java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。&/p&&h1&19.Concurrenthashmap实现原理&/h1&&p&具体原理参考文章:&br&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/ITtangtang/p/3948786.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java集合---ConcurrentHashMap原理分析 - 牛奶、不加糖 - 博客园&/a&&br&&a href=&https://link.zhihu.com/?target=http%3A//ifeve.com/concurrenthashmap/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&并发编程网 - ifeve.com&/a&&/p&&h1&20.Error、Exception区别&/h1&&p&Error类和Exception类的父类都是throwable类,他们的区别是:&br&Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。&br&Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。&/p&&h1&21.Unchecked&/h1&&p&Exception和Checked Exception,各列举几个#&br&Unchecked Exception:&br&a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复。&br&b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError,&br&UndeclaredThrowableException, IllegalArgumentException,&br&IllegalMonitorStateException, NullPointerException, IllegalStateException,&br&IndexOutOfBoundsException等。&br&c. 语法上不需要声明抛出异常。&/p&&p&Checked Exception:&br&a. 代表程序不能直接控制的无效外界情况(如用户输入,数据库问题,网络异常,文件丢失等)&br&b. 除了Error和RuntimeException及其子类之外,如:ClassNotFoundException,&br&NamingException, ServletException, SQLException, IOException等。&br&c. 需要try catch处理或throws声明抛出异常。&/p&&h1&22.Java中如何实现代理机制(JDK、CGLIB)&/h1&&p&JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。&br&CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。&/p&&h1&23.多线程的实现方式&/h1&&p&继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。&/p&&h1&24.线程的状态转换&/h1&&figure&&img src=&https://pic4.zhimg.com/v2-249e45a2bccbeec2e9564_b.jpg& data-rawwidth=&730& data-rawheight=&496& class=&origin_image zh-lightbox-thumb& width=&730& data-original=&https://pic4.zhimg.com/v2-249e45a2bccbeec2e9564_r.jpg&&&/figure&&br&&h1&25.如何停止一个线程&/h1&&p&参考文章:&br&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/greta/p/5624839.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何正确地停止一个线程? - 王晓符 - 博客园&/a&&/p&&h1&26.什么是线程安全&/h1&&p&线程安全就是多线程访问同一代码,不会产生不确定的结果。&/p&&h1&27.如何保证线程安全&/h1&&p&对非安全的代码进行加锁控制;&br&使用线程安全的类;&br&多线程并发情况下,线程共享的变量改为方法级的局部变量。&/p&&h1&28.synchronized如何使用&/h1&&p&synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:&br&1). 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;&br&2). 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;&br&3). 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;&br&4). 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。&/p&&h1&29.synchronized和Lock的区别&/h1&&p&主要相同点:Lock能完成synchronized所实现的所有功能&br&主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。Lock的锁定是通过代码实现的,而synchronized是在JVM层面上实现的,synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。Lock锁的范围有局限性,块范围,而synchronized可以锁住块、对象、类。&/p&&h1&30.多线程如何进行信息交互&/h1&&p&void notify() 唤醒在此对象监视器上等待的单个线程。&br&void notifyAll() 唤醒在此对象监视器上等待的所有线程。&br&void wait() 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。&br&void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量。&br&void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。&/p&&h1&31.sleep和wait的区别(考察的方向是是否会释放锁)&/h1&&p&sleep()方法是Thread类中方法,而wait()方法是Object类中的方法。&br&sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。&/p&&h1&32.多线程与死锁&/h1&&p&死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。&br&产生死锁的原因:&br&一.因为系统资源不足。&br&二.进程运行推进的顺序不合适。&br&三.资源分配不当。&/p&&h1&33.如何才能产生死锁&/h1&&p&产生死锁的四个必要条件:&br&一.互斥条件:所谓互斥就是进程在某一时间内独占资源。&br&二.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。&br&三.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。&br&四.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。&/p&&h1&34.死锁的预防&/h1&&p&打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。&br&一.打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。&br&二.打破不可抢占条件。即允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。&br&三.打破占有且申请条件。可以实行资源预先分配策略。即进程在运行前一次性地向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。&br&四.打破循环等待条件,实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。&/p&&h1&35.什么叫守护线程,用什么方法实现守护线程&/h1&&p&守护线程是为其他线程的运行提供服务的线程。&br&setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为守护模式,false为用户模式。&/p&&h1&36.Java线程池技术及原理&/h1&&p&参考文章:&br&&a href=&https://link.zhihu.com/?target=http%3A//www.importnew.com/19011.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解Java之线程池 - ImportNew&/a&&br&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/dolphin0520/p/3932921.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程:线程池的使用 - 海 子 - 博客园&/a&&/p&&h1&37.java并发包concurrent及常用的类&/h1&&p&这个内容有点多,参考文章:&br&并发包诸类概览:&a href=&https://link.zhihu.com/?target=http%3A//www.raychase.net/1912& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&java.util.concurrent并发包诸类概览 | 四火的唠叨&/a&&br&线程池:&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/dolphin0520/p/3932921.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程:线程池的使用 - 海 子 - 博客园&/a&&br&锁:&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/dolphin0520/p/3923167.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程:Lock - 海 子 - 博客园&/a&&br&集合:&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/huangfox/archive//2642666.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&java中并发包简要分析01 - huangfox - 博客园&/a&&/p&&h1&38.volatile关键字&/h1&&p&用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。&br&Java语言中的volatile变量可以被看作是一种“程度较轻的&br&synchronized”;与&br&synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。锁提供了两种主要特性:互斥(mutual&br&exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的,如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。Volatile变量具有synchronized的可见性特性,但是不具备原子特性。这就是说线程能够自动发现volatile&br&变量的最新值。&br&要使volatile变量提供理想的线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中。&br&第一个条件的限制使volatile变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile不能提供必须的原子特性。实现正确的操作需要使x 的值在操作期间保持不变,而volatile&br&变量无法实现这点。&br&每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ecffbbbf06a12b2246c3ae_b.jpg& data-rawwidth=&577& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&577& data-original=&https://pic4.zhimg.com/v2-ecffbbbf06a12b2246c3ae_r.jpg&&&/figure&&br&&p&read and load 从主存复制变量到当前工作内存&br&use and assign 执行代码,改变共享变量值&br&store and write 用工作内存数据刷新主存相关内容&br&其中use and&br&assign 可以多次出现,但是这一些操作并不是原子性,也就是在read load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,所以计算出来的结果会和预期不一样。&/p&&h1&39.Java中的NIO,BIO,AIO分别是什么&/h1&&p&BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。&br&NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。&br&AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。&/p&&h1&&a href=&https://link.zhihu.com/?target=http%3A//40.IO& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&40.IO&/span&&span class=&invisible&&&/span&&/a&和NIO区别&/h1&&p&一.IO是面向流的,NIO是面向缓冲区的。&br&二.IO的各种流是阻塞的,NIO是非阻塞模式。&br&三.Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。&/p&&h1&41.序列化与反序列化&/h1&&p&把对象转换为字节序列的过程称为对象的序列化。&br&把字节序列恢复为对象的过程称为对象的反序列化。&br&对象的序列化主要有两种用途:&br&一.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;&br&二.在网络上传送对象的字节序列。&br&当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。&/p&&h1&42.常见的序列化协议有哪些&/h1&&p&Protobuf, Thrift, Hessian, Kryo&/p&&h1&43.内存溢出和内存泄漏的区别&/h1&&p&内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of&br&memory。&br&内存泄漏是指分配出去的内存不再使用,但是无法回收。&/p&&h1&44.Java内存模型及各个区域的OOM,如何重现OOM&/h1&&p&这部分内容很重要,详细阅读《深入理解Java虚拟机》,也可以详细阅读这篇文章&a href=&https://link.zhihu.com/?target=http%3A//hllvm.group.iteye.com/group/wiki/2857-JVM& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JVM内存管理:深入Java内存区域与OOM - 高级语言虚拟机 - ITeye知识库频道&/a&&/p&&h1&45.出现OOM如何解决&/h1&&p&一. 可通过命令定期抓取heap dump或者启动参数OOM时自动抓取heap dump文件。&br&二. 通过对比多个heap dump,以及heap dump的内容,分析代码找出内存占用最多的地方。&br&三. 分析占用的内存对象,是否是因为错误导致的内存未及时释放,或者数据过多导致的内存溢出。&/p&&h1&46.用什么工具可以查出内存泄漏&/h1&&p&一. Memory&br&Analyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse&br&RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。&br&二. JProbe-分析Java的内存泄漏。&br&三.JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中,GUI可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。&br&四. JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。&br&五. &a href=&https://link.zhihu.com/?target=http%3A//YourKit-.NET& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&YourKit-.NET&/span&&span class=&invisible&&&/span&&/a& & Java Profiling业界领先的Java和.NET程序性能分析工具。&br&六.AutomatedQA -AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft,Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。}

我要回帖

更多关于 sqlyog怎么写sql语句 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信