Java 小问题 我不理解输出结果为什么是0123 ,谁帮解释下。谢谢了。没积分给你打款2元

我是初学者(自学java)碰到如下问题
想请大家帮帮忙解决问题_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:703,068贴子:
我是初学者(自学java)碰到如下问题
想请大家帮帮忙解决问题收藏
就是我照书上的操作编程
d:\study\ch01新建一个文本文档
便将这文件重先命名为SinDemo.java&&&&&
编程如下&&
我就是想知道哪里编错了 //文件名: SinDemo.javapublic class SinDemo{&&&& public static void main(String args[])&&&& {&&&&&& //把1赋给变量i&&&&&& int i = 1;&&&&&& //把5赋给变量j&&&&&& int j= 5;&&&&&& //把0赋给变量k&&&&&& int k = 0;&&&&&& //输出 i 的值&&&&&& System.out.println("i 的值为:"+ i);&&&&&& //输出 j 的值&&&&&& System.out.println("j 的值为:"+ j);&&&&&& //输出 k 的值&&&&&& System.out.println("k 的值为:"+ k);&&&&&& }}
最后就是得不出i k j
java入门选江苏万和,先就业,后付款.JAVA业内高级专家团队授课,王牌专业师资打造精品课程,全程商业项目实战,高薪就业不是梦!
代码没问题。你那里运行结果如何,有什么提示?
运行么问题吗- -是运行不能还是结果不对?!
可以运行,结果正确。
本来是想打‘嘛’的= =我也运行了,么问题
运行就这样
看错,我还以为你是LZ。
那不就么问题了么?
找java?到博为峰,专注java开发培训14年,零基础入学,毕业包推荐就业.可试学7天!找java?来博为峰学java开发,成立14年,校区遍布全国,14所校区,120天到精通
运行结果如下
悲惨~~校园网看图不能,还得拿手机看图你的jdk环境变量配置问题
JDK我是照书上改的啊&&&
就是书上是XP系统的我是win7的
发现诡异现象,切换到class路径再用java 类名才行,直接java +路径不行- -
能不能详述
就是怎么操作
CLASSPATH你设置了吗?
编起来 就是不能运行啊
有把你的当前class文件所在目录加到CLASSPATH中吗?
加一下我吧QQ
没有QQ。你把你工作目录添加到CLASSPATH中去。
高考过后,学什么最好呢,同学们一定要想好,如果是学技术的话,可以去抚琴南路那边看看,不管怎么说,名流也是老校区,口碑还是不错的。
登录百度帐号关于java的一个小问题【已解决】 - 『编程语言讨论求助区』
- 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn
后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
查看: 232|回复: 21
关于java的一个小问题【已解决】
阅读权限10
发帖求助前要善用【】功能,那里可能会有你要找的答案;
求助软件脱壳或者破解思路时,请务必在主题帖中描述清楚你的分析思路与方法,否则会当作求脱求破处理;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人。
本帖最后由 wushaominkk 于
09:20 编辑
QQ截图12.jpg (99.09 KB, 下载次数: 2)
14:09 上传
教程里,输出结果三个都应该是数字,为毛最后一个输出了地址呢?
哈哈,一早上醒来,看见这么多大佬回复我,真的好开心,美滋滋。。。。
后来找到错了。
println输出里没有调用方法。。。。
哈哈哈哈哈啊。。。。。露出一个尴尬又不失礼貌的微笑。。。。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
数组本来就是个对象, 你直接输出数组了
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
你数组是一个对象,
你new了一个对象,
你输出的结果是一个引用地址.
String&&a = new String(&A&);
String b = new String(&B&);
System.out.println(a == b);// false 比较的是引用地址 而并不是地址里的对象内容;
说远了,简单的来说,他输出的是一个引用地址,
toString 是根类自带的方法,
可以重写,但是个人绝对数组没必要。
如果你要输出数组里面的对象,
你可以采取遍历,新循环迭代遍历都行。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
据我猜测&&new的返回的就是一个地址吧
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限35
toString吧好像是
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
System.out.println(Arrays.toString(new int[]{1,2,3}));
可以让他输出123&&或者用循环让他输出
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
你真是。。。。。。比我还懒!!
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
因为new 一个数组 你是在内存中新建了一个数组 输出,所以输出的是在内存新建数组的位置&&
用toString& &
列入:System.out.println(Arrays.toString(new int[]{1,2,3}));
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限25
因为你是new,所以它输出的是堆内存地址
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
java中数组是不能直接输出的
需要遍历数组中的内容
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz!
Comsenz Inc.&p&呐呐呐,做人呢,最重是要开心啦。&/p&&p&呐呐呐,做Java呢,最重要是要把自己的“作品” 部署到公网上去啦。 &/p&&p&特别是初学者,需要向面试官证明自己会什么,这个真的就很重要啦,空口无凭,为什么面试官就相信你的简历内容是真的呢? 最好的办法当然就是把作品放在公网上,show 他一脸啦&/p&&p&对于已经参加工作的同事,这个反倒是比较简单的,因为在工作中,部署一个项目无非就是通过ftp把.war(或者其他形式)传递上去,然后重启tomcat, 等一等就完成了。 可是,如果是学习者,比已经工作的人员面临的挑战更大,为什么呢? 因为手上没有一个已经搭建好的环境,没有一个“上传,重启” 就一切ok的环境,如果是不熟悉Linux一套的同学,面临的挑战,不亚于从未学过编程,要从Hello开始学习Java的难度呢&/p&&p&为了解决这个问题,做了一个系列教程,从零开始,从空环境开始,一直做到能够在公网上看到一个可以跑起来的效果。&/p&&p&期间不仅把每个步骤全部都记录下来了,而且需要用到的软件和工具,也提供了下载,减少学习的曲线(因为有些软件真的有点难找呢)。&/p&&p&&br&&/p&&ol&&li&首先选购阿里云服务器。阿里云服务器有很多种,因为是学习需要,所以帮大家找了最便宜的14.76一周的。。。 一周时间,怎么都够掌握这个了~&/li&&/ol&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9d73000f55cad5baf8997c4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&362& data-rawheight=&136& class=&content_image& width=&362&&&/figure&&p&2. 购买每步详细讲解&/p&&p&阿里云服务器的购买参数是很多的,对于新手而言知道该怎么选安全组吗?知道如何选最便宜的吗?(默认不是最便宜的),知道如何选镜像和操作系统吗,这些对于熟手完全不是问题的,却会让新手抠脑壳抠半天去了,所以这部分我都做了详细的记录和说明&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4dae578d3e0d002b716fa0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&298& data-rawheight=&323& class=&content_image& width=&298&&&/figure&&p&3. 购买之后,连接上服务器&/p&&p&服务器是Linux,和Windows不一样。 Windows远程连接过去就可以用了,Linux连接上去需要专门的工具。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-2f897ce7d81c490baf0939be_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&222& data-rawheight=&136& class=&content_image& width=&222&&&/figure&&p&成功连接之后看到的也不是图形化界面,而是命令行界面,需要对这些命令熟练运用。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-38f39acbbbef11273ccf8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&201& data-rawheight=&224& class=&content_image& width=&201&&&/figure&&p&最后还得专门练习练习使用vi工具,掌握如何编辑和保存配置文件。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-99cfa04a9f99f15faf2f16d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&235& data-rawheight=&158& class=&content_image& width=&235&&&/figure&&p&4. 紧接着是ftp服务器。 ftp服务器用来接受从pc端上传文件到linux服务器。 这个啊,也是颇大的一个坑啊,其中涉及到用户,权限,ftp服务器安装,端口开启,相关配置,ftp客户端,反正也是一大坨东西呢&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fd3c0ca5d026b683e6d38_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&197& data-rawheight=&368& class=&content_image& width=&197&&&/figure&&p&5. Java环境安装&/p&&p&这个最简单,一句话就好了呢&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9067aeb134c30caaff733_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&311& data-rawheight=&46& class=&content_image& width=&311&&&/figure&&p&6. Mysql&/p&&p&部署J2EE应用,不会只有jsp嘛,总归是要连接数据库的。 所以Mysql还是要自己安装和配置的呢&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1c9aea05c656fc04d97e2639fcd0dc51_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&203& data-rawheight=&127& class=&content_image& width=&203&&&/figure&&p&7. Tomcat&/p&&p&到这个地方,才轮到Tomcat上场呢&/p&&figure&&img src=&https://pic2.zhimg.com/v2-16fdc3aa5e39d92e392eec5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&183& data-rawheight=&161& class=&content_image& width=&183&&&/figure&&p&8. 部署J2EE 应用&/p&&p&到了这里最后一步,才部署J2EE应用呢,这里就要把前面的ftp利用起来做上传,也要进行mysql的配置和tomcat的配置啦&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8ffe154ffa85adb096554_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&182& data-rawheight=&177& class=&content_image& width=&182&&&/figure&&p&9. 教程地址:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//how2j.cn/k/deploy2linux/deploy2linux-breif/1591.html%3Ftid%3D107& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&how2j.cn/k/deploy2linux&/span&&span class=&invisible&&/deploy2linux-breif/1591.html?tid=107&/span&&span class=&ellipsis&&&/span&&/a& &/p&&p&教程根据个人经验制作,有不足之处,请多指教,谢谢&/p&
呐呐呐,做人呢,最重是要开心啦。呐呐呐,做Java呢,最重要是要把自己的“作品” 部署到公网上去啦。 特别是初学者,需要向面试官证明自己会什么,这个真的就很重要啦,空口无凭,为什么面试官就相信你的简历内容是真的呢? 最好的办法当然就是把作品放在…
&figure&&img src=&https://pic2.zhimg.com/v2-0bbdc9b295ad2df6e13e40113feb09cf_b.jpg& data-rawwidth=&800& data-rawheight=&423& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/v2-0bbdc9b295ad2df6e13e40113feb09cf_r.jpg&&&/figure&&p&上一课带大家聊了聊反爬与反反爬最基础的对抗-代理ip,别看这个简单,真正处理好了代理ip基本上解决大半的爬虫问题,包括本节的验证码。很多网站弹出验证码也是因为发现ip重复过多,比如搜狗微信搜索,如果在合理的时间切换ip,就可以完美的躲避掉搜狗微信中的验证码(注意只有搜狗微信中的验证码可以,微信中的是不可以的,其中区别可以通过浏览器中的域名来区分)。&/p&&p&上一篇文章写完之后,爬虫天坑的文章意外收获了不少赞,这里拜谢大家支持,同时如果天坑系列破百赞的话,我会继续更新那个系列。&/p&&p&要完了赞,扯完了废话,我们赶紧进入这一篇文章的正题-验证码识别。&/p&&p&先让我来摘抄一段验证码的介绍:&/p&&blockquote&验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。&/blockquote&&p&话说直到今天我才知道CAPTCHA原来是这么直白的英文缩写,外国人对单词的缩写狂热真是一点不比国人差啊。(突然想到刚进公司那会摸不着头脑的TGIF)&/p&&p&那好了,延续上篇文章的套路,我们先来看看反爬:&/p&&h2&&b&一.为什么验证码可以反爬?&/b&&/h2&&p&简单来说,是人类有着一种天赋,可以很轻松的从一段图片中识别出文字和数字,而机器却不能。但是由于这些年机器学习的飞速进展。这项技能上人类和机器之间的差距越来越小,导致为了区分人和机器,人类工程师已经快达到变态的地步,终于诞生了宇宙无敌12306验证码:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c03f9c0f51f8a85d66e9_b.jpg& data-rawwidth=&440& data-rawheight=&322& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&https://pic1.zhimg.com/v2-c03f9c0f51f8a85d66e9_r.jpg&&&/figure&&p&当然这些年同样随着机器学习技术的飞速进展,验证码也开始出现了新的形式,比如极验验证为代表的轨迹模式,这类的优缺点我们后面再聊。&/p&&p&&br&&/p&&h2&&b&二.如何使用验证码实现反爬?&/b&&/h2&&p&使用验证码相信是所有web工程师的基本功,百度谷歌上一搜一大堆,还有自动生成代码的。对于普通图文类的验证码,无非就是先生成随机串,再生成图片,将随机串存入session,等待用户提交后进行比对。或者也可以集成极验验证这类第三方验证服务,这里就不再赘述了。&/p&&p&使用验证码都会使用,那我们这里着重讲一讲到底该如何选择,这些常用验证码形式利弊各有哪些:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-aabbbed23a3be_b.jpg& data-rawwidth=&550& data-rawheight=&145& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic1.zhimg.com/v2-aabbbed23a3be_r.jpg&&&/figure&&p&&br&&/p&&p&&b&
1.数字字母验证码&/b&:这类验证码优点是生成简单,大部分语言都自带图形库,在加入一点扭曲和噪点,基本可以解决掉初级爬虫工程师和暴力破解的脚本小子。缺点当然也显而易见,对于cnn代码只用写10行的今天,这些验证码只要有足够的标注数据,破解起来简直是轻而易举。我们在微信验证码识别中大约使用了10万张标注好的图片进行训练就可以完成类似人的准确度,具体可以参考我们的应用-&a href=&https://link.zhihu.com/?target=http%3A//www.shenjianshou.cn/index.php%3Fr%3Dmarket/product%26product_id%3D500085& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&微信文章爬虫[按公众号或关键字]-神箭手云&/a&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-dc24451baf226fddfd492f64b3bd3ab0_b.jpg& data-rawwidth=&377& data-rawheight=&557& class=&content_image& width=&377&&&/figure&&p&&br&&/p&&p&&b&
2.中文验证码:&/b&比如知乎采用过的验证码选择倒立的中文以及网易邮箱类的验证码(标记文字位置)。这类验证码一般来很少有公用的代码,因此编写起来麻烦。不过也正因为每一家采用的都不一样,在加上中文庞大的汉字库,确实给机器识别带来的比较大的挑战,如果配合好字体和扭曲,确实可以有不错的效果。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-de79c5c546e4e700cdd5df015f3f6600_b.jpg& data-rawwidth=&420& data-rawheight=&250& class=&content_image& width=&420&&&/figure&&p&&br&&/p&&p&&b&
3.极验验证:&/b&这几年新型的验证码代表,很多网站争相采用。首先抛开技术角度,仅从成本角度来说,我是不太推荐大家用这类验证码的,越广泛的越不宜使用。对于一个网站特有的验证码体系,破解难度大,收益小。但这么多网站采用同一种验证码,即使破解难度再大,也必然有人会去尝试,因为收益太大。&/p&&p&
反过来说说极验采用的技术,极验的v2版验证体系破解难度甚至比不过数字字母验证码来的复杂,唯一的优势就是现在大部分打码平台不支持。图片识别上直接对比像素就可以识别位置,唯一难点的移动轨迹,但用轨迹做分类人类和机器间的特征并不那么明显,加上网页中采集轨迹的准确性较差,因此做一些简单的模拟就可以轻松躲过轨迹识别。网上有很多破解方案。&/p&&p&&br&&/p&&p&当然验证码还有很多类型,比如12306这类,整体来说,如果对反爬要求很高,最好是自己实现,如果没有12306这种庞大的图片库,比较推荐的就是采用中文验证码模式(不是直接识别中文,而是标记中文位置类型的)。不太推荐采用极验验证这种,毕竟太多人使用意味着就像把自己的船和别人的船都连在一起,虽然稳定,但是一把火烧过来,大家全部遭殃。更不推荐采用数字+字母模式,这种实在烂大街,打码平台一分钱一次,包括算术类,麻烦自己,也没有提高太多识别门槛。&/p&&p&&br&&/p&&h2&&b&三.如何识别验证码?&/b&&/h2&&p&识别验证码也一直是爬虫工程师的基本功,特别对于有登录需求的爬虫来说,验证码也是一道绕不过去的坎,那我们从反反爬的角度,来看看识别验证码的常用姿势。&/p&&p&&b&1.打码平台:&/b&最常用,最简单的识别,唯一的难度就在于选择集成(也是一些工程性的东西),一般字母文字1分一次,中文识别略贵,计算题可能5分吧。具体大家可以去搜一搜,这里不赘述了。不支持极验这类。&/p&&p&&b&2.OCR库:&/b&这个嘛,虽然换汤不换药,但是这个词听起来就显得灰尘味很重,另外,传统的ocr采用先切割再识别的方案,对于新型的验证码已经很难做了,不建议大家尝试这个方案。&/p&&p&&b&3.机器学习:&/b&端到端数字字母识别神器,具体方案我在&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&爬虫天坑系列-百度指数爬虫&/a& 这篇文章中已经有所介绍,根据识别难度和长度不同,对标注数据的需求量不一样,当然图片预处理也稍微有些区别,其他的,直接从网上找代码贴进来跑就好。(插个广告,神箭手平台支持直接运行tensorflow代码,并且自动生成serving接口)&/p&&p&&b&4.神箭手库:&/b&我们内置了solveCaptcha和solveGeetest两个函数,对于部分验证码还是免费的,大家自己体会一下。&/p&&p&&b&5.其他:&/b&之所以列一个其他,对于一些特殊验证码,比如12306不仅需要识别结果,还需要识别问题等等特殊的。单个问题单个对待,可能需要结合多重知识,这里就不展开讲了。&/p&&p&&br&&/p&&p&好了,最后说两句:验证码这篇一方面给大家提供了一个验证码类型的选择方案,同时也展示了识别验证码的难易和常见方法。事实上,很多时候,优秀的工程师并不是写代码写的最快的,而是遇到一个问题就知道哪个方案是最合适的。不断积累这种经验,让我们在工作中事半功倍。&/p&&p&下一篇给大家讲讲反爬与反反爬第三常规战斗-Cookies&/p&&p&&br&&/p&&p&更多回答关注:&a href=&https://www.zhihu.com/people/wu-tong-v2& class=&internal&&吴桐-神箭手CEO&/a&&/p&&p&更多文章关注:&a href=&https://zhuanlan.zhihu.com/data-factory& class=&internal&&数据黑板-知乎专栏&/a&&/p&&p&&/p&
上一课带大家聊了聊反爬与反反爬最基础的对抗-代理ip,别看这个简单,真正处理好了代理ip基本上解决大半的爬虫问题,包括本节的验证码。很多网站弹出验证码也是因为发现ip重复过多,比如搜狗微信搜索,如果在合理的时间切换ip,就可以完美的躲避掉搜狗微信…
谢邀。&br&&br&楼主的问题是如何高效识别出爬虫,其实最高效的方法就一个:爬虫自己标记自己是爬虫,比如百度和谷歌。&br&&br&楼主肯定不是想问这样的问题,楼主的问题肯定是这样,有些爬虫伪装成ua在自己的网站上定期爬数据,楼主不希望自己的网站内容被系统性搬运,可采取如下措施:&br&&br&1、限制单个ip/api token的访问量,比如15分钟限制访问页面180次,具体标准可参考一些大型网站的公开api,如twitter api,对于抓取用户公开信息的爬虫要格外敏感。&br&&br&2、蜜罐资源。爬虫解析离不开正则匹配,适当在页面添加一些正常浏览器浏览访问不到的资源,一旦有ip访问,过滤下头部是不是搜素引擎的蜘蛛,不是就可以直接封了。&br&&br&3、定期分析日志。系统分析的效果肯定要强过过滤单条日志,比如装一个awstat之类的专门分析web服务器日志的应用。
谢邀。 楼主的问题是如何高效识别出爬虫,其实最高效的方法就一个:爬虫自己标记自己是爬虫,比如百度和谷歌。 楼主肯定不是想问这样的问题,楼主的问题肯定是这样,有些爬虫伪装成ua在自己的网站上定期爬数据,楼主不希望自己的网站内容被系统性搬运,可采…
&p&按照 star 数排序 top 10:&/p&&ul&&li&(28.8k)&a href=&//link.zhihu.com/?target=https%3A//github.com/ReactiveX/RxJava& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ReactiveX/RxJava&/a&: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observ… &/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/elastic/elasticsearch& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&elastic/elasticsearch&/a&: Open Source, Distributed, RESTful Search Engine &/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/iluwatar/java-design-patterns& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iluwatar/java-design-patterns&/a&: Design patterns implemented in Java&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/square/retrofit& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&square/retrofit&/a&: Type-safe HTTP client for Android and Java by Square, Inc.&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/square/okhttp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&square/okhttp&/a&: An HTTP+HTTP/2 client for Android and Java applications.&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/google/guava& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&google/guava&/a&: Google Core Libraries for Java&/li&&li&(&a href=&//link.zhihu.com/?target=https%3A//github.com/PhilJay/MPAndroidChart/stargazers& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&19.2k&/a&)&a href=&//link.zhihu.com/?target=https%3A//github.com/PhilJay/MPAndroidChart& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PhilJay/MPAndroidChart&/a&: A powerful Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts …&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/JakeWharton/butterknife& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JakeWharton/butterknife&/a&: Bind Android views and callbacks to fields and methods.&/li&&li&&b&&a href=&//link.zhihu.com/?target=https%3A//github.com/JetBrains/kotlin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JetBrains/kotlin&/a&&/b&: The Kotlin Programming Language&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/bumptech/glide& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&bumptech/glide&/a&: An image loading and caching library for Android focused on smooth scrolling&/li&&/ul&&p&从中我们可以发现大部分项目都是 Android 相关的,光 HTTP 客户端就有两个....&/p&&p&对了,排序方式:&/p&&ol&&li&打开 GitHub 高级搜索:&a href=&//link.zhihu.com/?target=https%3A//github.com/search/advanced& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/search/advan&/span&&span class=&invisible&&ced&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&搜索框中输入 stars:&1 language:Java&/li&&/ol&&hr&&p&PS:&/p&&p&还有两个不容错过的项目:&/p&&ul&&li&Java 开源博客系统:(3.5K)&a href=&//link.zhihu.com/?target=https%3A//github.com/b3log/solo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&b3log/solo&/a& &/li&&li&Java 开源社区论坛:(2k)&a href=&//link.zhihu.com/?target=https%3A//github.com/b3log/symphony& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&b3log/symphony&/a&&/li&&/ul&
按照 star 数排序 top 10:(28.8k): RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observ… : Open Source, Distributed, RESTful Search En…
&figure&&img src=&https://pic1.zhimg.com/v2-e6fa5a79c35f5_b.jpg& data-rawwidth=&780& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&https://pic1.zhimg.com/v2-e6fa5a79c35f5_r.jpg&&&/figure&&p&很多人问我这个问题,尤其是那些刚开启软件工程生涯的同事和朋友。&/p&&blockquote&要成为一个更好的开发人员,我应该读哪些书?&/blockquote&&p&这是一个很值得探讨的问题,而且也是我在成为&a href=&https://link.zhihu.com/?target=http%3A//www.woniuxy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&软件工程师&/a&之时问了很多导师的一个问题。但问题是,很多人推荐的是不同主题的不同书籍。他们推荐的书在他们看来是伟大的,但没有人能告诉我,要想成为一个伟大的工程师,我应该阅读什么,哪些是重要的、是必读的书籍。&/p&&p&我从我的导师那儿学到了很多东西,并意识到,我仍然有很多东西需要学习,还有许多不同的书需要阅读。我决定每个月读一本专业领域(软件工程)的书。随着时间的积累,我总结出了我认为想要成为一个顶级开发人员必须阅读的书单。&/p&&p&事先声明——只是阅读这些书不会让你成为一个伟大的开发者。你还需要积累多年的工作经验,并应用这些书中的原则到现实实践中,并在现实世界中发展你解决问题的能力。&/p&&p&阅读这些书可以帮助你避免一些常见的陷阱和错误,一些开发人员早期经历的陷阱和犯过的错误。我多么希望在我刚进入软件领域的时候,就有人向我推荐这些书啊,并且我现在依然很庆幸自己发现并反复阅读了这些书!也许你已经在大学读计算机科学或工程课程的时候读到过其中的一些书。也许在那个时候,你觉得它们并不重要,但是我可以用我亲身经历来说明我使用和应用了许多来自于这些书的原则。&/p&&p&我还要指出的是,此书单并不详尽。每年都会有许多伟大的著作问世。这些只是对我和我的职业生涯影响最大的书籍。此外,这些书和使用什么语言无关,可以应用于任何软件语言。&/p&&p&好了,让我们开始介绍这些书吧。(请鼓掌)&/p&&p&(这些都是必不可少的,我将根据它们对我的影响大小从后往前介绍。)&/p&&h2&12.《Working Effectively with Legacy Code》&/h2&&p&我之所以喜欢这本书,是因为几乎所有的软件开发人员,在其职业生涯的某个时刻,往往会不得不支持和工作于遗留系统。在这本书中,Michael Feathers提供了从开始到结束的策略,以便于更有效地工作于未经测试的遗留代码库。本书借鉴了Michael为其著名的Object Mentor专题研讨会创作的材料:Michael用于指导的技术,以帮助开发人员,技术管理人员和测试人员掌控遗留系统。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-624df212a38199eed8af39a0175a96af_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&345& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&11.《The Mythical Man-Month》&/h2&&p&本书是一本经典之作,但最近被修改和更正了。令人惊奇的是这本书仍然与软件产品开发密切相关。如果你从事软件的话,这本书是必读的。这本书最有价值的部分,我相信,是“plan&br& to throw out”原型章节。尽管我们的目标通常是做一个更大,更好,更快,不管它是什么的东西,但是我们总会构建出一些不得不被废弃,需要重做的东西。这种情况我亲身经历过很多很多次。因此,关键是要plan to throw out(计划抛弃),这样你才能适应接下来的情况。如果你梦想第一个产品就ok,那么你就会有抛弃它们的风险,因为产品的改进和发展是不可避免的。计划抛弃也有助于通过设置合理的里程碑来达到进度目标。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6ffff2f3cd873aaacf60df_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&388& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&10.《Design Patterns》&/h2&&p&如果你打算成为一名架构师或系统的设计人员,那么你很有可能会被要求阅读这本书。这是一本被誉为有史以来最伟大的有关于软件开发的书,详细讲述了许多不同的&a href=&https://link.zhihu.com/?target=http%3A//www.woniuxy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&设计模式&/a&,这么多年来一直在帮助软件工程师避免和处理行业面临的常见问题。遵照这本书的策略可以助你打造更高品质,灵活和可维护的软件。传说中的“四人帮”就是这本书,因为它是由四个著名的作者共同编写的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d4c1fdc9722ee07efbbc2e4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&323& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&9.《Programming Pearls 第二版》&/h2&&p&这本书和这书单上的其他书籍略有不同。我想说这本书可以帮助一个人“像一个&a href=&https://link.zhihu.com/?target=http%3A//www.codeceo.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序员&/a&一样思考”。《Programming Pearls》是先前发表在“Communications of the ACM(美国计算机学会通讯)”的15篇专栏的一个纲要。这些专栏涵盖了广泛与编程相关的主题:从需求收集到性能优化。重点关注编码技术和算法。&/p&&p&每个专栏被组织为一个章节。章节通常以一个实际问题的情景呈现开头。然后,提出各种解决方案和相应的经验教训。写作风格清晰明快。&/p&&p&《Programming Pearls》不是教授新编程概念的寻常书籍。虽然它包含了优秀,有时甚至是相当新奇的想法,但这本书的目的不是教你一些新的东西,而是帮助你成为一个更好的问题解决者。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ef8fefec8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&329& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&8.《CODE: The Hidden Language of Computer Hardware and Software》&/h2&&p&这本书清理了创建和开发复杂系统的大量“魔法”。现在的抽象是如此之多,以致于一些低层次的细节反而不为开发人员所知。虽然你可能不会发现自己在实践中时刻使用着这本书——但我相信,知道自己正在构建什么以及整个编排的工作原理是什么,总归是一个好主意。当你需要打开“黑匣子”,深入软件或硬件来解决一个讨厌的bug的时候,它就能派上用场了。Charles Petzold写的《CODE: The Hidden Language of Computer Hardware and Software》梳理了许多编程概念——从数字系统的十进制,八进制,二进制到高级语言。这本书介绍了基于包的通信协议和TCP。许多章节讲解了有关硬件的概念,有五个章节涉及到了软件和教导操作系统,浮点运算和图形用户界面。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f236c468_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&318& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&7.《The Art of Computer Programming》&/h2&&p&这又是一部经典之作。由著名的计算机科学家教授Donald Knuth编著,并得到行业内众多顶尖程序员的一致好评。甚至连Bill Gates也对这本书赞誉有加:&/p&&p&“如果你认为你是一个真正优秀的程序员……那么就去读[Knuth的]《The Art of Computer Programming》吧……如果你能读懂整本书,那么请一定要给我发简历。”&/p&&p&这本书以基本的编程概念和技术开头,然后聚焦于更具体的信息结构——计算机内的信息表示,数据元素之间的结构关系,以及如何有效地处理这些问题。此外还提供了基本的应用程序给仿真模拟,数值方法,符号计算,软件和系统设计。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bbbb8c22a5f7deff5c4d9f29_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&372& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&6.《Refactoring》&/h2&&p&Martin Fowler写的《Refactoring》主要关于改进现有代码的设计。这是一个改变软件系统而不改变代码的外部行为,却能提高它内部结构的过程。通过重构,你甚至可以将一个糟糕的设计重新制作为一个很好的设计。这本书对重构原则进行了深入探讨,包括在哪里发现重构的机会,以及如何建立所需的测试。另外还有一个目录有40多个已经用细节证明的重构,这些细节包括何时以及为什么要使用重构,逐步说明如何实现重构,并举例说明重构是如何工作的。这本书用Java作为其主要语言而写,但其中的思路适用于任何OO语言。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-fbf8dab264fdd3e5af971_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&371& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&5.《Clean Code》&/h2&&p&《Clean Code》,作者Robert C. Martin,分为三个部分。第一部分介绍原则、模式和编写干净代码的实践方法。第二部分包括若干个复杂度渐进的研究案例。每个案例研究就是一个清洁代码的练习,也是通过解决代码库中的一些问题让代码变得健全、高效的练习。第三部分是决定性的一个部分:每个单独的章节在创建案例研究的时候包含了一系列启发式的教学法。最后得到了描述我们在编写、阅读和清理代码时的思考方式的知识库。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0cfec1fc6cdd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&327& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&4.《Introduction to Algorithms》&/h2&&p&这必须是理解和使用算法(将在软件开发中涉及很多)的最佳书籍。有些关于算法的书虽然严谨,但不全面——还有一些虽然涉及面广,但却缺乏严谨性。《Introduction to Algorithms》独特地结合了严谨性和全面性。这本书涵盖了广泛又深入的算法,使得书中的设计和分析能够面向所有层次的阅读人员。每个章节相对独立,可看作是一个学习单元。算法用英语和可读的伪代码描述。它使用初级基本的解释,并不牺牲覆盖的深度和材料的严谨性。第一版不仅广泛成为了世界各地高校的教材,还成为了专业人士的标准参考书。第二版新增了算法,概率分析,随机算法,线性规划的章节。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6fa130ec81c02a8b3ccca936d653203c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&307& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&3.《Structure and Interpretation of Computer Programs》&/h2&&p&以一种对解决问题和编程技术分析和严谨的态度,这本书面向于工程。《Structure and Interpretation of Computer Programs》强调通过不同方式来发挥核心作用,以处理计算模型中的时间。其独特的方式使得它非常适合于计算机科学课程,以及编程语言和程序设计的入门。这本书进一步解释了4个最著名的编程语言范式——命令式编程,面向对象编程,基于逻辑编程和应用性编程。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-516c655a102f131f49bb5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&381& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&2.《Pragmatic Programmer》&/h2&&p&这是我最先阅读的编程书籍之一。是我的一个朋友在我就职第一份专业工作的时候推荐给我的。我很庆幸他这么做了。尽管这本书写于1999年,但是它的概念是我们以一种务实的态度去开发复杂系统的基础。程序员也是工匠,他们被训练使用一组特定的工具(编辑器,对象管理,版本跟踪器)生成某种可在一定环境中(硬件组件上的操作系统)工作的产品(程序)。和任何其他工艺一样,计算机编程也孕育出了智慧,但其中的大多数智慧是不能从大学或认证课程中学到的。大多数程序员只能通过独立的试验,时间一点点的积累,才能掌握这些所谓的技巧。在《Pragmatic Programmer》一书中,Andrew Hunt和David Thomas编纂了很多他们在分别作为软件设计者和代码编写者的职业生涯中发现的真理。&/p&&p&作者的一些实用性建议非常具体,而且显然很易于实施。他们建议读者去学习,例如一个&a href=&https://link.zhihu.com/?target=http%3A//www.woniuxy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文本编辑器&/a&,然后在各种情况下使用它。他们还建议使用版本跟踪软件——即使是对最小型的项目,学习正则表达式语法和文本操作语言。书中还有其他许多也非常有价值的建议。在调试部分,作者指出:“如果你看到蹄印的话,应该考虑马这个范围,而不是斑马。”也就是说,要怀疑一切,然后从最显眼的地方寻找问题。还有关于预估时间和费用,以及将集成测试纳入到开发进程的建议。《Pragmatic Programmer》让人爱不释手的还有两个原因:它会更清晰地梳理你自己积累的智慧,它还会给你介绍你还没考虑到的工作方法。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-da628e325aaff624da97a3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&318& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&h2&1.《Code Complete 2》&/h2&&p&就是它了!这就是我认为首屈一指值得阅读的书(请恕我妄言),如果你要成为一个优秀的软件工程师的话。它被广泛认为是最好的实用性编程指南之一,Steve McConnell最初的《Code Complete》在过去的10多年时间里,一直在帮助开发人员编写更好的软件。现在,这部经典书籍已全面更新,修改成了前沿的实践方法——以及数以百计的新的代码示例——修订了软件结构的艺术和科学。从研究、学术界和日常商业实践中捕获知识体系,McConnell将最有效的技术和必须知道的原则总结成清晰又务实的指导。无论你的经验水平,开发环境,还有项目规模如何,这本书都可以启迪和激发你的思考,帮助你打造最优质的代码。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-9aad0cb083c9be70db7d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&260& data-rawheight=&326& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&p&&b&不断地探索技巧和策略,可以帮助你:&/b&&/p&&ul&&li&最小复杂性和最大创意的设计&/li&&li&获得协同开发带来的好处&/li&&li&应用防御性编程技术,以减少和驱赶错误&/li&&li&利用机会安全地重构或改进代码&/li&&li&使用针对你项目的结构方法&/li&&li&快速有效地调试问题&/li&&li&早早地正确解决关键的结构问题&/li&&li&从头到尾项目打造高质量的项目&/li&&/ul&&p&这12本书到此就介绍完毕了。如果你读过这些书,或有任何其他软件开发人员必读的书籍,欢迎在评论中留言!&/p&&p&&br&&/p&&p&&b&注:&/b&译文链接 &a href=&https://link.zhihu.com/?target=http%3A//www.codeceo.com/article/12-influential-books-programmer.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&codeceo.com/article/12-&/span&&span class=&invisible&&influential-books-programmer.html&/span&&span class=&ellipsis&&&/span&&/a&,英文原文 &a href=&https://link.zhihu.com/?target=http%3A//jasonroell.com//12-most-infuential-books-every-software-engineer-needs-to-read/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&12 Most Influential Books Every Software Engineer Needs to Read&/a&,译者 &a href=&https://link.zhihu.com/?target=http%3A//www.codeceo.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&码农网&/a& – 小峰。做一只IT干货的搬运工,喜欢就给个赞呗。希望继续在IT行业突破提升自己的各位朋友,也欢迎加群,不管你自我感觉牛不牛B。 &/p&
很多人问我这个问题,尤其是那些刚开启软件工程生涯的同事和朋友。要成为一个更好的开发人员,我应该读哪些书?这是一个很值得探讨的问题,而且也是我在成为之时问了很多导师的一个问题。但问题是,很多人推荐的是不同主题的不同书籍。他们推荐的…
&figure&&img src=&https://pic4.zhimg.com/v2-0123aefacc561efa6148864_b.jpg& data-rawwidth=&780& data-rawheight=&259& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&https://pic4.zhimg.com/v2-0123aefacc561efa6148864_r.jpg&&&/figure&&h2&&b&Spring 概述&/b&&/h2&&p&&b&1. 什么是spring?&/b&&/p&&p&Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。&/p&&p&&b&2. 使用Spring框架的好处是什么?&/b&&/p&&ul&&li&&b&轻量:&/b&Spring 是轻量的,基本的版本大约2MB。&/li&&li&&b&控制反转:&/b&Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。&/li&&li&&b&面向切面的编程(AOP):&/b&Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。&/li&&li&&b&容器:&/b&Spring 包含并管理应用中对象的生命周期和配置。&/li&&li&&b&&a href=&http://link.zhihu.com/?target=http%3A//www.woniuxy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MVC框架&/a&&/b&:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。&/li&&li&&b&事务管理:&/b&Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。&/li&&li&&b&异常处理:&/b&Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。&/li&&/ul&&p&&b&3. Spring由哪些模块组成?&/b&&/p&&p&以下是Spring 框架的基本模块:&/p&&ul&&li&Core module&/li&&li&Bean module&/li&&li&Context module&/li&&li&Expression Language module&/li&&li&JDBC module&/li&&li&ORM module&/li&&li&OXM module&/li&&li&Java Messaging Service(JMS) module&/li&&li&Transaction module&/li&&li&Web module&/li&&li&Web-Servlet module&/li&&li&Web-Struts module&/li&&li&Web-Portlet module&/li&&/ul&&p&&b&4. 核心容器(应用上下文) 模块。&/b&&/p&&p&这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。&/p&&p&&b&5. BeanFactory – BeanFactory 实现举例。&/b&&/p&&p&Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。&/p&&p&最常用的BeanFactory 实现是XmlBeanFactory 类。&/p&&p&&b&6. XMLBeanFactory &/b&&/p&&p&最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。&/p&&p&&b&7. 解释AOP模块&/b&&/p&&p&AOP模块用于发给我们的Spring应用做面向切面的开发, 很多支持由AOP联盟提供,这样就确保了Spring和其他AOP框架的共通性。这个模块将元数据编程引入Spring。&/p&&p&&b&8. 解释JDBC抽象和DAO模块。&/b&&/p&&p&通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP 模块给Spring应用中的对象提供事务管理服务。&/p&&p&&b&9. 解释对象/关系映射集成模块。&/b&&/p&&p&Spring 通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事务管理同样支持以上所有ORM框架及JDBC。&/p&&p&&b&10. 解释WEB 模块。&/b&&/p&&p&Spring的WEB模块是构建在application context 模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对Jakarta Struts的支持。&/p&&p&&b&12. Spring配置文件&/b&&/p&&p&Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。&/p&&p&&b&13. 什么是Spring IOC 容器?&/b&&/p&&p&Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。&/p&&p&&b&14. IOC的优点是什么?&/b&&/p&&p&IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。&/p&&p&&b&15. ApplicationContext通常的实现是什么?&/b&&/p&&ul&&li&&b&FileSystemXmlApplicationContext :&/b&此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。&/li&&li&&b&ClassPathXmlApplicationContext:&/b&此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。&/li&&li&&b&WebXmlApplicationContext:&/b&此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。&/li&&/ul&&p&&b&16. Bean 工厂和 Application contexts 有什么区别?&/b&&/p&&p&Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。&/p&&p&&b&17. 一个Spring的应用看起来象什么?&/b&&/p&&ul&&li&一个定义了一些功能的接口。&/li&&li&这实现包括属性,它的Setter , getter 方法和函数等。&/li&&li&Spring AOP。&/li&&li&Spring 的XML 配置文件。&/li&&li&使用以上功能的客户端程序。&/li&&/ul&&h2&&b&依赖注入&/b&&/h2&&p&&b&18. 什么是Spring的依赖注入?&/b&&/p&&p&依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。&/p&&p&&b&19. 有哪些不同类型的IOC(依赖注入)方式?&/b&&/p&&ul&&li&&b&构造器依赖注入:&/b&构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。&/li&&li&&b&Setter方法注入:&/b&Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。&/li&&/ul&&p&&b&20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?&/b&&/p&&p&你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。&/p&&h2&&b&Spring Beans&/b&&/h2&&p&&b&21.什么是Spring beans?&/b&&/p&&p&Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中&bean/& 的形式定义。&/p&&p&Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。&/p&&p&&b&22. 一个 Spring Bean 定义 包含什么?&/b&&/p&&p&一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。&/p&&p&&b&23. 如何给Spring 容器提供配置元数据?&/b&&/p&&p&这里有三种重要的方法给Spring 容器提供配置元数据。&/p&&p&XML配置文件。&/p&&p&基于注解的配置。&/p&&p&基于java的配置。&/p&&p&&b&24. 你怎样定义类的作用域? &/b&&/p&&p&当定义一个&bean& 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean &br&定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。&/p&&p&&b&25. 解释Spring支持的几种bean的作用域。&/b&&/p&&p&Spring框架支持以下五种bean的作用域:&/p&&ul&&li&&b&singleton : &/b&bean在每个Spring ioc 容器中只有一个实例。&/li&&li&&b&prototype&/b&:一个bean的定义可以有多个实例。&/li&&li&&b&request&/b&:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。&/li&&li&&b&session&/b&:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。&/li&&li&&b&global-session&/b&:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。&/li&&/ul&&p&缺省的Spring bean 的作用域是Singleton.&/p&&p&&b&26. Spring框架中的单例bean是线程安全的吗?&/b&&/p&&p&不,Spring框架中的单例bean不是线程安全的。&/p&&p&&b&27. 解释Spring框架中bean的生命周期。&/b&&/p&&ul&&li&Spring容器 从XML 文件中读取bean的定义,并实例化bean。&/li&&li&Spring根据bean的定义填充所有的属性。&/li&&li&如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。&/li&&li&如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。&/li&&li&如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。&/li&&li&如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。&/li&&li&如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。&/li&&li&如果bean实现了 DisposableBean,它将调用destroy()方法。&/li&&/ul&&p&&b&28. 哪些是重要的bean生命周期方法? 你能重载它们吗?&/b&&/p&&p&有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。&/p&&p&The bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。&/p&&p&&b&29. 什么是Spring的内部bean?&/b&&/p&&p&当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的&br& 配置元数据中,可以在 &property/&或 &constructor-arg/& &br&元素内使用&bean/& 元素,内部bean通常是匿名的,它们的Scope一般是prototype。&/p&&p&&b&30. 在 Spring中如何注入一个java集合?&/b&&/p&&p&Spring提供以下几种集合的配置元素:&/p&&ul&&li&&list&类型用于注入一列值,允许有相同的值。&/li&&li&&set& 类型用于注入一组值,不允许有相同的值。&/li&&li&&map& 类型用于注入一组键值对,键和值都可以为任意类型。&/li&&li&&props&类型用于注入一组键值对,键和值都只能为String类型。&/li&&/ul&&p&&b&31. 什么是bean装配? &/b&&/p&&p&装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。&/p&&p&&b&32. 什么是bean的自动装配?&/b&&/p&&p&Spring 容器能够自动装配相互合作的bean,这意味着容器不需要&constructor-arg&和&property&配置,能通过Bean工厂自动处理bean之间的协作。&/p&&p&&b&33. 解释不同方式的自动装配 。&/b&&/p&&p&有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。&/p&&ul&&li&&b&no&/b&:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。&/li&&li&&b&byName:&/b&通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。&/li&&li&&b&byType::&/b&通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。&/li&&li&&b&constructor:这个方式类似于&/b&byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。&/li&&li&&b&autodetect:&/b&首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。&/li&&/ul&&p&&b&34.自动装配有哪些局限性 ?&/b&&/p&&p&自动装配的局限性是:&/p&&ul&&li&&b&重写&/b&: 你仍需用 &constructor-arg&和 &property& 配置来定义依赖,意味着总要重写自动装配。&/li&&li&&b&基本数据类型&/b&:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。&/li&&li&&b&模糊特性:&/b&自动装配不如显式装配精确,如果有可能,建议使用显式装配。&/li&&/ul&&p&&b&35. 你可以在Spring中注入一个null 和一个空字符串吗?&/b&&/p&&p&可以。&/p&&h2&&b&Spring注解&/b&&/h2&&p&&b&36. 什么是基于Java的Spring注解配置? 给一些注解的例子.&/b&&/p&&p&基于Java的配置,允许你在少量的&a href=&http://link.zhihu.com/?target=http%3A//www.woniuxy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java注解&/a&的帮助下,进行你的大部分Spring配置而非通过XML文件。&/p&&p&以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。&/p&&p&&b&37. 什么是基于注解的容器配置?&/b&&/p&&p&相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。&/p&&p&开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。&/p&&p&&b&38. 怎样开启注解装配?&/b&&/p&&p&注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 &context:annotation-config/&元素。&/p&&p&&b&39. @Required 注解&/b&&/p&&p&这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。&/p&&p&&b&40. @Autowired 注解&/b&&/p&&p&@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。&/p&&p&&b&41. @Qualifier 注解&/b&&/p&&p&当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。&/p&&h2&&b&Spring数据访问&/b&&/h2&&p&&b&42.在Spring框架中如何更有效地使用JDBC? &/b&&/p&&p&使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate (例子见这里&a href=&http://link.zhihu.com/?target=http%3A//examples.javacodegeeks.com/enterprise-java/spring/jdbc/spring-jdbctemplate-example/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&here&/a&)&/p&&p&&b&43. JdbcTemplate&/b&&/p&&p&JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。&/p&&p&&b&44. Spring对DAO的支持&/b&&/p&&p&Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。&/p&&p&&b&45. 使用Spring通过什么方式访问Hibernate? &/b&&/p&&p&在Spring中有两种方式访问Hibernate:&/p&&ul&&li&控制反转 Hibernate Template和 Callback。&/li&&li&继承 HibernateDAOSupport提供一个AOP 拦截器。&/li&&/ul&&p&&b&46. Spring支持的ORM&/b&&/p&&p&Spring支持以下ORM:&/p&&ul&&li&Hibernate&/li&&li&iBatis&/li&&li&JPA (Java Persistence API)&/li&&li&TopLink&/li&&li&JDO (Java Data Objects)&/li&&li&OJB&/li&&/ul&&p&&b&47.如何通过HibernateDaoSupport将Spring和Hibernate结合起来?&/b&&/p&&p&用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:&/p&&ul&&li&配置the Hibernate SessionFactory。&/li&&li&继承HibernateDaoSupport实现一个DAO。&/li&&li&在AOP支持的事务中装配。&/li&&/ul&&p&&b&48. Spring支持的事务管理类型&/b&&/p&&p&Spring支持两种类型的事务管理:&/p&&ul&&li&&b&编程式事务管理&/b&:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。&/li&&li&&b&声明式事务管理:&/b&这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。&/li&&/ul&&p&&b&49. Spring框架的事务管理有哪些优点?&/b&&/p&&ul&&li&它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。&/li&&li&它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如&/li&&li&它支持声明式事务管理。&/li&&li&它和Spring各种数据访问抽象层很好得集成。&/li&&/ul&&p&&b&50. 你更倾向用那种事务管理类型?&/b&&/p&&p&大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。&/p&&h2&&b&Spring面向切面编程(AOP)&/b&&/h2&&p&&b&51. 解释AOP&/b&&/p&&p&面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。&/p&&p&&b&52. Aspect 切面&/b&&/p&&p&AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。&/p&&p&&b&52. 在Spring AOP 中,关注点和横切关注的区别是什么?&/b&&/p&&p&关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。&/p&&p&横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。&/p&&p&&b&54. 连接点&/b&&/p&&p&连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。&/p&&p&&b&55. 通知&/b&&/p&&p&通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。&/p&&p&Spring切面可以应用五种类型的通知:&/p&&ul&&li&&b&before&/b&:前置通知,在一个方法执行前被调用。&/li&&li&&b&after: &/b&在方法执行之后调用的通知,无论方法执行是否成功。&/li&&li&&b&after-returning: &/b&仅当方法成功完成后执行的通知。&/li&&li&&b&after-throwing: &/b&在方法抛出异常退出时执行的通知。&/li&&li&&b&around: &/b&在方法执行之前和之后调用的通知。&/li&&/ul&&p&&b&56. 切点&/b&&/p&&p&切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。&/p&&p&&b&57. 什么是引入? &/b&&/p&&p&引入允许我们在已存在的类中增加新的方法和属性。&/p&&p&&b&58. 什么是目标对象? &/b&&/p&&p&被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。&/p&&p&&b&59. 什么是代理?&/b&&/p&&p&代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。&/p&&p&&b&60. 有几种不同类型的自动代理?&/b&&/p&&p&BeanNameAutoProxyCreator&/p&&p&DefaultAdvisorAutoProxyCreator&/p&&p&Metadata autoproxying&/p&&p&&b&61. 什么是织入。什么是织入应用的不同点?&/b&&/p&&p&织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。&/p&&p&织入可以在编译时,加载时,或运行时完成。&/p&&p&&b&62. 解释基于XML Schema方式的切面实现。&/b&&/p&&p&在这种情况下,切面由常规类以及基于XML的配置实现。&/p&&p&&b&63. 解释基于注解的切面实现&/b&&/p&&p&在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。&/p&&h2&&b&Spring 的MVC&/b&&/h2&&p&&b&64. 什么是Spring的MVC框架?&/b&&/p&&p&Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。&/p&&p&&b&65. DispatcherServlet&/b&&/p&&p&Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。&/p&&p&&b&66. WebApplicationContext&/b&&/p&&p&WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。&/p&&p&&b&67. 什么是Spring MVC框架的控制器?&/b&&/p&&p&控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。&/p&&p&&b&68. @Controller 注解&/b&&/p&&p&该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。&/p&&p&&b&69. @RequestMapping 注解&/b&&/p&&p&该注解是用来映射一个URL到一个类或一个特定的方处理法上。&/p&&p&&b&注:&/b&本文译者 &a href=&http://link.zhihu.com/?target=http%3A//ifeve.com/spring-interview-questions-and-answers/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深海&/a&,原文链接 &a href=&http://link.zhihu.com/?target=https%3A//www.javacodegeeks.com/2014/05/spring-interview-questions-and-answers.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&69 Spring Interview Questions and Answers – The ULTIMATE List (PDF Download)&/a&。做一只IT干货的搬运工,喜欢就给个赞呗。希望继续在IT行业突破提升自己的各位朋友,也欢迎加群,不管你自我感觉牛不牛B。 &/p&
Spring 概述1. 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2. 使用Spring…
&p&在我看来,一个软件的良心与否往往可以用一条标准来衡量。&/p&&blockquote&Do one thing and do it well.&/blockquote&&p&道格拉斯·麦克罗伊是 Unix 系统上管道机制的发明者,而这正式他所提出的 Unix 哲学之一:程序应该只关注一个目标,并尽可能把它做好。简单的来说,一个金融软件不要做社交,一个社交软件不要做安全。(并不是说这个公司/开发者不能接触其他领域,而是说单一软件只应该实现一类功能。)&/p&&p&按照平台分一下吧:&/p&&p&&b&全平台:&/b&&/p&&ul&&li&&b&VLC media player&/b&:著名的自由且开源软件,已经又很多人说过了。完全没有广告(反正连源代码都是开放的,不服可以自己 build from source)。Out-of-box 的解决方案,该有的功能全部都有,也支持简单的剪辑之类的功能(虽然我比较倾向于直接用 FFmpeg 解决)。&/li&&li&&b&GitHub Atom&/b&:由 GitHub 开发的开源编辑器。基于 Electron(Node.js)的特性大大降低了插件的开发门槛,活跃的社区提供了数不清的插件和主题(虽然质量参差不齐)。缺点是因为 JavaScript 的原故,与 SublimeText 之类的编辑器比起来太重太慢,然而这并不能阻止 Atom 成为宇宙最强编辑器(?)。另外虽然用得不多,但是隔壁微软的 Visual Studio Code 貌似也不错,至少冷启动比 Atom 快多了(虽然说用的都是一样的技术)……&/li&&li&&b&Google Chrome&/b&:又一个老生常谈的软件。由 Google 开发,并有开源版本 Chromium (不少国产浏览器都基于这个)。速度非常快,而其 V8 JavaScript 引擎也成为了业界标杆。缺点是诸如 Chrome Webstore、Google Account 和同步之类的功能,因为众所周知的原因,要在国内使用比较困难。而且作为快速相应的代价,Chrome 特别吃内存。对 CPU 的高占用也往往会牺牲我半小时左右的电池时间。&/li&&li&&b&Mozilla Thunderbird&/b&:由 Mozilla 开发(对,就是做 Firefox 的那个)的开源邮件客户端。支持各种协议各种功能,速度还快。和 Windows10 自带的邮件客户端根本没可比性。(Outlook 没用过,不评价。)&/li&&li&&b&Rime 输入法&/b&:开源中文输入法引擎,官方的几个前端发行版有:Linux 发行版中州韵(ibus-rime)、Windows发行版小狼毫(Weasel)、OSX 发行版鼠须管(Squirrel)。另有第三方的 Android 和 iOS 发行版。功能非常强大,虽然个人认为略逊搜狗输入法一筹,但是洁癖的我实在不喜欢到处弹窗和夹杂一堆我不需要的功能。&/li&&li&&b&Audacity&/b&:开源且自由的录音及音频编辑软件,低配版 Adobe Audition。对于非专业人士来说基本可以满足所有需求了。本地化做得也可圈可点。&/li&&li&&b&JetBrains 全家桶&/b&:我个人始终有个执念——能用文本编辑器就绝不用 IDE,再加上有了像 Atom 这样的支持丰富插件的编辑器,自动补全和 linter 一类的功能也有了很好的支持。诚然,不依靠 IDE 手动完成软件开发的整个流程对于有着学习目的的初学者(指自己)来说非常重要(恩,我们教授就不推荐使用 IDE,第一节推荐的就是… 恩… gedit…),但很多时候大部分时间都浪费在了配置环境和 debug 上(特别是当时还不会用 gdb)。扯远了,这里只是想说一个好的 IDE 对开发效率而言真的很重要。为啥良心?这玩意儿虽然不开源,但学生&b&免费&/b&啊!再说一遍,&b&验证教育邮箱之后,JetBrains 全线产品免费使用!&/b&&/li&&li&&b&Shadowsoc…… &/b&咳咳没什么……&/li&&/ul&&p&&b&Windows:&/b&&/p&&ul&&li&&b&Adobe 全家桶&/b&:Photoshop、After Effects、Audition 等一系列工业级的数字媒体处理软件,同时支持 OSX。集百家之大成(Adobe 不少软件都是买的别人的,然后冠上 Adobe 的名继续开发),满足专业人士和业余爱好者的全部需求。唯一的缺点也就一个字:贵!在这一点上高等院校可能会提供大客户版或折扣。&/li&&li&&b&EmEditor&/b&:Windows 记事本的最佳替代品。功能强大的同时却保持了小巧的体积和最小化的资源占用,语法高亮、插件机制、正则表达式、宏、多种 Encoding 、十六进制显示和大文件秒开都是它的优点。30 天试用结束后保留基础功能。适合在 Atom 加载了半分钟后还没打开的情况下使用。&/li&&li&&b&cmder&/b&: Windows CMD 的最佳替代品。开源软件,基于 ConEmu。字体,颜色,窗口效果高度可定制(CMD 字体都没办法调能忍?)。支持 attach 到各种 shell (不管是 cmd,还是 powershell,或是 Bash on Windows,甚至是 docker)。&/li&&/ul&&p&&b&Linux:&/b&&/p&&ul&&li&&b&你所使用的 Linux 发行版&/b&:对,不管你正在使用什么 Linux 发行版,不管是 Debian、Arch Linux、openSUSE 还是 CentOS,你用的永远是最好的 Linux 发行版,嗯!什么?你说你用 Linux From Scratch……那么你是最棒的!&/li&&li&&b&zsh&/b&: fish 用户请直接跳过这一条,这是给 bash 用户看的。作为 bash 的超集,zsh 兼容所有 bash 的操作。不仅可以开箱即用,也有丰富的配置选项可供调教,更有 oh-my-zsh 之类的套餐可供选择。&/li&&li&&b&i3&/b&:如果你正在使用 xmonad、awesome 或者是 dwm 等之类的平铺式窗口管理器的话,请直接跳过这一条,这是给 Gnome、Unity 和 KDE 等用户看的。作为平铺式窗口管理器,i3 牺牲了花哨的界面和更平缓了学习曲线而最大化了操作效率和个性化设置。各种热键组合烂熟于心后,从此双手不离键盘。i3 高度可定制,初始的设置也仅能让你得到一个能勉强进行配置的环境。如果不想操心太多的话可以尝试类似于 Manjaro Linux i3 Edition 之类的整合版。&/li&&li&&b&cheat&/b&:讲道理,并不是每个人都能记得 tar 怎么用。下次直接 cheat tar 一下就知道怎么用了,啊,其他命令也可以的。GitHub地址:&a href=&//link.zhihu.com/?target=https%3A//github.com/chrisallenlane/cheat& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&chrisallenlane/cheat&/a&&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/a96e3ac3bccb_b.png& data-rawwidth=&713& data-rawheight=&229& class=&origin_image zh-lightbox-thumb& width=&713& data-original=&https://pic4.zhimg.com/a96e3ac3bccb_r.png&&&/figure&&p&&br&&/p&&p&&b&Android:&/b&&/p&&ul&&li&&b&Google 全家桶&/b&:对,我就是自己装的全家桶你管我咧?(利益相关:Google 脑残粉,Nexus 用户)其实 Google 全家桶中有不少好东西:Google Drive——绝对比百度云好用、Gmail——Gmail及第三方邮箱客户端、Keep——功能恰到好处的记事本、Photos——强大的照片管理、同步和备份工具,包含了各种 Google 黑科技,前提是你觉得把隐私信息存到 Google 哪里无所谓而的话、Play Store——为什么就不能在支持正版的同时获得更好的体验呢。&/li&&li&&b&ElementalX&/b&:第三方开源(因为Linux Kernel 本来就是 GPL 协议) Linux Kernel,root 后使用。提供了超频降频、手势、操作优化、优化的电源管理和 NTFS 文件系统支持等原版 Kernel 没有提供的高级功能。&/li&&li&&b&Kernel Auditor&/b&:设置和查看内核属性的工具,root 后使用。开源免费但有广告,可自行在 GitHub 上下载源代码后编译获得无广告版本。&/li&&li&&b&JuiceSSH&/b&:Android 上最好用的 ssh 客户端没有之一,也支持连接到 localhost (Terminal Emulator 可以卸载了)。&/li&&li&&b&Greenify绿色守护&/b&:国产流氓应用大杀器,rooted 后效果更佳。知乎上关于 Greenify 的介绍也有很多,所以这里不再赘述。基本功能免费,少数高级功能需要捐赠版。不知道现在国内没有购买渠道,大家如果觉得好用还是买一下吧。&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-083b6d8731dfddc7b187e8f_b.png& data-rawwidth=&570& data-rawheight=&446& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&https://pic3.zhimg.com/v2-083b6d8731dfddc7b187e8f_r.png&&&/figure&&ul&&li&&b&X-plore&/b&:Symbian S60 时代便有的老牌文件管理器,现已登录 Android。界面使用左右两个树形图,操作方便效率高。内置简易的图片查看器和可以在电脑浏览器打开的 Web 界面。root 后可以读写挂载 /。捐赠后更可连接各种网盘服务和使用ftp、sftp、samba等协议。 Android 最好用的文件管理器没有之一。(是的,甩 ES 文件管理器几条街)&/li&&li&&b&EhViewer&/b&:Android 平台的开源 “sad panda” 漫画浏览器。GitHub地址:&a href=&//link.zhihu.com/?target=https%3A//github.com/seven332/EhViewer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&seven332/EhViewer&/a&&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-e272fc228b8a71ad4aa05d1_b.jpg& data-rawwidth=&260& data-rawheight=&260& class=&content_image& width=&260&&&/figure&&p&&br&&/p&&p& 更新:移除了 &b&网易云音乐&/b&,增加了 &b&JetBrains &/b&全家桶。&/p&&blockquote&&b&网易云音乐&/b&:其实这个比较仁者见仁智者见智,个人来说我还是非常喜欢的。曲库非常全,而且的利于高质量的社区,封面、歌词时间轴和翻译之类的信息质量也相对较高。Window、OSX、Linux、Android、iOS、WP 全平台支持这一点简直良心,Linux 版本和 Deepin 合作移植。(虽然我这里在 Arch Linux 经常会出现 segfault 不知道是不是个例。)不喜欢官方的 GUI 版本的话,还有开源的第三方的 CLI 版本 &a href=&//link.zhihu.com/?target=https%3A//github.com/darknessomi/musicbox& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NetEase-MusicBox&/a& 可供选择。&/blockquote&&p&最近几个月一系列的下架和越发糟糕的社区质量,再加上某组织的入驻让我对这个平台失去了信息。目前我更倾向于使用类似于 iTunes 一类的以个人或家庭为单位的离线音乐库。然而这里的环境是 Linux + Android,所以正在寻找替代品,如果实在找不到就只好自己写了(又是一个坑……)。&/p&&p&此答案文本使用 &a href=&//link.zhihu.com/?target=https%3A//creativecommons.org/licenses/by-sa/4.0/deed.zh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Creative Commons - 署名-相同方式共享 4.0 国际 - CC BY-SA 4.0&/a& 协议。&/p&
在我看来,一个软件的良心与否往往可以用一条标准来衡量。Do one thing and do it well.道格拉斯·麦克罗伊是 Unix 系统上管道机制的发明者,而这正式他所提出的 Unix 哲学之一:程序应该只关注一个目标,并尽可能把它做好。简单的来说,一个金融软件不要做…
&figure&&img src=&https://pic3.zhimg.com/v2-95a5a5c6bcec_b.jpg& data-rawwidth=&640& data-rawheight=&265& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/v2-95a5a5c6bcec_r.jpg&&&/figure&&p&这篇文章是写给程序编程的初学者的,是本人在学习编程思想的一些思考,如果想要看懂这篇文章,你需要:&/p&&p&1.明白递归的简单形式是什么样子&/p&&p&2.明白如何通过【递归,非递归】方法实现二叉树的【前序,中序,后序】遍历&/p&&p&递归这种东西,其作用简直强大到无以复加。从dynamic programming,到dfs,bfs。从简单的二叉树,到veb tree,再到复杂的图结构,只要你对编程有一些需求,你就很难回避递归这件事(笔者周围有个刚学计算机没几年的同学,宣称坚持不用递归100年,前一阵儿终于写了一个递归,兴奋地睡不着觉。。。)。&/p&&p&然而,随着会使用递归的人越来越多,这种古老而行之有效的算法渐渐地被很多人嗤之以鼻,认为这不是什么难事。在一些我已经无力吐槽的公司的面试中,会对递归方法的使用加以限制(因为递归会造成大量的内推消耗,虽然这个内存消耗是O(n)级别的)。殊不知,真正会灵活使用递归的人,才是人才!&/p&&p&不扯犊子了,根据笔者观察。有些人虽然会使用递归,会写递归,但不见得对递归的本质有着清晰的认识。给出一个很简单的问题,为什么二叉树的非递归版后序遍历要比递归版复杂那么多?如果你能明确解释清楚这个问题,那么你可以不}

我要回帖

更多推荐

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

点击添加站长微信