第一篇:java应用程序的开发小技巧[范文模版]
java应用程序的开发小技巧
假如你是一名Java开发者,正在开发和维护包含2000个类并使用了很多框架的应用程序。你要如何理解这些代码呢?老师说到整篇文章的重点在于,对项目进行必要了解,然后进行快速交付。你可以在不降低代码质量的前提下做到这一点。
第一不要试图一下子搞懂整个项目
仔细考虑一下,为什么你会想要先理解项目代码呢?大部分情况是有人要求你修复一个bug,或者增强系统已有功能。你要做的第一件事情不是理解整个项目的架构。当对项目进行维护时,这样做(理解整个项目架构)可能会对你造成巨大的压力。
即便是有10年编程经验的Java开发者,也无法理解项目的核心工作机制,尽管他们可能已经在这个项目工作超过一年(假设他们并非最初的开发人员)。比如,对于认证机制或事务管理机制还是缺乏确切的认识。
第二关注于尽快交付价值
所以交付能够将事情变得简单。不要认为在做有价值的交付前,你必须理解整个项目。这是完全错误的。加一段javascript的验证代码对业务就很有价值,经理能够通过你的交付对你更加信任。这样能够向上级领导证明你的贡献以及员工价值。
日复一日,在不断修复bug及增强功能之后,你就能够慢慢开始理解项目架构。不要低估对系统方方面面理解时需要花费的时间。花3到4天理解认证机制,2到3天理解事务管理。这些都是依靠之前的相似项目的经历,但关键还是要花时间才能透彻的理解。要在日常工作中挤出时间,不要向经理要求特定的时间来做这些。
第三.维护大型项目所必须的技能
你能从事当前的工作,必然已经具有良好的java技术。我们来谈谈能够让你在新项目中良好表现的其他技能。大部分时间里,你在项目中的任务是修复bug和增强功能。
有两项很重要的技能能够在你维护大型项目代码起到帮助。
3.1能够迅速发现需要的类
在任何维护活动中,无论是修复bug或增强功能,第一件事情就是识别出当前修复或增强的用例中调用的类。当你定位到需要修复或增强的类/方法,就已经完工了一半。
3.2能够分析变更的影响
当你在完成必要的修改或增强工作后,最重要的就是要确认你的修改没有破坏代码的其他部分。你要用你的java技术及对其他框架的理解找出变更可能影响的部分。
在典型的Java企业项目小组中,大部分能够帮你的高级工程师看起来都很忙,文档也很少。你需要尽快交付成果,并向项目组证明自己的能力。你会如何处理这种状况呢?
第二篇:Java XML的开发技巧总结
首先出场的是 DOM(JAXP Crimson 解析器)
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 SAX。
Bean文件:
package com.test;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File(“data_10k.xml”);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName(“VALUE”);
for(int i=0;i<nl.getLength();i++){
System.out.print(“车牌号码:” + doc.getElementsByTagName(“NO”).item(i).getFirstChild().getNodeValue());
System.out.println(“ 车主地址:” + doc.getElementsByTagName(“ADDR”).item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
System.out.println(“运行时间:”+(System.currentTimeMillis()lasting)+ “ 毫秒”);
}
public void characters(char ch[], int start, int length)throws SAXException {
String tag =(String)tags.peek();
if(tag.equals(“NO”)){
System.out.print(“车牌号码:” + new String(ch, start, length));
}
if(tag.equals(“ADDR”)){
System.out.println(“ 地址:” + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs){
tags.push(qName);
}
}
10k消耗时间:110 47 109 78
100k消耗时间:344 406 375 422
1000k消耗时间:3234 3281 3688 3312
10000k消耗时间:32578 34313 31797 31890 30328
然后是 JDOM http://www.xiexiebang.com/
JDOM 的目的是成为 Java 特定文档模型,它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型,JDOM 一直得到大力推广和促进。正在考虑通过“Java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 JDOM 开发。
JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
JDOM 文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM 或 JDOM 接口都更有意义的工作。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。
Bean文件:
package com.test;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]){
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File(“data_10k.xml”));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++){
System.out.print(“车牌号码:” +((Element)allChildren.get(i)).getChild(“NO”).getText());
System.out.println(“ 车主地址:” +((Element)allChildren.get(i)).getChild(“ADDR”).getText());
}
} catch(Exception e){
e.printStackTrace();
}
System.out.println(“运行时间:” +(System.currentTimeMillis()lasting)+ “ 毫秒”);
}
}
10k消耗时间:109 78 109 31
100k消耗时间:297 359 172 312
1000k消耗时间:2281 2359 2344 2469
10000k消耗时间:20938 19922 20031 21078
JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript 中使用 DOM)。
SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
无疑,DOM4J是这场测试的获胜者,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,那就采用DOM4J吧!
第三篇:五子棋网络应用程序开发 课程设计
网络应用程序开发报告 概述
游戏说明
五子棋在我国的历史可谓是源远流长,喜爱它的玩家也是大有人在,是很多人的娱乐首选,也是一种竞技项目。但很多的五子棋软件一般都是单机版的,游戏无法在两个玩家之间进行。基于上述原因,五子棋作为一个古老而又有广泛群众基础的游戏,他的完善性无疑是家玩家有很大的影响在互联网迅速发展的今天,五子棋的流行已经不仅仅只是在现实生活中的面对面的娱乐竞技,在网上也已经是广大玩家的首选娱乐游戏。为适应当今社会五子棋软件化的需求,通过对一般的五子棋软件进行设计,通过本设计希望能在五子棋的软件发展上起点微不足道的推动作用。实现当今社会五子棋软件化的需求。软件设计采用visual studio2008版作为开发平台,运用软件工程的分析和编写方法,收集主要相关文献资料,对系统作详细的分析和设计,实现五子棋的基本功能需求,达到一般五子棋的游戏功能和规则设置。在设计上,主要解决的问题有五子棋的各个方向判断胜负算法的分析,以及五子棋中“聊天,重新开始”等基本功能的实现。
需求分析
一款游戏项目的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求或者是出于公司自身发展和实力的情况,其中玩家的实际需求也就是说市场需求最为重要.面对游戏拥有不同知识和理解层面的玩家,项目的负责人(或者游戏制作人)对玩家需求的理解程度,在很大程度上决定了此类游戏开发项目的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给参与项目开发的每个成员,保证开发过程按照满足玩家需求为目的正确项目开发方向进行,是每游戏开发项目管理者需要面对的问题...而作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考
虑到玩家在游戏时的舒适 实现
2.1 设计思路
2.2 具体实现 2.2.1 界面设计
界面主要分四大部分:棋盘、ip地址、棋子选择和聊天窗口,程序运行开始,先要输入要连接的主机ip地址,然后选定棋子颜色,就可以下棋了。输入文本的控件我选择了comboBox空间,在其下拉表中预先输入一些常用的语句,如:你好,嗨等,这样方便聊天。聊天记录窗口我用了listBox,当聊天内容比较多时,会自动添加滚动条,便于用户阅读聊天信息
2.2.2按钮功能实现
(1)重新开始按钮 public void Restart()
{
radBlack.Enabled = true;
radWhite.Enabled = true;
for(int i=0;i for(int j = 0;j < Level;j++) { pic[i, j].Image = Image.FromFile(“Board.jpg”); flag[i, j] = false; doubleFlag[i, j] = false; } this.AllowClick = true; } private void button2_Click(object sender, EventArgs e) {this.Restart();}(2)发送按钮 private void btnSend_Click(object sender, EventArgs e) { String ForeStr = “rn” + txtSelfIP + “【” + DateTime.Now.ToShortDateString()+ “ ” + DateTime.Now.ToShortTimeString()+ “】:rn”; this.Sender.send(txtIP.Text.Trim(),txtSend.Text.Trim(), 12001); txtShow.Text += ForeStr; int BeforeIndex = txtShow.Text.Length; txtShow.Text += txtSend.Text; txtShow.Select(BeforeIndex, txtShow.Text.Length); txtShow.SelectionBackColor = Color.White; txtShow.SelectionColor = SelfFontColor; //滚动 txtShow.Select(txtShow.Text.Length, 0); txtShow.ScrollToCaret(); txtSend.Text = “"; } 2.2.3棋子位置判断 获得所下的棋子位置的下标: RowIndex =(p.Location.Y30)/(p.Width);判断是否有棋子添加到棋盘上,是通过Button1是否产生单击事件来判定的,在Button按钮单击事件中,编入了输赢的判断代码,结果用messagebox的形式显示出来,还有一些对不合规则下棋方法的判断及给出相应的提示 private void button1_Click(object sender, EventArgs e) { if(this.AllowClick) { this.radBlack.Enabled = false; this.radWhite.Enabled = false; PictureBox p =(PictureBox)sender; p.Image = Image.FromFile(PictureFileName); //获得所下的棋子位置的下标 RowIndex =(p.Location.Y30)/(p.Width); String Message;Message = ”Pos“ + Splitor + RowIndex.ToString()+ Splitor + ColIndex.ToString();//发送的信息字符串 Flag[RowIndex, ColIndex] = true; //记录 if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4())Message += Splitor + this.WinStr; try { int Port = Convert.ToInt32(txtPort.Text.Trim()); if(doubleFlag[RowIndex, ColIndex]) { pic[RowIndex, ColIndex].Image = Image.FromFile(OtherPictureFileName);MessageBox.Show(”不能在有棋子的地方下棋“, ”消息“);AllowClick = true;} else { Sender.send(txtIP.Text.Trim(), Message, Port); Sender.send(txtIP.Text.Trim(), Message, Port); Sender.send(txtIP.Text.Trim(), Message, Port); Sender.send(txtIP.Text.Trim(), Message, Port); Sender.send(txtIP.Text.Trim(), Message, Port); AllowClick =false; } } catch(Exception ex) { MessageBox.Show(ex.Message, ”错误!“);this.Restart();} doubleFlag[RowIndex, ColIndex] = true;//双方记录 if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4()) { this.WinCount += 1;MessageBox.Show(”胜利!胜负情况: 胜“+ WinCount.ToString()+”负“+ LoseCount.ToString(), ”对战结束“);this.Restart(); } } else MessageBox.Show(”不能抢下棋子“); } public Form1() { InitializeComponent(); for(int i = 0;i < Level;i++) { for(int j = 0;j < Level;j++) { pic[i, j] = new PictureBox(); pic[i, j].Click += new EventHandler(this.button1_Click); } } } public void StartListen() { while(true) { int Port = Convert.ToInt32(txtPort.Text.Trim()); udpclient = new UdpClient(Port); IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, Port); try { byte[] bytes = udpclient.Receive(ref ipendpoint); String StrReceive = ”“;StrReceive = Encoding.GetEncoding(”gb2312“).GetString(bytes, 0, bytes.Length); String[] parts = StrReceive.Split(Splitor); if(parts[0].Equals(”Pos“)) { ReceivedRow = Convert.ToInt32(parts[1]); ReceivedCol = Convert.ToInt32(parts[2]); pic[ReceivedRow,ReceivedCol].Invoke(new MyDelegate(this.InvokeFun)); doubleFlag[ReceivedRow, ReceivedCol] = true;try {if(parts[parts.Length3;h++) { j=h; for(int i=0;i { if(flag[i,j]) { count++; if(count >= 5) return true; } else count = 0; } count = 0; } //下三角 for(int row = 1;row < Level-3;row++) { j = row; for(int col = 0;col < Level && j < Level;j++, col++) { if(flag[j, col]) { count++; if(count >= 5)return true; } else count = 0; } count = 0; } return false; } public bool Judge4() //左下——右上 { int count = 0; int h; //上下三角 for(int c=0;c for(int j = Level-1;j >=0;j--) { h = j; for(int i = c;i < Level && h >=0;i++) { if(flag[i,h]) { count++; if(count >= 5)return true; } else count = 0;h--; } count = 0; } return false; } 2.27、聊天监听 public void ListenChat() { while(true) { try { int Port = 12001; udpclient2 = new UdpClient(Port); IPEndPoint ipendpoint2 = new IPEndPoint(IPAddress.Any, Port); byte[] bytes = udpclient2.Receive(ref ipendpoint2);this.ChatMessage = Encoding.GetEncoding(”gb2312“).GetString(bytes, 0, bytes.Length); udpclient2.Close(); txtShow.Invoke(new ChatDelegate(this.ChatInvoke)); } catch(Exception){ udpclient2.Close();break;} this.ChatMessage = ”“; } } public void ChatInvoke(){ String ForeStr = ”rn“ + this.txtIP + ”【“ + DateTime.Now.ToShortDateString()+ ” “ + DateTime.Now.ToShortTimeString()+ ”】:rn"; txtShow.Text += ForeStr;//添加到聊天窗口 int Start = this.txtShow.Text.Length; txtShow.Text += this.ChatMessage; } 3 总结 //字体变色 txtShow.Select(Start, this.ChatMessage.Length);txtShow.SelectionColor = OtherFontColor;txtShow.SelectionBackColor = Color.White;//滚动 txtShow.Select(txtShow.Text.Length, 0);txtShow.ScrollToCaret(); 个 人 简 历 个人信息 姓名:xxxxxxx性别:x 电话:187-xxx7-xxxx年龄:22 邮箱: lxxxxxxx@xxx.com专业:软件技术应聘职位 Java软件开发工程师 专业技能 熟练掌握CoreJava编程,具有扎实的编程功底和良好的编码习惯 熟练掌握ssh(Struts2+hibernate+Spring)等轻量级框架 熟悉MVC开发模式 熟练使用Eclipse/MyEclipse工具进行Java软件开发 熟练Unix/Linux环境下Java的应用软件开发 熟练掌握MySQL、Oracle等数据库操作,能编写常用SQL语句 熟悉软件开发的主要流程,可以根据指定要求快速完成设计、编码等工作了解xml、HTML、JavaScript、Ajax技术 项目经验 一、通用电子商务平台(当当网购物系统) 开发环境:Linux 开发工具:MyEclipse8.6,Tomcat,MySQL 技术实现:Struts2+Hibernate+Spring+JavaScript+JSP+AJAX 项目描述:此系统为网上购物系统,用户可以用过该系统实现网上购物、注册、登录、浏览商 品、订货、生成订单功能。也包括对普通商品增删改查功能和购物车内书的数量的增删改功能。 责任描述:独自完成项目的整个开发过程 用户模块包括登录与注册,主要使用了AJAX对其输入的信息进行验证,结合Hibernate存储和验证用户登录等。 商品列表模块主要是用List集合来展示商品。 购物车模块则是使用Session技术来保存购物车,通过Struts2调用不通方法来操作购物车中的商品集合,实现对购物车的增删改查。 订单模块主要是用Hibernate对用户所买商品的记录进行存储。 经验总结:这个项目让我们把我们所学习的三大框架以及JS,Ajax等都联系起来。尤其是使用 Hibernate经常出现异常,在和组内成员讨论中逐步解决问题,并且更加完善代码。 通过这个项目不仅提高我个人能力,而且还促进了与他人合作的能力。 二、教学管理系统 开发环境:Linux 开发工具:MyEclipse8.6,Tomcat,MySQL 技术实现:Struts2+JavaScript+JDBC+AJAX 项目描述:项目实现了管理员对教师信息的增删改查和对学生选课的管理 责任描述:独立完成该项目的设计和实现,主要应用MVC模式的设计思想对项目进行划分。 采用JDBC对教师信息进行增删改查,在学生选课模块,使用到了Ajax来对选课进 行检验。 经验总结: 通过该项目让我对MVC设计模式有了更深一步的认识。在数据的存储方面尤其是 对JDBC对数据存储的乱码问题。通过与组内成员的不懈努力将其克服。极大的锻 炼了自己团队合作能力,项目计划能力以及写文档的能力独立解决问题的能力。 三、其它项目:BBS论坛,交友网等 实习经历 2011/12 — 2012/05北京xxx科技Java工程师实习生 教育背景 2010/09―2012/07开封大学软件技术 所获证书 C+ E国际软件工程师Java培训证书 自我评价 专业技能:虽然在大学里,我学习的是软件技术专业,已经具备了一些专业方面的基础知识。但是想在行业中有更好的发展就必须学习更多与企业应用相关的知识,所以我选择来达内进行培训。在学习期间,我踏实勤奋,按时完成课后练习及作业,不断的积累代码量,同时也能帮同学解决一些力所能及的问题。遇到难题能够主动动手查阅资料,解决问题。通过项目实战提高我的个人能力和团队协作能力。 综合能力:性格比较沉稳,为人诚恳,不怕吃苦,有高度的责任心和团队合作精神。对环境的适应能力强,有较强的团队意识和集体荣誉感,做事情比较认真仔细,对每一件事情都能认真对待,能很好的自我调节。乐于学习新的知识与技术。 1、编写程序 题目:古典问题:有一对公母猪,从出生后第3个月起每个月都生一对猪,小猪长到第三个月后每个月又生一对猪,假如猪都不死,问每个月的猪总数为多少? 答案: public class lianxi01 { public static void main(String[] args){ System.out.println(“第1个月的兔子对数: 1”); System.out.println(“第2个月的兔子对数:1”); int f1 = 1, f2 = 1, f, M=24; for(int i=3;i<=M;i++){ f = f2; f2 = f1 + f2; f1 = f; System.out.println(“第” + i +“个月的兔子对数: ”+f2); } } } 2、是非题 2.1 Java程序中的起始类名称必须与存放该类的文件名相同。() 答案:正确 2.2 原生类中的数据类型均可任意转换。() 答案:错误 3、问答题 3.1 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 答案: 会执行,在return前执行。 3.2 sleep()和 wait()有什么区别: 答案: sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会 释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 4、数据库题 聚集函数的应用 编写一条sql语句,希望从艺术家表artist_tab中,看到只有一个专长specialty的是哪些专长 答案:seelctspecialty from artist_tab group by specialty having count(*)=1’;第四篇:JAVA开发个人简历
第五篇:java开发面试题