导航:首页 > 编程语言 > 编辑距离java

编辑距离java

发布时间:2022-06-14 06:53:35

java实现输入两个XML文档,输出它们的相似度

publicclasstest{

/**
*我们把两个字符串的相似度定义为:将一个字符串转换成另外一个字符串的代价(转换的方法可能不唯一),转换的代价越高则说明两个字符串的相似度越低。比如两个字符串:“SNOWY”和“SUNNY”,下面给出两种将“SNOWY”转换成“SUNNY”的方法:
变换1:
S-NOWY
SUNN-Y
Cost=3(插入U、替换O、删除W)
变换2:
-SNOW-Y
SUN--NY
Cost=5(插入S、替换S、删除O、删除W、插入N)
用d[i,j]表示source[1..i]到target[1..j]之间的最小编辑距离,则计算d[i,j]的递推关系可以这样计算出来:
如果source[i]等于target[j],则:
d[i,j]=d[i,j]+0(递推式1)
如果source[i]不等于target[j],则根据插入、删除和替换三个策略,分别计算出使用三种策略得到的编辑距离,然后取最小的一个:
d[i,j]=min(d[i,j-1]+1,d[i-1,j]+1,d[i-1,j-1]+1)(递推式2)
d[i,j-1]+1表示对source[i]执行插入操作后计算最小编辑距离
d[i-1,j]+1表示对source[i]执行删除操作后计算最小编辑距离
d[i-1,j-1]+1表示对source[i]替换成target[i]操作后计算最小编辑距离
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Stringsource="SUNNY";
Stringtarget="hgjdSUN";
inti=0;

//i=EditDistanceChange(source,target);
i=EditDistance(source,target);
System.out.println("需要"+i+"次");
}

//动态规划法
privatestaticintEditDistance(Stringsource,Stringtarget)
{
char[]s=source.toCharArray();
char[]t=target.toCharArray();
intslen=source.length();
inttlen=target.length();
intd[][]=newint[slen+1][tlen+1];
for(inti=0;i<=slen;i++)
{
d[i][0]=i;
}
for(inti=0;i<=tlen;i++)
{
d[0][i]=i;
}
for(inti=1;i<=slen;i++)
{
for(intj=1;j<=tlen;j++)
{
if(s[i-1]==t[j-1])
{
d[i][j]=d[i-1][j-1];
}else{
intinsert=d[i][j-1]+1;
intdel=d[i-1][j]+1;
intupdate=d[i-1][j-1]+1;
d[i][j]=Math.min(insert,del)>Math.min(del,update)?Math.min(del,update):Math.min(insert,del);
}
}
}
returnd[slen][tlen];
}//递归实现---穷举法(枚举法)
(Stringsource,Stringtarget){
if(target.length()!=0&&source.length()==0)
{
returnEditDistanceChange(source,target.substring(1))+1;
}elseif(target.length()==0&&source.length()!=0)
{
returnEditDistanceChange(source.substring(1),target)+1;
}elseif(target.length()!=0&&source.length()!=0){
//当源字符第一个值和目标字符第一个值相同时
if(source.charAt(0)==target.charAt(0))
{
returnEditDistanceChange(source.substring(1),target.substring(1));
}else{
intinsert=EditDistanceChange(source.substring(1),target)+1;
intdel=EditDistanceChange(source,target.substring(1))+1;
intupdate=EditDistanceChange(source.substring(1),target.substring(1))+1;
returnMath.min(insert,del)>Math.min(del,update)?Math.min(del,update):Math.min(insert,del);
}
}else{
return0;
}
}
}

⑵ 用java语言, 如何实现为图片添加边框素材,就是把图片和边框素材(图片)结合


用FrontPage2002来做吧,你点点下面的连接:

具体是:
Web页面可用预定义模板来创建,也可不采用模板而在空白页上自己进行设计。创建新页面的步骤如下:
在网页视图下,选择“文件”菜单中的“新建”命令,再从其子菜单中选择“网页”命令,将弹出“新建”对话框,如图所示。

若用户要新建的网页是框架,则从“框架网页”选项卡中选择某种框架样式;否则,从“常规”选项卡中选择一种所需样式,然后单击“确定”按钮。若想建立一空白网页,可在对话框的“常规”选项卡中选择Normal Page项,或直接单击常用工具栏的“新建网页”按钮。
建议逐一试用FrontPage提供的各种模板以便熟悉它们,日后你就可以自如地利用模板创建常规Web页面,能够节省许多时间。
1.在网页中插入图形
图片往往比大量的文字讲述更具吸引力和说服力,在web页面中适当地添加图片会使网页丰富多彩,但过多地加入图片将降低页面的下载速度,特别是对通过调制解调器访问web页的用户。大多数图形都是采用压缩格式,有的调制解调器不具有压缩功能,这种调制解调器速度更慢。因此用户在加入图片时,应认真选择和进行规划。虽然图形可使web页更有趣味,但应适度使用(使用较少颜色,缩小高度和宽度或裁剪图形、降低图形的分辨率,尽可能地减少图形文件大小,如用压缩格式的文件类型)。
Web页面所使用的两种图片格式分别为GIF和JPEG,用户可选择“插入”菜单中的“图片”命令,再从其子菜单中选择“来自文件”命令,打开“图片”对话框,“图片”对话框提供了“扫描”、“使用您的web例览器来选择网页或文件”、“剪贴画”和“在您的计算机上选择一个文件”四种途径插入图片。
对于一些非GIF和JPEC格式的图片,FrontPage可以自动地将这些文件转换成GIF或JPEG格式。

2.在网页中插入水平线

水平线可以在网页上清晰地划分界限,而且对用户网页的布局起着重要的作用。添加一条水平线,可以通过“插入”菜单中选择“水平线”命令添加。在默认状态下水平线是灰色的,用户可以像改变文本颜色一样改变水平线的颜色。改变水平线的颜色有两种方法(必须在不加主题的情况下):
(1)双击该水平线,将显示“水平线属性”对话框。在对话框的“颜色”项,选择下拉列表,从中选择合适的颜色,单击“确定”按钮。
(2)用鼠标右键单击这条水平线,从快捷菜单中选择“水平线属性”命令,再从对话框中选择一个合适的颜色。
使用框架
--------------------------------------------------------------------------------

框架是把Web浏览器的视窗分成几个部分,每个部分都是独立的Web页面,这样便可同时显示多个页面。
可以很容易地用FrontPage创建一个多框架的web页面。为了创建具有框架的Web页面,可从“文件”菜单的“新建”子菜单中选择“网页”命令,弹出“新建”对话框,选择“框架网页”选项卡。
在左边的列表中可选择不同类型的框架模板,选定模板后,按“确定”按钮即可创建一个具有框架的网页。
在创建有框架的Web页面时,应注意有些web浏览器不支持框架。虽然使用不能显示框架的浏览器的用户已很少,为确保这些用户仍然能够浏览到Web站点上的内容,可以填上要告诉那些低版本浏览器的使用者的话,例如请对方更换浏览器等。
在新建的框架的窗口中,单击“设置初始页”按钮将会弹出“创建超链接”对话框,可以链接到一个指定页面;单击“新建网页”按钮将创建一个新页面,然后在该页面内对该页进行编辑。在编辑页面时,若感觉页面被放在一个狭窄的框架中太拥挤,可选择“框架”菜单中的“在新窗口中打开网页”命令,这样便打开一个新的满屏窗口,可以自由地在页面中增加内容。
利用FrontPage的框架页面模板在Web页面上引入了框架布局,我们还可以在此基础上,根据需要进行进一步的设计。
1、增加新框架

要给框架页面增加新框架,就是像拆分表格的单元格一样,把一个框架分为两个框架。 其操作如下:
(1)按住Ctrl键,将鼠标放在框架边框上,当鼠标变为上下箭头时,可把边框拖到一个新位置,当松开鼠标按钮时,一个新的空白内容的框架就形成了。
(2)也可以通过命令来操作:首先单击要拆分的框架内部,选“框架”菜单中的“拆分框架”命令,在弹出的“拆分框架”对话框中单击“拆分成列”或“拆分成行”单选按钮,单击“确定”按钮即可。

2.删除框架

若框架页面看起来太乱,可删除某些框架。要删除一个框架,可先单击该框架选择它,再选择“框架”菜单中的“删除框架”命令即可。

3.改变框架属性

在设置好框架的整体布局后,我们还可以对每一框架的具体属性进行设置,操作如下:
(1)单击需设置属性的框架,选择“框架”菜单中的“框架属性”,则弹出“框架属性”对活框。

(2)在对话框的“名称”文本框中可输入框架名,这样便于识别不同的框架;在“选项”区域中,若选中“在例览器中可以调大小”复选框,则客户在浏览站点时,可重新定义框架尺寸,通过在“显示滚动条”下拉列表框中选择不同的描述项,可设置让滚动条是否出现。
(3)在“框架大小”区域中,可设置框架大小,可以定义一个绝对像素值或相对于浏览器窗口的百分比,若要用浏览器来设置相对于该页面中框架的尺寸,可选“相对”;在“边距”区域中,可设置内容页面与框架边框分隔的像素数值。
(4)要改变开始页面,可以在“初始网页”文本框中输入一个新的页面名字或URL。
(5)单击“框架网页”按钮,则弹出“网页属性”对话框。
(6)在该对话框的“框架”选项卡中,在“框架间距”文本框中,可输入以像素为单位的边框宽度;若要使框架边框消失,则不要选中“显示边框”复选框。
(7)单击“确定”按钮,关闭“网页属性”对话框,再单击“确定”按钮,关闭“框架属件”对话框,完成框架属性设置。
动态网页

--------------------------------------------------------------------------------

DHTML是动态网页的意思,它其实并不是一个标准的术语。事实上没有一种技术叫作DHTML。DHTML是利用CSS(层叠样式表),JavaScript,HTML等技术而建立的能与访问者产生互动的网页。比如在动态网页里,当访问者单击了某一张图片后,这张图片会自动的移动,这就是DHTML效果。也就是说,当网页下载完毕后,它无需再与服务器连接就能产生变化了。FrontPage2000提供了一套容易制作动态网页的方法,你可以建立起属于自己特色的动态网页。

1、使用DHTML的基本步骤

1).在页面点选需要使用DHTML的对象,比如文本,图片。对于文本需要拖曳鼠标选定;

2).在DHTML工具栏,选择通过开启的下拉列表选择一种事件,文本和图片所具有的事件是不同的;接下来再应用下拉列表选择一种效果;最后选择该效果的的实现方法;

3).当你为对象使用了DHTML后,保存该页面并预览,你会发现你选定的对象按照你设置的DHTML的效果出现;

4).如果想删除某一个对象的DHTML效果,先选定该对象,然后单击DHTML工具栏上的删除效果图标即可。

2、DHTML的事件

在DHTML制作中,我们听得最多的是“事件”这个术语。什么是“事件”呢,顾名思义,就是发生的一件事情,比如你用手打开门,那么这就是一个事件。换到网页制作中,开门变成了单击,也就是说,访问者单击了一个链接,那么出现了事件的结果,门被打开了。

在FrontPage2000中,当我们打开DHTML效果工具栏后,点选文本或者图片会产生不同事件。但它们的施用方法是一样的,下面我们以文本举例:

我们先在编辑器里输入一段文本,比如:网页陶吧,然后继续下面的三个步骤:

选定一段需要产生DHTML效果的文本,这里是:网页陶吧。从DHTML效果工具栏的开启下拉列表选择一个事件。这里对于文本我们只有“网页加载”这个事件。“网页加载”就是当网页第一次装入的时侯发生的事件,它不需要用户利用鼠标去触发它,而只需要访问者利用浏览器打开它的时侯就会产生预设的动态效果。

选择好事件后,我们要在应用下拉列表里选择一个该事件的应用效果。在该列表下有七种可以采用的效果,我们选择飞入。

对于应用效果会有不同的方法产生。比如当你选择的应用效果是“飞入”的时侯,文本可以从底部飞入,可以从左边飞入,也可以从右边飞入,这些就是方法。在这个下拉列表里并没有注明这个术语。有的应用效果是没有方法的,比如波动。我们这里选择从底部飞入。

最后保存该页面并预览,你会发现网页陶吧这个四个字在网页第一次加载后从底部飞入。当然,你也可以尝试其它DHTML效果。对于选定图片,你会在DHTML效果工具栏的开启下拉列表看到新的事件,单击和鼠标悬停,它们会有各自的应用效果和实现方法。你可以每一个尝试一下,这样你就能明白这些事件和应用效果和方法之间的关系。

3、DHTML的小技巧

DHTML兼容性

利用FrontPage2000制作的DHTML网页只能被InternetExplorer4.0或以上版本完全正常浏览。对于图片的DHTML效果,Netscape Communicator 4.0或以上版本也可以浏览。

禁止DHTML

如果想禁用DHTML效果,点选菜单工具/网页选项,在打开的对话框里选择兼容性标签,取消动态HTML前的复选框里勾,这样DHTM效果被禁用。

快速使用DHTML

一般情况,在你没有选定某一个对象的情况下,你只需要把鼠标移动到对象的左边或者右边单击一下就可以使用DHTML效果了。

4、网页过渡

网页过渡是指当你进入或者离开一个网页的时侯所产生的效果的这个过程。比如你从某一页进入另一页,你会发现当前页慢慢向中间合拢,同时出现了另一个新的页面,直到当前页合拢消失而最后出现新的页面。如果你想使用网页过渡,可以按照以下步骤:

1).打开想使用过渡效果的页面,或者新建立一个页面。点选菜单格式/网页过渡,打开网页过渡对话框;

2).在事件下拉列表里选择一个事件,我们选择进入网页。大家要注意,当你为某页和站点都设置了过渡效果时,网页将比站点过渡效果优先;

3).在周期文本框里输入持续的时间,然后在过渡效果列表框里点选一个效果,单击确定。利用浏览器打开该页面,因为我们选择的网页过渡是进入网页,所以当你打开该页时你就能看到过渡效果了。

利用DHTML效果的确是吸引访问者的有力利器,但如果你不愿意和复杂的代码打交道,那么FrontPage2000为你预设了许多DHTML的效果。你要做的仅仅是选定需要动态效果的对象,比如文字,图片,然后利用“傻瓜”式的操作就可以让你的网页动起来。
Web页有自己的一组属性,通过选择“文件”菜单中的“属性”或通过鼠标右键单击页内任何位置,选择快捷菜单中的“网页属性”命令,可以打开“网页属性”对话框,在“常规”选项卡中,各项设置含义如下:

·位置:指出页的完整URL。

·标题:显示的页标题,即在HIML中显示在<head>元素中的<tit1e>标签内。

·基位置:在此位置可输入一个URL,可将这页中使用的相对URL的超链接总指向同一正确的目标,通过对一个URL的说明,可以在不移动相对URL中所有目标的情况下,移动这个页。

·默认的目标框架:定义不规定框架的页中所有超链接的默认框架。

·背景音乐:加入背景音乐,当浏览器打开该页时,会同时播放音乐。

在其它选项卡中还可对页边距、语言等系统参数进行设置。
建立超链接

--------------------------------------------------------------------------------

超链接(HyperLink)的出现使网上浏览变得更加便捷,只须用鼠标轻轻点击,便能轻松地从一个页面跳转到另一个页面,从一个Web站点跳到另一个Web站点,从一个国家跳到另一个国家。超链接就是一些特殊的文本或图像,是其它页面的入口。
1.与当前web站点的页面建立超链接
(1)在FrontPage中打开要建立超链接的页面(若是新建页面,则要肯定该页面己被保存),选中超链接源,超链接源可以是一个字符、一个单词、一句话或一幅图片等。
(2)选择“插入”菜单中的“超链接”命令,或单击“常用”工具栏的“超链接”按钮,则弹出“创建超链接”对话框(如图),在该对话框中列出了当前FrontPage中打开的Web站点中的文件夹和文件。

(3)在该对话框的文件列表中,选择要建立链接的目标文件。
(4)单击“确定”按钮,超链接建成。

2.与本机中的其它文件建立超键接
(1)选择超链接源,打开“创建超链接”对话框。
(2)在该对话框中单击“制作一个链接到您计算机上文件的超链接”按钮,然后从弹出的对话框中找到自己所要链接的文件,选中它。
(3)单击“确定”按钮,超链接建成。

3.与world wide web上某一站点建立超链接
(1)在FrontPage中打开欲建超链接的页面,选定超链接源。
(2)选“插入”菜单中的“超链接”或单击常用工具栏的“超链接”按钮,弹出“创建超链接”对话框。
(3)在“URL”文本框中,输入超链接目标的URL。
(4)单击“确定”按钮。
格式化文本

--------------------------------------------------------------------------------

1.输入文本
从总体而言,文本仍是网页中的主体内容,在FrontPage中输入文本与在Word中输入文本非常类似。
(1).需要加入空行或换段时才使用Enter键,当输入文本达到所定义的右边界时,将自动换行。若录入文字有错可按Backspace键清除错误,重新录入。
(2).可在文本中任意位置处插入新文本内容,操作时把鼠标指针定位到欲加文本处即可添加文本。
(3).可进行覆盖式录入,即先用鼠标选中要替换的文本,然后直接录入文本。
(4).可通过单击常用工具栏的“显示所有”按钮,让段落标记在屏幕上显示或隐藏,借助段落标记可清楚地看到段与段之间的空行。

2.文本的选择

(1).选择一个单词或多个单词:选择一个单词只需在该单词上双击鼠标即可,按住鼠标左键在要选单词上拖动即可选择多个单词。选择字与选择多个单词的方法相同。
(2).选择一行文字:一行文字就是在屏幕上占据一行空间的文本。将鼠标箭头移到行的最左边,当光标箭头变为指向左边时,单击鼠标左键,便可选择该行。
(3).选择一个段落:将鼠标箭头移到该段落的最左边,当光标箭头变为指向左边时,双击鼠标左键,或按下ALT键,再用鼠标单击想要选择的段落,即可选择该段落。

3.删除、拷贝和移动文本或图片

(1).删除:删除插入点左侧的一个字符,按Backspace键;删除插入点右侧的一个字符,按Delete键;删除插入点右侧的一个单词,按Ctrl+De1ete键;剪切所选内容并保行到“剪贴板”,按Ctrl+X键;删除所选内容按De1e1e键或选择“编辑”菜单中的“删除”命令。
(2).拷贝:拷贝所选文本或图形到剪贴板,方法是:选中文本或图形,然后按Ctrl+C键或从菜单上选择“编辑”菜单中的“复制”菜单命令,也可直接单击工具栏中的“复制”按钮。
(3).移动文本或图片:选择想要移动的文本或图片,再拖曳到要插入的位置,释放鼠标,所选对象就移到目的地。如果先将选择的文本或图片“剪切”,然后再“粘贴”到指定区域,也可将其移动。
(4).通过“撤销”取消误操作:如果用户在不小心的情况下错误地执行操作,单击工具栏上的“撤销”命令按钮,可以取消用户执行过的操作,或从菜单栏选择“编辑”菜单中的“撤销”菜单命令,或按Cir1+Z键。

4.加入标题

出于页面内容层次的需要,有时在页面中要加入一些小标题。 HTML语言规范采用6级标题,各级标题采用文字不同字号来区分,其中标题1为大标题,其它依次为中小标题。要设定某一级标题,可以在FrontPage格式工具栏中的“样式”下拉列表中选中一个标题等级,然后在光标处输入标题文字即可;或者先输入文字,并选定该文字,然后在“样式”下拉列表中选定某一级标题。标题结束后,将下拉列表中的格式改回原来的“普通”,再进行其它内容的输入。

5.改变字体及设置字体效果
FrontPage在通常情况下,字体为“Times New Roman”。若用户的操作系统是中文Windows95/98或Windows NT,中文默认字体为“宋体”,文字大小采用默认的字号。若要设定不同的字体,可先选择要改变的文字,然后在格式工具栏里的“字体”下拉菜单中选择一种字体,或从菜单栏选择“格式”菜单中的“字体”菜单命令,通过“字体”对话框来设置,并可设定字体样式、大小等。当字体改变后,形式将一直保持,直到用户又重新设置新的字体为止。
(1).设置字体颜色:选中文字,单击格式工具栏上的“文本颜色”按钮的下拉箭头,就会弹出其下拉列表,在“标准颜色”中选择所需颜色;若没有,可选择“更多的颜色”命令,然后从弹出的对话框中选择。
(2).设置字体样式:要对需要的文字进行粗体、斜体和下划线处理,只要选择要处理的文字,从格式工具栏上单击“加粗”、“斜体”或“下划线”按钮即可。想解除此效果,可以选中文字,再次按相应的按钮就可以解除效果,恢复到正常字体。在制作网页时,一般不采用“下划线”效果,因为下划线在一些网页中都表示有超链接。
(3).字体加线效果:共有两种:“下划线”可以在选中的文字下面划一条线;“删除线”在文字中间贯穿划一条线。
(4).特殊的文字风格:当选中的文字需要使用某些特殊风格,如“闪烁”风格,可通过选择“字体”对话框中“字体”选项卡(如图)的“效果”区域的所需选项,但有的文字特殊效果只有在浏览器中才能体现出来。

6.文本的缩进
文本的缩进就是使文本左边、右边显示空白,这种效果有利于对关键段落加强说明。要对一个已有的段落运用缩进的方式,首先选中段落,然后在格式工具栏上单击“增加缩进”按钮,段落左边和右边分别缩进一段距离,连续按“增加缩进”按钮,缩进将进一步加大。这种在文字两边同时缩进的方式也称之为双向缩进。若缩进的空间太大,可以通过单击“减少缩进”按钮来减少缩进的空间。

7.文本对齐方式
若输入的文字是从该页的左边距开始,并逐渐向右延伸,且到了行满以后又折回下行左边(左边距处)重新开始,这就是左对齐。有些文字需要居中方式,比如标题之类的文字;而有些文字需要放到右边,这些可通过格式工具栏上的“向左对齐”、“居中”和“向右对齐”按钮来实现:,不同的对齐方式可以使文本呈现不同的显示样式,而且可以清楚地表明用户想要说明的问题,使网页整体保持协调。 要设定文本的居中、左齐或右齐方式,须先选择好要设置的文本,再单击相应按钮即可。如果用户想回到原始状态的对齐的方式,应先选定该文本,再单击格式工具栏上相应的对齐按钮。

8、加入项目符号或列表编号

有一些列表前面有加圆点的符号,说明一条条的列表内容,这在专业排版中称为项目符号,在Web页面中加入项目符号或列表编号可使内容有条理、更清楚,可以通过列表把大量内容简要地描述出来,便于读者抓住重点。还有另外一种形式即列表编号,可以用来描述一个问题的处理步骤和顺序,这两种处理形式在FrontPage中运用起来很方便。
加入项目符号或列表编号与在Word中的操作很类似。先选定文本,用户可以在格式工具栏按相应的按钮,或选“格式”菜单中的“项目符号和编号方式”命令,打开项目符号和编号方式对话框(如图),从中选定不同格式的列表项目。

在FrontPage中新建的两个文本行之间都有一个空行,如果用户在输入或添加项目时不想每两行之间都出现一个空行,可以在格式工具栏上单击“项目符号”或“编号方式”按钮。该按钮为下凹状后同时出现第一个项目符号,输入需要的文字后,按“回车”键,然后在自动出现的下一个项目符号后继续输入。
FrontPage还可以通过提供列表编号或项目符号的方式对列表项进行排列。操作方法与上一段所述相同。
如果在所有项目输入完毕后,以下的内容不再希望添加编号或项目符号,可两次回车,则停止编号或停止添加项目符号。若想改变编号的形式或不想从1开始,可通过在列表符号上单击鼠标右键,在弹出的快捷菜单上选择“列表属性”命令,在弹出的“列表属性”对话框中选择“号码”选项卡,选择所需的编号风格,再在右边的“初始号码”微调器中调整起始编号,在调好之后单击“确定”按钮即可。

⑶ 如何在php中使用用JAVA实现的算法

PHP也有很多自带的函数啊,下载一本手册来查一查呗。明白了算法,换一种语言来实现还是不太困难的

⑷ Java程序员的职业规划是什么

如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。

一、Java基础首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应的视频。学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。

二、Web开发等你写上几天程序以后,你往往会比较迷茫,因为你写的东西似乎看起来毫无用处,比如实现一个简单的计算器,读取一个文件等。这个时候你就应该去学着写一些让你觉得有意思的东西了,所以你应该学习更多的知识。这些内容主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。

你可以试着自己写一些页面,当然,你可以尽你最大的努力让它变得最漂亮。这部分内容对于后端Java来说,理论上不是特别重要,但至少要达到可以自己写出一些简单页面的水平。接下来,你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的,而且这个时候,你要学会使用开发工具,而不能再使用记事本了,可以选择eclipse。当你下载安装好eclipse以后,请视频中的教程一步一步去学习,一定要多动手。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频,因此推荐给大家。

当然了,我本人并没有看过他的视频,所以不好说的太绝对,如果大家自己有更好的选择,可以坚持自己的,不要被我干扰。原本我也是打算出教学视频的,但是由于时间问题,还是决定放弃了。但是如果你看视频的过程中遇到了问题,欢迎来我的交流群提问,或者去斗鱼观看我的直播提出你的问题,直播地址和群号都在我的个人博客左侧。最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。


三、开发框架当你学会以上内容以后,这个时候你还不足以参加工作,你还需要继续深造。公司里为了提高开发的效率,会使用一些Java Web框架,因此你还需要学习一些开发框架。目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。

但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。

关于学习SSM框架的地址给大家推荐一个,这里面有视频,大家可以去观看。四、找工作当你完成开发框架的学习以后,你就该找工作了,在校的找实习,毕业的找全职。与此同时,在找工作的同时,你不应该停下你的学习,准确的说,是你在以后都不能停下学习。上面这些内容你只是囫囵吞枣的学会了使用,你可以逐步尝试着去了解更多的东西,网络是你最重要的老师。

第二部分:对于参加工作一年以内的同学。恭喜你,这个时候,你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段,而且你可能会经常加班。但是加班不代表你就可以松懈了,永远记得我说的那句话,从你入行那一刻起,你就要不停的学习。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。这本书很厚,当初看这本书,我花了整整三个月。正常速度的话,应该可以在半年左右看完。我这里不要求过高,只要你在一年以内把这本书看完即可。当然了,我所说的看完,是充分吸收,而不是读一遍就完事了,因此有些内容你可能会看不止一遍。总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。

第二部分:对于参加工作1年到2年的同学。这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。于是这个时候,设计模式就来了。我当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,我要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。


请记住,我所提的基本都是最低要求,因此不要有任何松懈的心理,否则五年后,你不要去羡慕别人高于你的工资,也不要去羡慕别人进入了某公司。这一年,你必须对于设计模式了如指掌,《大话设计模式》可以作为你的开端。此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。

第三部分:对于参加工作2年到3年的同学有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在我眼里,这本书的重要性还要高于《Java编程思想》。这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。

另外,在过去2年的工作当中,你肯定或多或少接触过并发。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,我比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。


因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且我很负责的告诉你,我在这个阶段的时候,所学习的东西远多于这里所罗列出来的。

因此千万不要觉得你已经学的很多了,我所说的这些都只是最低要求,不光是我,很多人在这个时间段所学习的内容都远超本文的范围。如果你不能跟上节奏的话,若干年后,如果不是程序猿市场还不错的话,你很可能不仅仅是工资比别人低,公司没别人好,而是根本就找不到工作。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。

但是对别人没有价值,不代表对你自己没有价值。一个造轮子的过程,是一个从无到有的过程。这个过程可以对你进行系统的锻炼,它不仅考察你的编码能力,还考察你的框架设计能力,你需要让你的轮子拥有足够好的扩展性、健壮性。而且在造轮子的过程中,你会遇到各种各样的难题,这些难题往往又是你学习的契机。当你把轮子造好的时候,你一定会发现,其实你自己收获了很多。所以,这个阶段,除了上面提到的了解JVM、JDK和框架源码以外,也请你根据别人优秀的源码,去造一个任何你能够想象出来的轮子。


第四部分:参加工作3年到4年的同学这个阶段的同学,提升已经是很难了,而且这个阶段的学习往往会比较多样化。因为在前3年的过程中,你肯定或多或少接触过一些其它的技术,比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。这些技术,你能精通任何一项,都将是你未来面试时巨大的优势,因此如果你对某一项技术感兴趣的话,

这个时候可以深入去研究一下。这项技术不一定是你工作所用到的,但一定是相关的。而且在研究一门新技术时,切忌朝三暮四。有的同学今天去整整大数据,搞搞Hadoop、hbase一类的东西。过不了一段时间,就觉得没意思,又去研究分布式缓存,比如redis。然后又过不了一段时间,又去研究分布式计算,比如整整Maprece或者storm。结果到最后,搞得自己好像什么都会一样,在简历上大言不惭的写上大数据、分布式缓存、分布式计算都了解,其实任何一个都只是浮于表面。到时候面试官随便一问,就把你给识破了。

一定要记住,作为一个程序猿,平日里所接触的技术可能会很多,但是想要让一门技术成为你的优势,那么一定是你对这门技术的了解强过绝大多数人才行。因此在这个阶段,你就不能再简单的去学习前3年的内容了,虽然前面的学习如果还不够深入的话依旧要继续,但这个时候你应该更多的考虑建立你的优势,也可以称为差异性。差异性相信不难理解,就是让你自己变得与众不同。你前面三年的学习足够你成为一名基本合格的Java开发者,但你离成为一名优秀的Java开发者还有很大的距离。

所谓优秀,即能别人所不能。而你前三年所学习的内容,是很多做过几年的Java开发都能够掌握的。那么为了让自己有差异性,你就需要另辟蹊径,找一个方向深入研究下去,以期在将来,你能够成为这个领域的专家,比如分布式计算领域的专家,大数据领域的专家,并发领域的专家等等。此外,你除了建立你的差异性之外,还要去弥补你基础上的不足,直到现在,我都没有提及基础知识。原因是基础是很枯燥无味的,学的太早不仅容易懵逼,而且懵逼的同时还容易产生心理阴影,以至于以后再不想去研究这些基础。但基础又是你深入研究一些领域时所必须掌握的,比如你去研究分布式计算,你不懂算法你玩个毛毛?比如你去做分布式缓存,你对计算机系统的内存不了解,你如何去做缓存?


如果你的基础本来就非常强,那么恭喜你,相信你在之前的工作中已经充分体会到了这些基础对你的帮助。但我相信大部分人的基础都很薄弱,哪怕是科班毕业的人,很多人也不敢说自己当初的基础学的多么强大,比如算法、计算机系统原理、编译原理这些。但是每个人时间都是有限的,而且这些基础的书籍每一本读下来,没个一年半载的,还真拿不下来,因此还是要有所抉择的。虽然艺多不压身,但问题是艺多是有代价的,是需要你付出时间和精力的,而我个人更赞成在同等代价的情况下获取最大的收获。

首先,我比较推崇的基础书籍有三本,分别是《深入理解计算机系统》,《tcp/ip详解 卷一、二、三》,《数据结构与算法》。其中TCP/IP有三本书,但我们这里把这三本看成是一本大书。这三本分别适合三种人,《深入理解计算机系统》比较适合一直从事Java Web开发和APP后端开发工作的人群。《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,比如你使用netty去开发的话,那么就要对TCP/IP有更深入的了解。而《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。另外,我要强调的是,这里所说的适合,并不是其它两本对你就没有用。比如你做Java Web和APP后端开发,《tcp/ip详解 卷一、二、三》这本书对你的作用也是很大的。这里只是分出个主次关系而已,你要是时间足够的话,能把三本都精读那当然最好不过了。

但如果时间有限的话,那么就先挑对你帮助最大的书去读。理论上来讲,这一年你能把这三本其中一本精读下来,就已经非常厉害了。有了基础,有了前面的工作经验,你就可以去开拓属于你的领域了。在这一年里,一定要规划好自己的领域,建立好自己的优势,制造出差异性。如果你对自己的领域不够清晰的话,随着你工作的时间日益增多,你接触的技术会越来越多,这个时候,你很容易被淹死在技术的海洋里,看似接触的技术越来越多,会用的也越来越多,但你毫无优势。有的同学可能会问,“我,我也不知道我的领域是什么啊?怎么办呢?”对于这种人,我只想说,“卧槽,这还问我?要不干脆我替你学习得了,好不好?”


第五部分:参加工作4年到5年的同学经过前面一年的历练,相信你在自己所钻研的领域已经有了自己一定的见解,这个时候,技术上你应该已经遇到瓶颈了。这个时候不要着急提高自己的技术,已经是时候提高你的影响力了,你可以尝试去一些知名的公司去提高你的背景,你可以发表一些文章去影响更多的人。当然,你也可以去Github创建一个属于你的开源项目,去打造自己的产品。

这次的开源项目不同于之前的造轮子,你这个时候是真的要去尽量尝试造出来真正对别人有价值的轮子。技术学到这个阶段,很容易遇到瓶颈,而且往往达到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是专门搞学术研究的。然而很可惜,大部分程序猿做不到这一步,那是科学家做的事情。这个时候提高影响力不仅仅是因为技术上容易遇到瓶颈,更多的是影响力可以给你创造更多的机会。程序猿在某种程度上和明星很像,一个好的电视剧和电影就可以成就一批明星,程序猿有的时候也是,一个好的项目就可以成就一群程序猿。比如国内几个脍炙人口的项目,像淘宝、支付宝、QQ、网络、微信等等。这每一个项目,都成就了一批程序猿。我敢说,这里面任何一个项目,如果你是它的核心开发,光是这样一个Title,就已经是你非常大的优势。更何况还不止如此,Title说到底也是个名头,更重要的是,这种项目在做的时候,对你的历练一定也是非常给力的。

而你如果想要参与这样的项目,除了靠运气之外,影响力也是很重要的一个手段。比如你在分布式计算领域有一定的影响力,那么如果有什么好的关于分布式计算的项目,对方就很可能会邀请你。就算人家不邀请你,你自己主动去面试的时候,对方如果知道你在这个领域的影响力,也肯定会起到很大的作用,而这个作用,甚至可能会超过你现在的技术能力。所以,在这个阶段,你最大的任务是提高自己的影响力,为自己未来的十年工作生涯那一天做准备。如果你能够靠你的影响力和以前积累的技术,参与到一个伟大的项目当中,那么你后面的五年也就有着落了。当然了,我现在满打满算,做程序猿也就4年半不到,因此关于4年到5年这一部分,我的见解不一定是对的,就算是对的,也不一定是适合任何人的。

所以,希望大家自己有的判断力,去决定到底该如何度过这一年。结语本文到此就基本结束了,整篇文章很长,但其实主要就说了两部分内容,一个是社招面试的准备,一个是Java生涯的学习。关于这两部分,我已经给出了自己的见解,但是还是那句话,每个人吸收知识的时候,都要有抽取精华,去除糟粕的能力。我所说的,可能有些是对的,有些是错的,有些是适合你的,有些是不太适合你的,你要自己能够判断。其实你在生活和工作当中也是一样的,你身边的人形形色色,有的人你喜欢,有的人你很讨厌。但其实你喜欢的人也有缺点,你讨厌的人也有优点。你要学会从你讨厌的人身上学会他的优点,千万不要一棒子打死,这只会让你失去很多学习成长的机会。好了,说了这么多了,就到此为止吧

⑸ 什么是良好的编程风格(Java编程)

首先,编程风格并不同于其他的style,目的并不是形成自己独树一帜的风格,而是为了让你的程序易读,有利于团队合作以及别人帮你改错。

风格是通用的

C语言和C++语言的编程风格 (Java见下)

第一章:缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.

总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
第二章:大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if (x is true) { we do y }

然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:
int function(int x) { body of function }

所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是___对___的,(第二)如果K&R不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.

另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.
第三章:命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如之类的命名方式.一个C语言的程序员会将之命名为"tmp",这很容易书写,且并不是那么难以去理解.
然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量来说是必要的了.调用一个名为"foo"全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名--"count_active_users()"--或另外的相近的形式,你不应命名为"cntusr()".
有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会去检查它,而这样只会迷惑程序员. --知道为什么Micro$oft为什么会生产这么多"臭虫"程序了把!!.
局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有"i",如果没有任何可能使得它能被误解的话,将其写作"loop_counter"是效率低下的.同样的,""tmp"可以是任何临时数值的函数变量.
如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称
function-growth-hormone-imbalancesyndrome.
第四章:函数
函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注).
一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的.
然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数.
另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.
第5章:注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.
第六章:你已经深陷其中了.
不要着急.你有可能已经被告之"GUN emacs"会自动的帮你处理C的源代码格式,而且你已经看到它确实如此,但是,缺省的情况下,它的作用还是不尽如人意(实际上,他们比随便敲出来的东西还要难看- ainfinite number of monkeys typing into GNU emacs would never make a good program)
于是,你可以要么不要使用GUN emacs,要么让它使用sanervalules.使用后者,你需要将如下的语句输入到你的.emacs文件中.(defun linux-c-mode() "C mode with adjusted defaults for use with the Linux kernel."(interactive) (c-mode) (c-set-style"K&R") (setq c-basic-offset8))

这会定义一个M-x Linux-c-mode的命令.当你hacking一个模块的时候,如何你将-*- linux-c -*-输入在最开始的两行,这个模式会自动起作用.而且,你也许想加入如下
(setq auto-mode-alist (cons '("/usr/src/linux.*/.*.〖ch〗$" . linux-c-mode) auto-mode-alist))

到你的.emacs文件中,这样的话,当你在/usr/src/linux下编辑文件的时候,它会自动切换到linux-c-mode .
但是,假如你还不能让emaces去自动处理文件的格式,不要紧张,你还有一样东西: "缩进" .
GNU的缩进格式也很死板,这就是你为什么需要加上几行命令选项.然而,这还不算太坏,因为GNU缩进格式的创造者也记得K&R的权威, (GNU没有罪,他们仅仅是在这件事情上错误的引导了人们) ,你要做的就只有输入选项"-kr -i8"(表示"K&R,缩进8个字符).
"缩进"有很多功能,特别是当它建议你重新格式你的代码的时候,你应该看看帮助.但要记住: "缩进"不是风格很差的程序的万灵丹.

http://www.nou.com.cn/portal/Article/itjs/jsjj/cxsj/200511/20051104115145.html

JAVA编程风格简析

很久以来都在体会着JAVA的风格,现在做一简单陈述,希望大家多提宝贵意见。

对于一种好的编程语言,学习它的编程风格是很重要的。每种语言都有自己的编写和注释约定,当然所有语言都建立在最基本的约定之上。编程中最重要的并不是让代码按自己希望的方式运行,而是程序中那种自明的编程风格(这对于程序员的益处相信众多程序员都身有体会)!但这还不够,程序还应该具有可读、相对持久和可维护性。可读性非常重要,因为你不希望自己以前的作品在之后的阅读中给自己留下障碍,当然,更重要的是自己的程序能让其他程序员读懂并且修改。

下面我把工作中所理解的java风格做一简单总结,这是我所理解的好的编程风格和应用中我们应当如何使用java编写自己的代码的小Guide。这并不完全,希望大家帮我陆续总结各自的经验。

一般性概述
好的编程风格固然重要,但是你一定听说过一些程序员的个人风格。其实我们完全不必为那些所谓条条框框所累,但是作为原则是我们至少不能打破这些常规。我们应该在保持自己风格的同时尽量的把自己与编程潜原则靠拢。

可读性很容易达到,比如,让自己的代码缩排排列、名字采用描述性但不要过长(短名应仅仅用在非远程)、特殊名称比如pi应当被定义为final类型。模块性是编程需要注意的另一重点,把代码划分到类里,在类中把功能划分到方法中,别让一个类太大,否则在使用、修改和理解上都会造成不必要的麻烦,方法也一样,如果一个方法长度超过50行,它产生错误的概率将接近100%,尽量把大方法划分为小方法,编程中为避免重复编写,还应尽量调用JAVA标准类库。

尽量避免在写代码和注释时使用不同语言,经常见到论坛有朋友询问诸如在java中调用c、调用php、调用shell之类的问题,其实在编程中,我们应尽量使用一种语言去完成事情。另外就是不必最优化自己的代码,应该选择相对较优的算法就可以了。

类、方法和fields
类应体现出某种物质的基本概念,比如要编程实现“汽车”的组成,那么所有的汽车都可以用类Car实现。这个类应当包括域描述、属性描述和car的状态(color, number of doors, age等)和由car可完成的操作(getColor, setColor等)。为了提高类的可重用性,不要在类中有过多的描述,当然这也会增加错误产生的机会。

类名首字母大写,比如Date, String, Hashtable等 ... ...

类如下定义:(未使用Javadoc做注释):

public class Car {

/* Instance variables are placed either in the beginning
or at the end of the class */

private int age;
private Color color;

/* The constructor should be placed in the beginning */

public Car(int age, Color color) {
this.age = age;
this.color = color;
}

/* Example method */
public int getAge() {
return age;
}

/* The main method is optional, but looks like this.
If it exists, it is either the first or the last
method in the class */

public static void main(String [] args) {
...

}
}

注意类名和大括号间的空格!

方法
方法一般定义为public。当然,如果方法仅仅在当前类用到可以定义为private,而如果希望一个子类沿用这个方法则不同,这时候的方法应定义为protected。

java中的方法定义很有趣,它们一般小写字母开头,如果有两个字组成,第二个字的首字母则大写。因此名字的描述性是至关重要的。这使你不用阅读整篇代码来判断这是一个什么方法。在给自己的方法取名时应尽量不要太短或者太长,另一个需要注意的是大多方法使用动词(动宾短语)。

例如:
public void eat() {}
public void eatBananas() {}

Selector(选择器)方法有get前缀,后缀是它们将要get的,比如
public int getBananas() {}

Mutator(存取器)方法则有set前缀,后缀则是他们要set的,比如
public void setBananas(int amount) {}
注意mutators大多无返回值。

方法的参数应当以如下方式给出:
public void aMethod(type parameter1, type parameter2, ... , type parametern) {}

如果参数过长,也可以断开为几行,应对齐向下排列如:
public void aMethod(type parameter1, type parameter2,... ,
type parametern, type parameter n+1,... ,
type parameterm, type parameter m+1) {}

另外要注意类的左束括号应在方法的右束括号之后而非下一行:

public int aMethod() {
int i = 0;
if(i == 0)
System.out.println("success!");
}

为了文件可读性好,还要注意语句最好写在同一行,当然一行写不下是可以断行的,比如行字母超过80。

fields
比如变量,如果不希望它永久有效,应设为private。如果一个变量在类中不发生任何动作(比如数据结构中的node)则可以设置为public,常量一般声明为public。如果不能确定一个变量到底该声明为什么,应暂且声明为private。

field的名字一般使用小写字母,不要使用下横线或其他特殊字符。 如果变量包含两个字,那么第二个字的首字母大写。比如:

int i, j, k;
Date date;
double myField;

常量一般全部大写,也可以包含下横线:

public static final int MAX_SIZE_OF_DATABASE

fields的名字通常为名词。较重要的fields更应具备描述性,比如程序中包含一个游戏的得分,那可以用score来代表。如果变量变化较频繁,那使用一个单一字符来代表就ok了:

i, j, k 通常代表整数
r, t, u, v, w 通常代表实数
x, y, z 通常是并列出现或代表浮点数
s, s1, s2, 通常代表字符串
c, ch 通常代表字符
f, file 通常代表文件
tmp, temp 通常代表临时变量
ctr, cnt, cntr 一般代表计数器(如果i, j, k这些变量已被使用)
mmy, foo, bar 一般代表哑元变量
args 是main-method的主参数名

缩排与换行
每行长度不得超过80字符。如果需要可以折行时,也应当与上一行有共同的缩排距离。代码应如何交错、如何建立新行、在哪里建立允许、哪里不允许都有一些一般约定,缩排空格一般为2个或4个空格。

条件表达式
如果见到如下语法表达式:

if (expr)
statement1;
else
statement2;

代码行向右错排两个空格如上所示。

如果在一个表达式中有超过一条的声明,则需要大括号:

if (expr){
statement1;
statement2;
} else{
statement3;
statement4;
}

有时我们会希望在表达式中使用表达式(比如条件嵌套),这时应注意else表达式,它的位置很容易出错!如例:

if (expr1) {
statement1;
statement2;
} else if (expr2)
statement3;
else if (expr3) {
statement4;
statement5;
} else {
statement6;
statement7;
}

注意大括号位置!

Loops
while-loop语法如下:

while (expr) {
statement1;
statement2;
}

for-loop语法如下:

for (expr1; expr2; expr3){
statement1;
statement2;
}

注意大括号位置!仅一条声明时大括号省略:

while (expr)
statement;

for (expr1; expr2; expr3)
statement;

例如,我们写一个procere写出1到10这十个数字:

for (i = 1; i <= 10; i++)
System.out.println(i);

try-catch语法形如:

try {
statements;
} catch (ExceptionClass e) {
statements;
}

如果try-catch语句后跟随finally子句则形如:

try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}

新行
每一行最好只阐述一件事情。比如,一行包含一个声明、一个条件语句、一个循环等。不论多小,最好不要一行办两件事及以上。例如不要把一个if表达式或循环语句的主体放置在同一行,这样的表达式断行的易读性会更高。通常,互相协作的代码应放在一起,为保证代码美观可读,我们应将代码的不同代码段放置在不同的段落。不过要牢记断行不要太过分!比如:

public int factorial(int n) {
int result = 1;
for(int i = 1; i <= n; i++)
result*=i;

return result;
}

给自己的代码加入注释
注释就是类的描绘、方法存在的原因、它完成了什么以及它对它其中(变量)的作用域。假定阅读你代码的人已经知道这是什么语言,所以不需要注释语句功能,尽量使用简短而有描述力的注释。

Java有两种类型的注释:

//This is a comment that continues until the end of the line.

/* This is a comment. It goes on and on and on and on and on and on and on
and on and on and on and on and on and on and on and on and on and on and
on and on and on and on and on and on and on and on and ends like this: */

/**
* This is a JavaDoc comment. More about JavaDoc in the next section.
*/

如果在注释中加入注释则会出错:

/* You are not allowed to do anything like this /* because the compiler will
complain, if you are lucky */ DON'T DO THIS! And don't write comments in
upper case either... */

注释应放在它要解释内容上下,这样会让代码更易于理解。

不要注释一些语言的语句功能:
i++; // Add 1 to i

更不要让自己的代码处于这种状态:

for(int i = 1; i <= n; i++)
/* don't place comments where
they don't belong */
result*=i;

较短的注释既可被放在被注释代码上下,而长注释则习惯性的放在代码之上:

/* Comments can be placed before the
block that is to be commented */

for(int i = 1; i <= n; i++)
result*=i;

或者:
for(int i = 1; i <= n; i++){
result*=i; // short comments can be placed like this
tmp++; // if necessary, they continue here
}

不要写没用的注释:

i++; // change this later

Excuse me,这句肯定是胡扯!

不要写自己都看不懂的注释:

i++; // BMW

BMW? 如果你能连续十天记住这是什么意思的话,那么你的记忆真是不错了。所以不要写没人能看懂的注释,ok?

最后重申一下:写简短而富于描述性的注释,把它们放在该放的地方,而不要考验你自己的记忆力!

JavaDoc - 文档工具
JavaDoc不仅是另一种给代码加注释的仿佛咱,更是一个文档工具。类、方法和一些重要地方需要用JavaDoc来注释。这并不是说你可以放弃常规的注释,这两者在代码中应该是相辅相成、互相弥补的关系。

类被注释如:

/**
* Car represents cars ... A description of the class
* should be place here. Note that the description begins
* on the second line and that there is a space between
* the asterix and the text. Next we will add some fields
* indicating who the authors of the class are and
* other useful information. Notice the newline!
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {

注意JavaDoc结束和类开始间无空行。

方法被注释如:

/**
* A description of what the method does...
*
* @param n a description of the parameter
* @return a description of the return value
*/
public int factorial(int n) {

某些不是全部,被JavaDoc注释区域如:

/**
* Short description of the variable (one line)
*/
type variable;

什么应当使用JavaDoc做注释?如何注释的恰当呢?
可以这样想,JavaDoc中所作的注释都可以在类的文档中看到。所有读这个类的文档的读者都会明白这个类所完成的功能、它包括的方法、如何使用这些方法及方法的返回值。一些作用域,比如public的变量或常量将会一目了然。任何不了解这个类内部结构的人都可以轻松的调用它。这便是你用JavaDoc可以轻松提供的信息。而使用一般注释的地方,一般是给那些可能修改你的类代码的程序员,它们一般描述了类的内部信息和结构。

下面我写一下car的类来描述一个编程风格好的java类应该是怎样的。当然这仅仅是一个小例子(apart from selector and mutator methods),仅仅是在考虑JAVA编程风格上一个参考而已。

import java.awt.Color;

/**
* This is a class representing cars. A car has certain features, such
* as color, age, number of doors etc and a car can be repainted,
* the tank can be filled etc.
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {

/**
* The maximum size of the tank in litres.
*/
private static final double TANK_SIZE = 100.0;

/**
* The color of the car.
*/
private Color color;

/**
* The age of the car.
*/
private int age;

/**
* The number of doors of the car.
*/
private int doors;

/**
* The amount of gasoline in the tank.
*/
private double gasoline;

/**
* Class constructor, which constructs a brand new, black car with
* five doors and a full tank.
*/
public Car() {
this(Color.black, 0, 5, TANK_SIZE);
}

/**
* Class constructor specifying the color, age, number of doors
* and litres of gasoline
*
* @param color The color of the car
* @param age The age of the car
* @param doors The number of doors
* @param km Kilometres driven
* @param gasoline The litres of gasoline
*/
public Car(Color color, int age, int doors, double gasoline) {
this.color = color;
this.age = age;
this.doors = doors;
this.gasoline = gasoline;
}

/**
* Returns the color of the car
*/
public Color getColor() {
return color;
}

/**
* Repaints the car (i.e. changes its color)
*/
public void setColor(Color color) {
this.color = color;
}

/**
* Returns the age of the car
*/
public int getAge() {
return age;
}

/**
* Returns the number of doors of the car
*/
public int getDoors() {
return doors;
}

/**
* Returns the amount of gasoline in the tank
*/
public double getGasoline() {
return gasoline;
}

/**
* Fills the tank. The amount of gasoline cannot exceed
* the size of the tank. In that case, the tank will be
* filled to the maximum and the rest will run out in
* the sand.
*
* @param gas The amount of gasoline to put in the tank
*/
public void setGasoline(double gas) {

if(gasoline + gas <= TANK_SIZE)
gasoline+=gas;
else
gasoline = TANK_SIZE;
}
}

⑹ 如何将Java源代码进行分行麻烦告诉我

一些企业在招聘程序员的时候,总会特意提出一个要求,即要求具有良好的编码规范。确实现在程序开发人员已经不在是单枪匹马的单干,而是讲究团体作战。此时就要求团队内的乘员都可能够恪守代码的编写规范,这对于乘员之间共享代码、排错等作业都具有非常现实的意义。这在Java语言中当然也不例外。笔者借这次机会,就跟大家分享一下Java源代码的折行规则。虽然这基本不涉及到功能层面的内容,但是对于提高代码的阅读性却有不可替代的作用。
一、代码的最大长度。
虽然在Java的编译器中对于代码的最大长度没有硬性的规定。但是如果代码的长度太长,超过了编译器的最当行宽,显然阅读起来比较麻烦。为此根据笔者的经验,通常情况下Java源代码的行长度不应该大于80个字符。如果超过这个长度的话,在一些开发工具和编辑器上就无法很好的显示。如需要通过滚动条来显示后面部分的代码。当其他项目成员阅读这超长的代码时,就会看得眼花缭乱。当人的温饱问题解决了之后,就需要开始注意美观方面的问题。所以程序开发人员在开发应用程序的时候,要尽量避免书写长的代码。如果代码的每行长度确实需要超过80个字符的话(最好将每行代码的长度控制在70个字符左右),那么就需要对代码进行分行。
二、在恰当的地方对代码进行分行。
笔者建议将Java源代码每行的长度控制在70个字符、最大不超过80个字符。当超过这个字符长度的时候,开发人员就需要考虑在恰当的地方对他们进行分行处理。不过这个分行也不是说开发人员想在哪里进行分行就在哪里进行分行。这个分行是有一定技巧的。虽然这些技巧大部分并不是强制性的规定,但是都是一些专家们的经验总结,可以提高代码的阅读性。为此笔者希望各位程序开发能够严格的遵守。
技巧一:高层折行优于低层折行。
这个技巧是说,在考虑对代码进行折行处理的时候,需要注意代码的层次性。如某段代码涉及到混合四则运算,而四则运算又有明显的运算顺序,此时对代码进行折行时就最好能够在四则运算的关键顺序上进行折行处理。如现在有如下的一段代码:
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)+8*mynum5
如果要对这段代码进行折行的话,该在哪个地方加入一个折行符号呢?如果是笔者处理的话,笔者会按如下的格式对代码进行折行处理。
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)
+8*mynum5
这主要是根据四则运算的运算层次来进行折行的。显然,*符号的优先级要比+符号要高。所以在+号前面对其进行折行处理,那么就可以一目了然的反应出代码的运算层次。可以大幅度的提高代码的阅读性。所以代码折行的第一个技巧就是高层折行优于低层折行。如此的话,可以使得应用程序的结构代码更加的清晰,更容易被团队成员所理解。
技巧二:在运算符前面进行折行处理。
其实在如上的折行技巧中,还隐藏着一个规则,即在运算符之前进行折行。如上例所示,笔者就是在+号前面进行折行,而不是在+号后面进行折行处理。这主要也是考虑到代码的可读性。如上面这个例子中,如果在+号后面进行折行处理的话,则下一行就会给人一种凭空多出来的感觉,显得代码很不连贯。跟这个规则类似,如果在折行处理的时候遇到逗号时,那么最好能够在逗号后面进行折行。如在一个方法中,需要传入5个参数。此时如果代码行比较长,那么就需要在几个参数之间进行折行处理。此时最理想的折行位置,就是在某个参数的逗号后面。注意,使在逗号后面进行折行,而不是在逗号前面。因为一个参数一个逗号是匹对的。而如果一个逗号加一个参数,则让人看起来很不舒服。
技巧三:这行代码的对起方式。
当不得已对代码进行折行处理时,下一行的代码应该与其同等级的代码行左对齐。如上例所示,在+号前面将某一段四则运算公式进行折行处理的时候,其+号符号已经采取缩进处理。其缩进后的效果就是要与其同等级的代码行左对齐。如此的话,明眼人一看就知道这段代码采取过折行处理;而且跟上一行代码的层次关系。当一段代码被分割成三行甚至跟更多行数的时候,这个规则会非常的有用。如果能够严格遵守这个规则,即使将代码分割成多行,看起来也不会觉得那么混乱。反而给人一种比较有层次的感觉。
另外在采取缩进处理的时候,可以利用Tab键来提高缩进处理的效率。因为直接按空格的话,有可能空格字符数量不一致,会让人觉得层次不起,产生比较大的混乱。一般情况下,当代码行两侧距离页边的距离比较大,看其来不怎么舒服时,可以在代码行中通过插入TAB键(会在代码行中连续插入8个字符)来提高代码的阅读性,让代码的缩进实现统一。
技巧四:为变量寻找一个合适的位置。
在编写应用程序时,尽量将变量声明放置在一个代码块的开始处,也就是说{}花括号的开始位置。虽然说可以在需要使用变量的时候再对其进行声明。但是笔者不同义如此操作。因为如果在的呢感到使用变量的时候再来声明变量时,会降低代码的可读性。同理,也需要避免低层声明与高层声明重复,这样会引起代码混乱并可能引发程序功能性错误。而且这种错误在后续的排错中很难被发现。为此要在应用程序开发的时候就要尽量避免这种错误。
在声明变量的时候,有时候可能代码很简单,生命变量的行总共加起来也不会超过十个字符。此时能否把多个变量的声明写在同一行呢?从就技术上来说,这是可行的。也就是说,Java编译器允许将多个变量定义在同一行上。但是从阅读性上来说,这并不是很好的做法。笔者的建议是,即使变量定义再简单,或者变量比较多,也最好分行进行变量的声明。也就是说,一行声明一个变量。这可以提高代码的可阅读性。而且有时候往往需要对变量加一个注释说明变量的用途,如果以行定义一个变量,添加行注释也相对简单许多。
总之,以上的这些折行的规则基本上不会影响到代码的运行。但是,对于代码的维护与后续的排错、升级、二次开发等等具有不可忽视的作用。而且现在基本上应用程序开发式团队开发,故大家都遵守同样的代码编写规范是非常重要的。笔者在开发一个应用程序的时候,事先都会花一定的时间,跟项目成员强调这些折行的规则。目的只有一个,就是提高代码的可读性,便于后续代码的共享与维护。毕竟后续面对这些代码的,并不是客户,而是我们自己。我们程序员在编写代码的时候,不能够搬起石头砸自己的脚。笔者认为,现在一个合格的程序人员,不仅技术功底上要过得硬,而且还必须要遵守这些无形规则的约束。难怪现在这么多企业在挑选程序开发人员的时候,都会注明良好的编码规范。现在对于这些无形中的条条框框,项目经理已经开始重视起来。

⑺ 自学JAVA

最近论坛上看到好几个朋友都在问,如何学习 Java的问题,“我已经学习了J2SE,怎么样才能转向J2EE?”,“我看完了Thinking in Java, 可以学习J2EE了么?”。于是就有了写这篇文章的想法,希望能帮助初学者少走一些弯路。也算是对自己几年来学习Java的一个总结吧。

在开始之前有必要再讨论一下J2ME,J2SE,J2EE这些概念。J2ME,The Micro Edition of the Java 2 Platform。主要用于嵌入式Java,如手机,PDA等等。J2SE,Java 2 Platform,Standard Edition,我们通常所说的JDK(Java Development Kit)包含在此,是J2EE的基础。J2EE,Java 2 Platform,Enterprise Edition,就是所谓的企业级Java。这些只是从API级别上的划分,实际上Sun给J2EE的定义是:开发基于组件的多层的企业级应用的规范。也就是为各种不同的技术定义一个Java的规范,使这些不同的技术结合起来,在Java平台上构建强壮的企业级应用。从这一点来看,J2EE这个概念应该是涵盖J2ME,J2SE的。比如一个典型的J2EE应用,网上商店,它支持web方式下订单,也支持手机下订单。显然必须用到J2SE,J2ME。所以也就不存在所谓的从J2SE转向J2EE的问题了,只是后者包含的范围更广而已。

来看看Sun给出的J2EE 相关技术主要分为几大块。

1. Web Service技术

- Java API for XML Processing (JAXP)

- Java API for XML Registries (JAXR)

- Java API for XML-based RPC (JAX-RPC)

- SOAP with Attachments API for Java (SAAJ)

2. 组件模型技术(Component Model Technologies)

- Java Servlet

- JavaServer Pages

- JavaServer Faces

- Enterprise JavaBeans

- Java Message Service

- J2EE Connector Architecture

3. 管理技术(Management Technologies)

- J2EE Deployment Specification

- J2EE Management Specification

- J2EE Client Provisioning

- Java Authorization Contract for Containers

4. 其他相关技术(Other J2EE Technologies)

- JDBC

- Java Data Objects (JDO)

- CORBA (Java IDL and Java RMI-IIOP)

- JavaMail

- Transactions

如此之多的技术难免使初学者无所适从,望而却步。即使是一位经验丰富的J2EE开发者,又有几个人敢说J2EE相关的技术我都熟练掌握了。不过作为一名普通J2EE应用程序的开发者来说,我们只需要重点学习其中的一部分技术就可以了,对于其他部分只要做到心中有数,哪天需要用到了知道跑哪里去找到资料就行了。以我个人的观点,下面这些技术是一般J2EE应用开发人员所必须熟练掌握的。Java Server Page,Java Servlet,Enterprise JavaBean,JDBC,Transactions。还有JAXP等XML相关技术,Java Message Service,Java Mail,JDO等等是最好应该掌握的。其他Management Technologies,Connector Architecture等等主要是给容器提供商中间件提供商参考的,应用开发者不需要怎么关心,等用到了再去学习也不迟。

语言学习篇

首先是J2SE基础。学习一门新技术,无外乎阅读和实践了。而一本好的参考书对于初学者来说显得格外重要。现在市面上的 Java书籍可以说是铺天盖地,质量也是良莠不齐,令初学者无所适从。所以还是先推荐几本书籍吧。目前对于Java基础知识,大家一般都比较推荐两本书<>和<< Core Java? 2, Volume I: Fundamentals >>。第一本书不必多说了,Bruce Eckel的大作,Jolt获奖书籍。内容比较全面,基本涵盖了java语言的方方面面。这本书提供了相当丰富的例子,非常有利于对学习内容的了解。另外书中第一部分对于OO基本书籍的介绍,我觉得对于刚接触OO的人来说帮助会很大。而且此书是Open Source的,可以从作者网上下载http://www.mindview.net/Books/TIJ/而对于习惯于读中文版的学习者来说,侯捷翻译的中文版是不错的选择。要说这本说的缺点可能就是对于初学者来说厚了一点,这也是一些人并不推荐此书作为初学者学习用书的原因吧。后面一本<< Core Java? 2, Volume I: Fundamentals >>。目前已经是第七版了,单从它出版的次数来看也可以看出此书受欢迎的程度,这本书特点也是讲述比较全面系统,基本上一路啃下来的话Java语言基础应该算过关了。缺点也是太厚了,有点像参考手册,前面部分花了不少篇幅讲Swing和Applet,可能对初学者不是很有用。还有一些像<< Java in a nutshell>>也是比较不错的基础书籍。

学习了基本的语言基础,别忘了最重要也是最有用的资料还是JDK文档。从你学习java的第一天开始JDK文档应该是常备手头了。如果你碰到问题首先想到的是到论坛上去提问而不是查阅Jdk文档,那先别继续往下学习了,学会查JDK文档先。不夸张的说在我们的初学者论坛中60%的问题是光查一下JDK文档就能解决问题的。最新JDK Documentation下载地址http://java.sun.com/j2se/1.4.2/download.html(目前最新版是J2SE5 http://java.sun.com/j2se/1.5.0/download.jsp)不能光说不练,同一下载页面把JDK给下载回来。安装完后有一点我想提一下,安装路径下有一个src.zip(有些jdk版本是src.jar),好东西啊---JDK源代码,老是有人在论坛上问哪里有JDK源代码下载,你说东西就放在你家里还到处找。有了这个有些问题就需要在论坛上跟人家争来争去了,翻开源代码瞧一下什么疑问都没有了。几个最重要的命令行工具是

javac: 编译源文件到class文件

java: 运行class

jar: 打包工具。

javadoc: 生成java doc的工具。

对于初学java的人来说,我不推荐使用IDE而直接用文本编辑器,然后用命令行编译运行。这样有利于理解CLASSPATH,PATH这些最基本概念。CLASSPATH是初学者比较容易感觉迷惑的地方。现在的IDE太聪明了,给个名字就给你自动生成java source code,自动编译。可能你运行完了你的第一个Hello World程序,还不知道java和javac是用来做什么的。至于实际的项目开发,一款合适的IDE还是十分重要的,我们稍后再对java开发工具做一些介绍。

J2EE基础和Java语言进阶

学习完语言基础,就可以比较自然地转入J2EE实际技术的学习了。J2EE实在是比较庞杂,而EJB,Servlet,这些核心技术是作为每一个J2EE开发人员所需要掌握的。关于servlet,我比较推荐<>和<>,第一本是Sun推荐的Servlet教材。第二本是当年Amazon最畅销Java书籍,五星级书籍。这本书机械工业出版社有中文版叫<<与JSP权威指南>>,感觉翻译得还可以,第二版好像还没有看到有中文版。两本书都全面系统地介绍了JSP和Sevlet知识,从web服务器配置,JSP,Servlet基本编程,标记库(Tag Lib),过滤器,事件框架都有很好地描述。提供地例子也比较实用。对于EJB学习,比较着名有两本书,<< Enterprise JavaBeans, 3nd Edition>>和<< Mastering Enterprise Java Beans Third Edition>>,两位作者Richard Monson,Ed Roman都是属于业界重量级人物。而Richard Monson本身就是EJB规范专家组成员。对我来说,两本书难分优劣,第二本书有个好处就是可以免费下载http://www.theserverside.com/books/wiley/masteringEJB/index.tss。

还是那句话,不能光说不练,不过J2EE的练习做起来有一点麻烦,应用服务器是不可少的,最好还得准备个轻量级的数据库。下面简单介绍一下这些工具。

web服务器(Servlet Container)方面有。

Tomcat: http://jakarta.apache.org/tomcat/

Jetty: http://jetty.mortbay.org/jetty/

应用服务器常用的有,

Jboss: http://www.jboss.org/procts/index

Weblogic: http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/procts/server

WebSphere: http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&S_CMP=DLMAIN。

Tomcat,Jetty,Jboss都是Open Source。Weblogic和WebSphere是J2EE服务器中的老大级人物,价格也不菲。不过对于开发者有免费的试用版下载。

如果单单只是学习Servlet,推荐使用Tomcat,它是Sun官方指定的Servlet,JSP规范的参考实现。对初学者最重要的是它使用比较简单,自带文档比较齐全,使用者众多,有什么问题容易在论坛上面得到帮助。如果学习EJB的话,推荐使用Jboss,不仅仅是因为它是Open Source的,主要是配置比较简单,使用方便。比如说对于连接数据库,对于常用的MySQL,Oracle,MS SQL等等都提供了Sample Config文件,直接拿过来做些小改动扔到Deploy目录下就可以用DataSource了,部署J2EE应用也简单,把整个.ear或者.war扔到deploy下就可以了。唯一不方便的地方是从Jboss3.0开始,它的文档开始收费了。但是对于一些基本的配置,在网上还是非常容易找到的,毕竟它太流行了。至于Weblogic,也比较容易使用,不过比起Jboss来个头大了很多,通过强大的管理界面使得一些常用的配置工作变得十分简单。和Jboss比起来它的文档就太多了,简直是有点罗里八嗦,比如要部署一个.ear文件,一般我们也就是直接扔到domain下的applications目录下就会自动deploy了,但是要看它的文档可是长篇大论,容易吓着初学者,以为这又是什么高深的学问。至于WebSphere,个人不推荐初学者使用,相比前俩个Server比较难使,而且狂吃内存。不过在企业级市场这个家伙表现不俗,毕竟是出生于IBM这样的豪门。

数据库方面,目前常见的主要有PostgreSQL,MySQL,Oracle,MS SQL,DB2等等。前面两个是开源数据库,后面几个基本上垄断着大部分的数据库市场。对于初学者用来做做EJB,JDBC的练习,我推荐MySQL,理由还是很简单,开源软件不要钱,个头小使用方面,用户众多文档齐全。下载地址http://www.mysql.com/procts/mysql/。PostgreSQL也可以考虑,不过国内使用者远不如MySQL多,所以要在论坛上问起问题来就少方便一些了,下载地址http://www.pervasive-postgres.com/downloads/。至于后面那些比较重量级的数据库,为了做做练习而言就不用考虑了, 咱也花不起这个钱啊。

学习完J2EE的这些具体技术,这个时候进行基本的J2EE开发应该是不成问题了。此时应该考虑提高自己的代码质量了。这里我强烈推荐Martin Fowler的<>,这本书不是一本非常实际的书,作者完全是手把手地教你如何提高代码质量,从具体地代码中告诉你什么是代码的Bad Smell,如何去掉这些Bad Smell。不少书评是这么说的,这本书对于初级,中级的读者帮助是立杆见影的。至少就我接触到的几个学习编程不久的程序员,编码质量在短期内都有很大提高。当然重构(Refactoring)这一概念并不只针对Java语言的,它对所有OO语言都是适用的。重构的概念是如此深入人心,以至于今天几乎所有流行的IDE工具都有对重构的支持。这里我还想再推荐一本<>。从C++过来的程序员都知道<>在C++领域的地位,至今还流传着这样的趣话,C++程序员分为两种,一种是读过<>的,另一种是没有读过C++的。虽然这本<>在Java领域的影响也许没有那么大,但对于Java程序员绝对有相当的指导价值。作者是Sun公司的Joshua Bloch,java Collection framework的设计者。作者站在JDK设计者的角度向你介绍他的Best Practice,应该这样做而不应该那样做,对于JDK中某些API设计的缺陷他也毫不袒护的指出。Java语言之父James Gosling为此书写的前言是这么说的“I sure wish I had had this book ten years ago。 Some might think that I don't need any Java books, but I need this one”。这本书会让你觉得原来你对Java还是有很多东西不了解的。举个例子来说,对象的equals方法,我们认为它很简单,也许你每天都在为你新写的Class重载这个方法,但是你在重载的时候注意过“自反”,“对称”,“传递”这些必须要考虑的因素,你是否同时还小心谨慎的重载了hashcode这个方法?如果没有,建议你要读一下这本书。读完这本书,你会觉得离Java的距离更近了。上面两本书都出过中文版,后面一本<>还有两个版本的中文版,第一次翻译的比较差一点,后来机械工业出版社又委托潘爱民先生重新翻译了一遍。同一本书在同一个出版社连续被翻译了两次也说明国内出版界对这本书还是比较重视的。

这个阶段,在看书的同时,可以结合着学习一些优秀的开源项目的源代码。这些开源项目的代码风格,注释都是值得借鉴的。实在太懒也别忘了手头上还有个Jdk的源代码。其实也不用刻意去找源代码,在实际的J2EE项目开发中,基本上都会用到一些优秀的开源项目。Framework可能会用到Spring,Struts,Log机制基本上都会JarkartaCommons Log或者Log4j,单元测试会大多会用Junit,结合项目阅读一下其中的一些源代码,既可以提高自己又对项目会有所帮助,说不定因此而得到PM的赏识呢。一举两得,何乐而不为呢。呵呵,有点扯远了。过了初学者阶段,该学会如何找到适合自己的Java书籍了。历经数十载,今天的Java技术已经变的如此之庞杂,我相信即使穷净一个人毕生之精力也不可能把Java所有的相关技术都学通,何况新技术还在层出不穷地推出,3年之前谁会知道Struts会成为Web框架事实上的工业标准。2年之前谁会知道Hibernate会在今天独领风骚。既然已经不能指望一次性把java技术的方方面面都学个通,在实际中也只能是需要什么技术再学习什么技术了。而能否选择一本好的参考书籍带来的就是事半功倍和事倍工半的效果。所以我觉得花点时间放在选择书籍上面还是很值得的,否则你在后面只会花更多的时间。下面我谈谈自己选择书籍的一些经验,不一定正确。首先看作者,像上面提到的那些书的作者,都是业界鼎鼎大名的,选择他们的书一般错不了。大家看的书多了,自己胸中自然也会有一个list,哪些作者是信得过的。二看出版社,计算机书籍方面,Oreilly,Addison-Wesley都是公认比较好的出版社。对于目前比较流行的Java技术,Oreilly的< in Action>>系列是不错的选择。另外我还会去看看Amazon网站(http://www.amazon.com/)的书评,一般小于3星级的书我都不会考虑。还有一个好去处theserverside,http://www.theserverside.com/的书评,这里的书评比较有趣,往往都有很激烈的争论,里面经常会看到一些名人在发言。我要向所有Java学习者推荐,如果我的收藏夹里面只能存放两个网站,我会选择java.sun和theserverside。在这里你可以了解最新的Java动态,可以学习第一手的Java资料,可以看到Java高手们(里面不乏业界大腕)激烈辩论。in Action>>

到此阶段,Java Developer的基本功底应该算是打好了吧,往后就是不断学习喽。结束这一段之前,最后再介绍一本书Oreilly的<, Second Edition >>,因为我觉得多线程编程属于Java基本功,每一个想学好Java的人都应该好好掌握。

提高篇

在这个阶段应该从软件架构,Framework层次上来学习了。作为面向对象的圣经<>, 这本书是不得不推荐的。不用再多说了,这本在面向对象领域地位完全是属于教父级别的。不管你学习的是什么OO语言,不管你现在是用.Net还是J2EE开发,这本书都是你进阶之路上的必读之书。而<>则专门针对于J2EE来讨论设计模式,书中Sun Java Center的资深设计师描述了J2EE关键技术的模式。最佳实践,设计策略和经过验证的解决方案。对于每一个希望成为J2EE 架构师或者设计师,这本书值得一读。学习设计模式的时候,建议是结合实际的源代码来看,比如看看Junit源代码,你可以看到很多设计模式优雅的实现,作者之一Erich Gamma本身就是<>的作者。至于J2EE的设计模式,Sun还开辟了专门的空间http://java.sun.com/blueprints/patterns/,里面有对常用模式的讨论又提供了详细的源代码样例。正如Grady Booch所说,模式对于普遍问题提供了通用的解决方案,利用模式就等于拥有一个强大的专家队伍。如果你还没有学习,现在就开始吧。此外对于面向对象方法论,极限编程的思想也应该有所了解http://www.extremeprogramming.org/。对于J2EE项目的具体实施,Rod Johnson的<>也很有价值,该书以作者丰富的实战经验向我们展示如何用尽可能简单的解决方案构建J2EE 应用,书中作者第一次提出这样的观点,很多时候,J2EE应用完全没有必要用到EJB,对于言必称EJB的广大J2EE开发者来说,怎么说也有点惊世咳俗的味道。当然,作为Servlet和JDO两个专家组的成员,这可不是作者信口胡驺的。今天风靡Java世界的Spring框架最初便是源于此书,而IOC,AOP等概念更是被时下的java开发者挂在嘴边。最后,作为对Java的深入学习,Java技术的各个Specification也有必要一读。暂时就写到这里吧。

⑻ java简单编程题,有追加分

第一题,x和n从命令行作为参数输入:
public class Test1{
public static void main(String[] args){
int argLen = args.length;
//判断是否至少传入了两个参数
if (argLen < 2){
System.out.println("请输入两个整型参数");
return;
}

int x = 0;
int n = 0;

//转换传递进来的参数,如果输入的参数不合法,不能转换为int型,则Integer.parseInt方法会抛出NumberFormatException异常
try{
x = Integer.parseInt(args[0]);
n = Integer.parseInt(args[1]);
}
catch(NumberFormatException e)
{
System.out.println("输入的参数不是整数");
System.exit(1);
}

//判断x和n的值是否是正数
if (x<=0 || n<=0)
{
System.out.println("不能输入负值或0,请输入两个正整数");
System.exit(1);
}

//打印转换后的x和n
System.out.println("你输入的x和n分别为: " + x + ", " + n);

/*
y=1+x/1+x*x*x/3+......+x^n/n
根据公式计算结果。由于公式中y增长的很快,所以我们定义一个double型的变量存储结果的值。但仍然很有可能溢出。必要的话可以使用math包中的类来进行任意长度和精度的处理,但这里就不麻烦了。
*/
double y = 1.0;
for (int i=1; i<=n; i+=2)
{
y += Math.pow(x, i)/(double)i;
}

//打印结果
System.out.println("根据公式y=1+x/1+x*x*x/3+......+x^n/n所计算出的结果为: " + y);

} // main()

} /* Test1 */

第二题,需要的test11.html文件内容如下:
<html>
<head>
<title>Test11 demo</title>
</head>

<body>
<applet width="300" height="400" code="Test11.class"></applet>
</body>
</html>

然后使用appletviewer test11.html浏览小应用程序(在浏览器中可能不能正常运行)。

java代码如下:

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Label;

public class Test11 extends Applet{

//定义文字所在位置与顶部的距离
private int posY = 200;

private Label textsLabel = new Label("我猜你将看到这句话一直在滚动");

public void init()
{
textsLabel.setBounds(50, 200, 200, 30);
this.add(textsLabel);

//启动新线程
SecThread st = new SecThread();
st.start();
} // init()

public void paint(Graphics g){
super.paint(g);
} //paint()

//定义一个内部类,以启动一个新的线程
private class SecThread extends Thread{
public void run()
{
while(true){
//让当前线程休眠50毫秒,注意sleep方法会抛出InterruptedException异常
try{
Thread.sleep(50);
}
catch(InterruptedException e){
System.out.println("执行过程中出错");
System.exit(1);
}

//设置文字的新位置
posY -= 5;
//判断是否小于0(即已经到达顶部),如果小于0则重置为400
posY = (posY<=0?400:posY);
textsLabel.setBounds(50, posY, 200, 30);
Test11.this.repaint();
}
}
}

} /* Test2 */

3, 4两题实在很简单,略过了。

找到你的帖子了!
将3,和4也写一下:

3.运行方法看2:

import java.applet.Applet;
import java.awt.Graphics;

public class Test111 extends Applet
{
public void paint(Graphics g)
{
for (int i=1; i<=10; i++) //画横线
{
g.drawLine(20, i*20, 200, i*20);
}

for (int j=1; j<=10; j++) //画竖线
{
g.drawLine(j*20, 20, j*20, 200);
}
}
}

4. 代码如下:(你说已经写好的程序怎么改成applet。记住一点,applet在运行时自动调用init、start和paint方法,而通常的应用程序调用main方法。只要将main方法中的内容妥善地移到这三个方法中就可以了。但修改的时候要注意,不要引入错误。)

//任意输入三个数,可以有小数,然后比较它们的大小
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Button;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;

public class Test1111 extends Applet
{

public void paint(Graphics g)
{
this.setLayout(null);
Button btn = new Button("开始输入");
btn.setBounds(100, 130, 100, 30);
btn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
sort();
}
});

this.add(btn);
}

private void sort()
{
//3个元素的字符串数组,存放输入的数
String[] numberStrs = new String[3];

for (int i=0; i<numberStrs.length; i++)
{
//如果输入时按了取消按钮,则继续提示输入
while(numberStrs[i] == null)
{
numberStrs[i] = JOptionPane.showInputDialog("请输入第 " + (i+1) + " 个数");
}
}

//定义3个元素的double型数组,存放转换后的值
double[] numbers = new double[3];
try
{
for (int j=0; j<numbers.length; j++)
{
numbers[j] = Double.parseDouble(numberStrs[j]);
}
}
catch(NumberFormatException e)
{
JOptionPane.showMessageDialog(null, "输入的不是数字!"
, "ERROR", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}

String result = "";

result += "你输入的数字为: ";
for (int k=0; k<numbers.length-1; k++)
{
result += numbers[k] + ", ";
}

result += numbers[numbers.length-1] + "\n";

//简单点,使用冒泡排序
for (int i=1; i<numbers.length; i++)
{
for (int j=0; j<numbers.length-1; j++)
{
if (numbers[j] > numbers[j+1])
{
double temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}

result += "排序后的数字为: ";
for (int k=0; k<numbers.length-1; k++)
{
result += numbers[k] + ", ";
}

result += numbers[numbers.length-1];

//输出结果
JOptionPane.showMessageDialog(null, result, "Result", JOptionPane.PLAIN_MESSAGE);
}
}

⑼ 编程高手帮忙看个java代码

你的while语句中的判断有问题:你写的是(s1 = br1.readLine())!=null&&(s2 = br1.readLine())!=null
你两个判断的都是br1,应该改为:(s1 = br1.readLine())!=null&&(s2 = br2.readLine())!=null

阅读全文

与编辑距离java相关的资料

热点内容
Python红色五角星画法 浏览:337
压缩饼干翻译 浏览:686
macos命令行窗口的样式 浏览:248
androidflipboard 浏览:878
投资公司投资源码 浏览:74
python语料训练 浏览:338
武夷岩茶产地溯源码 浏览:383
求生组队用什么服务器最好 浏览:24
php回调匿名回调函数 浏览:107
源码翻译软件哪里找 浏览:523
邪恶程序员解说 浏览:600
医生找程序员 浏览:423
cad三维剖切命令 浏览:55
压缩机的气能流多远 浏览:85
linuxfdiskt 浏览:696
iphone没有id怎么用app 浏览:983
手机淘宝网站源码 浏览:743
小车上的压缩机怎么改气泵 浏览:568
免费云服务器任务 浏览:211
苹果怎样在手机上做压缩文件 浏览:644