此文档主要介绍个人认为比较实用的技巧,常用技巧不做介绍。资料来源于网络,自己再集中整理的。一、实用类快捷键1 常用熟悉的快捷键CTRL+C(复制)、CTRL+X(剪切)、CTRL+Z(撤销)、CTRL+F(查找)、CTRL+H(搜索文件或字符串)、CTRL+Y(重做)、CTRL+/(双斜杠注释)、ALT+/(提示)、CTRL+SHIFT+F(格式化代码)2 编码辅助类1)CTRL+D删除当前行。2)CTRL+ALT+Down(Up)复制当前行到下(上)一行中。比CTRL+C单纯的复制功能要方便好用(省掉了粘贴步骤),主要是用在编写代码时,需要移动代码的地方。3)ALT+Down、ALT+Up。移动单行(多行)代码。也是比CTRL+C更好的快捷键。4)ALT+SHIFT+J(建议要使用)给类,方法,变量添加注释,在类,方法,变量首行,按下此组合键。之所以要建议使用,是为了代码的规范性。现在很多人都没有给自己写的类,方法,变量加上doc文档注释,根本无法生成api 文档。因此每个人在添加一个类、方法时,必须给它加上标准的doc文档注释。(添加类注释有更简便的方法,看后面的配置章节)5)CTRL+1Fixed 的快捷键,提示代码错误原因以及处理办法。跟双击代码中的红叉一样的功能。这是一个很常用功能。一般用于修改语法错误。但是个人觉得用在增加接口方法(或参数),类方法(或参数),更能体现出它的便捷之处。比如当你想为一个接口或类增加一个方法,只许在要调用的地方写上你的方法和参数(先不要定义),CTRL+1,选择 create method…就可以自动为你增加想要的方法,省了很多要写的代码。本质是先制造一个错误的语法,让系统自动修复功能帮我们完成代码。6)CTRL+2修改变量名,定义变量。按下快捷键,会弹出一个快捷键列表(窗口右下角),在选择你要的操作。3 快速定位---快捷键1)CTRL+SHIFT+R(非常好用)在eclipse中快速定位文件(任何类型)。有了这个,只要记得文件的大概名字,就可以通过模糊查询,搜索出来。就不需要为了打开某个模块中的某个java类,得一个个文件的找了。在学习源码的时候,更是少不了它。2)CTRL+O在文件中查找变量或方法。我们一般的做法是,拉动滚动条一个个的找到自己的要的方法。现在只要输入方法的前面名字,就可以快速过滤出你所要的方法。3)CTRL+Q返回上次编辑的地方。有时我们打开太多的java类,当需要返回刚刚编辑过的地方时,这个键可以一步到位。非常好用。4)CTRL+T打开某个方法的声明。通过这个,可以快速找到这个方法所属的类或接口,查看该方法的内容。5)CTRL+W。关闭正在编辑的活动窗口。6)CTRL+K(向下查找), CTRL+SHIFT+K(向上查找)当选中某个字符串后,按这个快捷键,可以在当前文档快速定位到再次出现该字符窜的位置。CTRL+F(查找)好用吗?但跟这个相比,却要逊一筹。因为不需要打开查找窗口,不需要再输入查找的字符,仅仅是选中你要查找的内容。在查找变量,方法时非常实用。7)CTRL+J上面的查找功能有个限制,如果当前没有要查找的字符,需要手工输入时,就不好办了。CTRL+J,就可以帮得上忙了。只要按下此键,输入你想要的字符窜,你就可以看到光标在页面中不断跳转,定位到你所想要的。8)CTRL+L定位到第几行9)CTRL+E选择要激活的文件窗口10)CTRL+, CTRL+. (或者ALT+Left,ALT+Right)定位你上(前)一步浏览的那个位置(或错误)。你曾经浏览过几个java文件,当你转到其他文件后,又想回到刚才访问的文件,那就用这个键吧。或者通过工具栏上的按钮。11)ALT+SHIFT+Z选中一段代码,按下此键,看看出现什么??这应该是你想要的。12)在package explorer视图 右上角的按钮有左右箭头的按钮,该按钮处于按下状态时,可以使打开的文件和导航视图中的文件同步。4 其他1) CTRL+M 窗口最大化2) CTRL+SHIFT+L (打开快捷键面板), CTRL+SHIFT+L(2) 快速按下L两次(打开快捷键配置面板)3)ALT+SHIFT+T 重构功能的面板的快捷键4)ALT+SHIFT+S 代码的编辑功能面板的快捷键5) 多使用右键,多观察记住你经常使用的操作的快捷键。此篇介绍的快捷键都是里面的默认配置,也紧紧是其中的很少 部分,更多,更好的快捷键,你都可以去体验。二、 重构类快捷键多使用重构功能,可以帮我们更快的修改代码,减少出错的概率。1 ALT+SHIFT+R修改变量、方法名。在编码过程中,我们最经常做的操作是,修改变量名称。当变量用于java类中很多地方的时候,修改就比较麻烦,如果没有重构,就得一个一个的修改。如果用重构修改名字,只需要修改一次修改操作。2 重构菜单1) 菜单-->refactor2) 在编辑环境中,右键-->refactor (快捷键ALT+SHIFT+T)三、配置eclipse了解了这部分,可以减少我们的代码输入,提高效率,更快的完成我们的类,让你写代码更轻松,写出的代码更加规范。1 模板配置现在我们最常用的快捷键可能是ALT+/,或者在输入一个单词的一部分之后,让它弹出辅助代码。而这些都是通过模板来配置,打开菜单:window-->preferences-->java-->editor-->templates在右边的列表中,可以看到系统中已经给我们预置了很多的模板。在我们写代码的时候,只要在空白地方使用快捷键ALT+/,就可以看到它们。如:sysout,systrace,main,test,还有很多for,while,if模板。还可以添加自己的模板进去,重复使用。这就相当灵活了。自动生成注释的模板:除了以上的模板外,其实还有一个可定制的模板。就是当你用快捷键(ALT+SHIFT+J)为一个类生成doc注释的时候,eclipse也是通过模板来生成的。如果我们改了这个模板,以后就可以生成完全个性化的注释了。打开菜单:window-->preferences-->java-->codestyle-->code template一个最常用的功能时,给类添加注释的时候,会将作者的姓名,创建时间等个性化的信息写进去。例如:打开右边面板的commentsàTypes 修改其内容为:/***xx系统:<br>*@authorXXX<br>* ${date} ${time}*${tags}*/当你为一个类添加注释时,你就会看到效果了。或者当你fileànewàclass时,在新建面板的下边,会有一个选项Generate comments,选中。打开该新建类,就可以看到效果。2 代码风格样式当我们使用快捷键CTRL+SHIFT+F的时候,eclipse就会帮我们格式化代码,使代码更符合规范,更整齐。修改样式模板:window-->preferences-->java-->codestyle-->formator-->右边面板的edit按钮。转载请注明出处 http://blog.csdn.net/xn4545945
13 October 2013
Eclipse快捷键与使用技巧总结
03 October 2013
高效的MySQL分页
From 高效的MySQL分页PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。首先看一下分页的基本原理:mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec)limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:
1SELECT*FROMmessageWHEREid > 9527ORDERBYidASCLIMIT 20;处理”下一页”的时候SQL语句可以是:
1SELECT*FROMmessageWHEREid < 9500ORDERBYidDESCLIMIT 20;不管翻多少页,每次查询只扫描20行。缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:
1SELECT*FROMmessageWHEREid > 9527ORDERBYidASCLIMIT 20,20;跳转到第13页:
1SELECT*FROMmessageWHEREid < 9500ORDERBYidDESCLIMIT 40,20;原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。已在60W数据总量的表中测试,效果非常明显。
30 September 2013
JS倒计时大全
From JS倒计时大全<form name="form1"><div align="center" align="center"> <center>离2012年<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/世界末日" title="查看 世界末日 中的全部文章" target="_blank">世界末日</a></span>还有:<br> <input type="textarea" name="left" size="35" style="text-align: center"> </center> </div> </form> <script LANGUAGE="javascript"> startclock() var timerID = null; var timerRunning = false; function showtime() { Today = new Date(); var NowHour = Today.getHours(); var NowMinute = Today.getMinutes(); var NowMonth = Today.getMonth(); var NowDate = Today.getDate(); var NowYear = Today.getYear(); var NowSecond = Today.getSeconds(); if (NowYear < 2000) NowYear = 1900 + NowYear; Today = null; Hourleft = 00 - NowHour Minuteleft = 00 - NowMinute Secondleft = 00 - NowSecond Yearleft = 2012 - NowYear Monthleft = 12 - NowMonth - 1 Dateleft = 21 - NowDate if (Secondleft < 0) { Secondleft = 60 + Secondleft; Minuteleft = Minuteleft - 1; } if (Minuteleft < 0) { Minuteleft = 60 + Minuteleft; Hourleft = Hourleft - 1; } if (Hourleft < 0) { Hourleft = 24 + Hourleft; Dateleft = Dateleft - 1; } if (Dateleft < 0) { Dateleft = 31 + Dateleft; Monthleft = Monthleft - 1; } if (Monthleft < 0) { Monthleft = 12 + Monthleft; Yearleft = Yearleft - 1; } Temp = Yearleft + '年, ' + Monthleft + '月, ' + Dateleft + '天, ' + Hourleft + '小时, ' + Minuteleft + '分, ' + Secondleft + '秒' document.form1.left.value = Temp; timerID = setTimeout("showtime()", 1000); timerRunning = true; } var timerID = null; var timerRunning = false; function stopclock() { if (timerRunning) clearTimeout(timerID); timerRunning = false; } function startclock() { stopclock(); showtime(); } // --> </script> <SCRIPT LANGUAGE="JavaScript"><!-- var maxtime = 60 * 60 //一个小时,按秒计算,自己调整! function CountDown() { if (maxtime >= 0) { minutes = Math.floor(maxtime / 60); seconds = Math.floor(maxtime % 60); msg = "距离结束还有" + minutes + "分" + seconds + "秒"; document.getElementByIdx_x("timer").innerHTML = msg; if (maxtime == 5 * 60) alert('注意,还有5分钟!'); --maxtime; } else { clearInterval(timer); alert("时间到,结束!"); } } timer = setInterval("CountDown()", 1000); //--> </SCRIPT> <div id="timer" style="color:red"></div> 3.简单倒计时(仅显示天数)<Script Language="JavaScript">var timedate = new Date("January 14,2013"); var times = "研究生<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/考试" title="查看 考试 中的全部文章" target="_blank">考试</a></span>"; var now = new Date(); var date = timedate.getTime() - now.getTime(); var time = Math.floor(date / (1000 * 60 * 60 * 24)); if (time >= 0) ; document.write("<li><font color=#DEDBDE>现在离2013年" + times + "还有: <font color=red><b>" + time + "</b></font> 天</font></li>"); </Script> 4.复杂版倒计时,带毫秒<script language="JavaScript" type="text/javascript">function d<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/js" title="查看 js 中的全部文章" target="_blank">js</a></span>() { var urodz = new Date("11/12/2008"); var now = new Date(); var num var ile = urodz.getTime() - now.getTime(); var dni = Math.floor(ile / (1000 * 60 * 60 * 24)); if (dni > 1) num = dni + 1 else if (dni == 1) num = 2 else if (dni == 0) num = 1 else num = 0 document.write(num) } </script> 距某某开幕式还有 [ <script language="JavaScript" type="text/javascript">d<span class='wp_keywordlink_affiliate'><a href="http://lxy.me/tag/js" title="查看 js 中的全部文章" target="_blank">js</a></span>()</script>] 天 第五个:Javascript倒计时器 - 采用系统时间自校验 这次利用系统时间自校验倒计时, 无需手工调校使得倒计时更为精确, 代码及详细注释如下:<span id="clock">00:01:11:00</span> <input id="startB" type="button" value="start countdown!" onclick="run()"> <input id="endB" type="button" value="stop countdown!" onclick="stop()"> <br> <input id="diff" type="text"> <input id="next" type="text"> <script language="Javascript">var normalelapse = 100; var nextelapse = normalelapse; var counter; var startTime; var start = clock.innerText; var finish = "00:00:00:00"; var timer = null; // 开始运行 function run() { startB.disabled = true; endB.disabled = false; counter = 0; // 初始化开始时间 startTime = new Date().valueOf(); // nextelapse是定时时间, 初始时为100毫秒// 注意setInterval函数: 时间逝去nextelapse(毫秒)后, onTimer才开始执行 timer = window.setInterval("onTimer()", nextelapse); } // 停止运行 function stop() { startB.disabled = false; endB.disabled = true; window.clearTimeout(timer); } window.onload = function () { endB.disabled = true; } // 倒计时函数 function onTimer() { if (start == finish) { window.clearInterval(timer); alert("time is up!"); return; } var hms = new String(start).split(":"); var ms = new Number(hms[3]); var s = new Number(hms[2]); var m = new Number(hms[1]); var h = new Number(hms[0]); ms -= 10; if (ms < 0) { ms = 90; s -= 1; if (s < 0) { s = 59; m -= 1; } if (m < 0) { m = 59; h -= 1; } } var ms = ms < 10 ? ("0" + ms) : ms; var ss = s < 10 ? ("0" + s) : s; var sm = m < 10 ? ("0" + m) : m; var sh = h < 10 ? ("0" + h) : h; start = sh + ":" + sm + ":" + ss + ":" + ms; clock.innerText = start; // 清除上一次的定时器window.clearInterval(timer); // 自校验系统时间得到时间差, 并由此得到下次所启动的新定时器的时间nextelapsecounter++; var counterSecs = counter * 100; var elapseSecs = new Date().valueOf() - startTime; var diffSecs = counterSecs - elapseSecs; nextelapse = normalelapse + diffSecs; diff.value = counterSecs + "-" + elapseSecs + "=" + diffSecs; next.value = "nextelapse = " + nextelapse; if (nextelapse < 0) nextelapse = 0; // 启动新的定时器timer = window.setInterval("onTimer()", nextelapse); } </script>
Subscribe to:
Posts (Atom)