可能出现的问题
相信大家应聘的时候第一关就是笔试,即使是一位很有经验的工程师也不一定能够顺利通过,笔试不好,可能就无法进行面试,即使能够进行面试,考官对你的印象也不会很好,问的问题也会很多,估计很难吃的消,当然如果你是位很有经验的高手,也是有可能通过面试,但也会影响到你的待遇.
有可能有人会问,如果你真是个有一定开发经验的java工程师,怎么可能通不过笔试,其实这种可能性是存在的,而且很大,因为笔试的题目一般都很基础,有一些都是你平时不曾注意到的,可能你在开发中用到过,但不一定知道是什么,比如说:写jsp的肯定都用到过out,request等但不一定知道它们叫jsp的内置对象,如果考题问你:jsp的内置对象有哪些,你就不一定答的上来,再比如说:在开发javabean的时候一般都会用到ArrayList,HashMap等,但你不一定就知道ArrayList和Vector的区别,HashMap和Hashtable的区别,可能你在开发中都是混用,也不会报错,但效率会大大降低,如果在多线程开发中混用,可能就会产生错误.可能这些都是小问题,如果有一定基础,看看书就知道所以然了,但笔试中答不上来或答错就可能影响到你是否能够面试成功,如果面试公司是你非常想进的公司,因为这些细节问题而最终没能进去,岂不是很遗憾.
我写这篇文章就是让大部分的人少一份遗憾,多一份面试成功后的喜悦,也许有人会问:你才工作几年啊,就在这里作总结,你说的问题在笔试中可能出现吗?我要说的是我工作时间的确很短(2002年毕业),但大大小小的公司也面试了不少,有时候就是因为这些笔试上的小问题而没能进想进的公司,结果我自己总结了一下面试的得与失,重新看了看基础知识,结果成功应聘在一家很大的公司,拿着相同工作经验的比较高的工资,之所以我花时间要在这里总结,目的就是为了大家能进自己想进的公司,拿到自己要求的工资.也许这些总结比几篇技术文章带给你的收获都大,因为它直接和你的利益,前途挂钩.本文适用于有一定开发能力但java,j2ee基础欠扎实而又在找Java,jsp,j2ee开发,维护方面工作的朋友,如果你的时间充足建议还是全面的看看基础知识,如果时间紧张可以侧重看一下我下面列举出来的问题,最好能由点到面的看.
好了,闲话不多说了,下面列举我笔试中遇到过的问题,以及这些问题的延伸,问题都比较基础,答案就不在这里说了,查查资料,看看书就能解决,我在此郑重声明:不是说懂了下面的问题就一定能够面试成功,就是什么高手了,就不用看书了,我的总结只是提高你笔试的成功率,在你基础不是很扎实,时间很紧的情况下帮助你成功笔试.切记:它不是万能的.
Java基础方面:
1,作用域public,protected,private,以及不写时的区别
2,ArrayList和Vector的区别,HashMap和Hashtable的区别
3,char型变量能不能定义为一个中文?为什么?
4,多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?
5,继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
6,内部类的实现方式?
7,垃圾回收机制,如何优化程序?
8,float型float f=3.4是否正确?
Jsp方面
1,jsp有哪些内置对象?作用分别是什么?
2,jsp有哪些动作?作用分别是什么?
3,include的两种实现方式的区别?
4,两种跳转方式分别是什么?有什么区别?
Servlet方面
1,说一说Servlet的生命周期?
2,Servlet版本间(忘了问的是哪两个版本了)的不同?
Jdbc,Jdo方面
1,可能会让你写一段Jdbc连Oracle的程序.
2,Class.forName的作用?为什么要用?
3,Jdo是什么?
Xml方面
1,xml有哪些解析技术?区别是什么?
2,你在项目中用到了xml技术的哪些方面?如何实现的?
3,用jdom解析xml文件时如何解决中文问题?如何解析?
EJB方面
1,EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别?
MVC方面
1,MVC的各个部分都有那些技术来实现?如何实现?
设计模式方面:
1,开发中都用到了那些设计模式?用在什么场合?
java script方面
1,如何校验数字型?
CORBA
1,CORBA是什么?用途是什么?
以上就是我的总结,可能不是全部,因为时间问题,如果能够记起来,我会再加上,有些问题描述的可能不准确,希望大家批评指正,问题都很基础,即使不知道,花上一点时间查找(csdn/java版)就能弄懂,希望对正在找工作的朋友有所帮助,有所提醒.一份正确率很高的笔试卷可能会为你的面试减轻负担,少问不少问题.
当然我还是要提醒从事软件开发,维护工作的朋友们要重视基础,善于总结和比较,对什么都能追根究底.
操作系统软件版本获取方法
我是一个C#的初学者,这是我参考一些资料,自己弄的一个通过访问当前操作系统的注册表来获取当前操作系统相关信息的小程序,仅供参考。
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8using Microsoft.Win32;
9
10namespace Reg4U
11{
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18
19 private void button1_Click(object sender, EventArgs e)
20 {
21 RegistryKey rk;
22 rk = Registry.LocalMachine.OpenSubKey("SoftwareMicrosoftWindows NTCurrentVersion");
23 string s= "当前操作系统版本:" rk.GetValue("ProdUCtName").ToString();
24 s = s " " rk.GetValue("CSDVersion").ToString() ;
25 s = s " 当前操作系统安装序列号: " rk.GetValue("ProductId").ToString();
26 s = s " 当前系统版本号:" rk.GetValue("CurrentBuildNumber").ToString();
27 rk.Close();
28 textBox1.Text = textBox1.Text " " s;
29 }
30
31 private void Form1_Load(object sender, EventArgs e)
32 {
33 RegistryKey rk;
34 rk = Registry.LocalMachine.OpenSubKey("SoftwareMicrosoftWindows NTCurrentVersion");
35 string s = rk.GetValue("ProductName").ToString();
36 if (System.Text.RegularEXPressions.Regex.IsMatch(s, "windows 2000"))
37 {
38 textBox1.Text = "您的操作系统是2K,恭喜您,你的当前系统适合本软件的使用!";
39 }
40 rk.Close();
41 }
42 }
43}
C#中的图形编程
像Java一样,C#提供了一整套相当丰富的类库、方法以及事件以供开发者使用。C#还引入了GDI+,它是由GDI演变而来的,具有比GDI更强大的功能而且简化了程序员的编程工作。所以开发者运用这些,就可以很方便的开发出具有强大图形图像功能的应用程序了。本文,笔者就通过一些实例像读者介绍一下C#中的图形编程的基本知识。
简单实例:
首先,让我们从例子开始,以下是一个最简单的实例:
using System;
using System.Windows.Forms;
using System.Drawing;
public class Hello:Form {
public Hello() {
this.Paint += new PaintEventHandler(f1_paint);
private void f1_paint(object sender,PaintEventArgs e) {
Graphics g = e.Graphics;
g.DrawString("你好,C#!",new Font("Verdana",20),
new SolidBrush(Color.Tomato),40,40);
g.DrawRectangle(new Pen(Color.Pink,3),20,20,150,100);
public static void Main() {
Application.Run(new Hello());
在上面的实例中,我们用到了一个方法:DrawString(),它带有5个参数。同时,我们发现在运用DrawString()方法以前,我们先创建了一个Graphics类型的对象g=e.Graphics,这就说明了在运用任何图形类的方法以前我们必须先创建该类的一个实例化对象。在DrawString()方法后,我们用到了DrawRectangle()方法,其实我们还可以运用其他的方法来画椭圆或是多边形等等。第一个实例还是相当简单易懂的,不是吗?
用c#如何读取xml文件
XmlReader和XmlTextReader类定义在System.XML名字空间中。
XmlTextReader类源于XmlReader类。XmlTextReader类可用来读取XML文档。此类的Read方法读取此文档,直到其节点结束。
在这篇文章里,将演示如何使用XmlTextReader类来读取一个XML文档及输出数据到控制台。
加入名字空间引用
因为Xml类都定义在System.Xml名字空间当中,所以首先要做的是在工程里加入对System.Xml的引用。
using System.Xml;
打开一个XML文档
XmlTextReader类的构造器打开一个XML文件。在这个例子里使用了一个名为xmltest.xml的文件,它保存在C: emp目录当中。你可以下载此附件。
// 打开一个 XML 文件
XmlTextReader reader = new XmlTextReader("C: empxmltest.xml");
读取数据
XmlTextReader类的Read方法读取数据。
while ( reader.Read() )
Console.WriteLine(reader.Name);
源代码:
附件
CS Code
XML文件
namespace ReadXML
using System;
using System.Xml;
public static int Main(string[] args)
try
// 打开一个 XML 文件
XmlTextReader reader = new XmlTextReader("C: empxmltest.xml");
while ( reader.Read() )
Console.WriteLine(reader.Name);
catch (Exception e)
Console.WriteLine ("Exception: {0}", e.ToString());
return 0;
用C#实现完整文档打印功能(一)
在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .net Framework的打
印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。
打印操作通常包括以下四个功能
1 打印设置 设置打印机的一些参数比如更改打印机驱动程序等
2 页面设置 设置页面大小纸张类型等
3 打印预览 类似于word中的打印预览
4 打印
下面我把我编写的记事本(全部源代码可以在http://www.cndot.net中下载)中用到的打印功能的代码进行解释希望能给大家一些帮助
实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所
有的与打印有关的事件和方法
这个类包括以下几个属性 事件 和方法
1、PrinterSettings 属性
存放打印机的设置信息这个属性不需要程序员设置因为它是由打印对话框获取的
2、PrintCountroller 属性
控制打印过程
3、DefaultPageSettings 属性
存放页面设置信息 打印纸大小方向等也不需要程序员设置因为它是由页面设置对话框获取的
4、DocumentName 属性
指定文档名称,出现在打印机状态窗口中
1。 BeginPrint事件
在打印之前发出
2. PrintPage事件
每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息
PrintPageEventArgs参数有很多重要的属性
1 Cancel 取消打印
2 Graphics 页面的绘图对象
3 HasMorePages 是否还有要打印的页面
Print 方法 该方法没有参数 调用它将按照当前设置开始打印
若实现打印功能首先构造PrintDocument对象添加打印事件
PrintDocument printDocument;
private void InitializeComponent()
printDocument=new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
实现打印事件功能
打印和绘图类似都是调用Graphics 类的方法进行画图 不同的是一个在显示器上一个在打印纸上并且打印要进行一些复杂的计算
如换行 分页等。
private void printDocument_PrintPage(object sender,PrintPageEventArgs e)
Graphics g = e.Graphics; //获得绘图对象
float linesPerPage = 0; //页面的行号
float yPosition = 0;//绘制字符串的纵向位置
int count = 0; //行计数器
float leftMargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top; //上边距
string line = null; 行字符串
Font printFont = this.textBox.Font; //当前的打印字体
SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数
//逐行的循环打印一页
while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
yPosition = topMargin + (count * printFont.GetHeight(g));
g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
count++;
如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会
自动读取上次没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置
if(line != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
打印设置,构造打印对话框 将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument
的PrinterSettings属性中
protectedvoid FileMenuItem_PrintSet_Click(object sender,EventArgs e)
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
printDialog.ShowDialog();
页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中
protectedvoid FileMenuItem_PageSet_Click(object sender,EventArgs e)
PageSetupDialog pageSetupDialog = new PageSetupDialog();
pageSetupDialog.Document = printDocument;
pageSetupDialog.ShowDialog();
打印预览
protected void FileMenuItem_PrintView_Click(object sender,EventArgs e)
PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
printPreviewDialog.Document = printDocument;
lineRea
der = new StringReader(textBox.Text);
try
printPreviewDialog.ShowDialog();
catch(Exception excep)
MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
打印就可以直接调用printDocument的Print()方法因为用户可能在打印之前还要再更改打印设置所以
在这里再次显示打印设置对话框
protected void FileMenuItem_Print_Click(object sender,EventArgs e)
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
lineReader = new StringReader(textBox.Text);
if (printDialog.ShowDialog() == DialogResult.OK)
try
printDocument.Print();
catch(Exception excep)
MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs());
总结打印的过程是
1 在应用程序窗体初始化时构造PrintDocument对象添加 printDocument 的 PrintPage 方法
2 实现PrintPage方法4 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能
在这中间可能要用到PrintDialog PrintPreviewDialog PageSetupDialog 设置和查看打印效
果这些方法通常是由菜单的单击触发的。
用Visual C#来操作Clipboard
Clipboard就是所谓的剪切板,当我们同时按动Ctrl+C键或者点击菜单“拷贝”的时候,选定的对象就被存放在了剪切板中了。如果刚才选定的对象是文件,那么在定盘符后,按动Ctrl+V键或者点击菜单“粘贴”,这时选定的文件就保存到指定的磁盘上面了;如果选定的对象是图象,那么在打开“画图”之后,按动Ctrl+V键或者点击菜单“粘贴”,图象就会显示在画图中了;如果是文本,那么在打开文本编辑器后,按动Ctrl+V键或者点击菜单“粘贴”,这时文本就会显示在文本编辑器中。当然选定的对象还有许多种,这就不一一举例了。上面这些操作其实就是剪切板几种典型的操作。那么这些操作如果用Visual C#来实现到底是个什么样子?本文就将通过一个程序来具体探讨这个问题。
一.本文程序设计和运行的软件环境
(1).微软公司视窗2000服务器版
(2)..Net FrameWork SDK Beta 2
二.程序的主要功能以及运行界面
其实看了上面的介绍以后,我们不难得出剪切板的几种基本的操作,即:拷贝数据到剪
切板中、把当前剪切板中的数据取出来。下面就按照这些操作来编写一个程序。这个程序主窗体是由二个TextBox组件即TextBox1和TextBox2,和二个Button组件构成。实现的功能是当选定TextBox1的文本后,按动“拷贝指定的数据到剪切板”按钮,拷贝数据到剪切板中,然后按动“从当前剪切板获得数据”按钮得到剪切板中的数据,并由TextBox2显示出来。下面的图象是程序运行的界面:
图1 拷贝指定对象到剪切板中
图2 从当前剪切板中获得数据,并显示出来
三.程序的设计思路以及重要步骤地解决办法
(1).如何把指定对象拷贝到剪切板中:
在这个环节中要处理好二件问题:其一是如何判断是否选定了TextBox1中的对象,其二是如何把选定的对象存放到剪切板中。下面就带着这二个问题来进行分析。
I > .如何判断TextBox1中是否选定了对象:
对于TextBox组件中有一个属性SelectedText,这个属性就是选定的文本,在程序中是通过判断这个属性值是否为“”,来判断TextBox1中是否选定了对象的。
II > .如何把选定的对象存放到剪切板中:
要完成此功能,要使用到中的Clipboard类,Clipboard类是一个封闭的类,这决定了他无法被继承,此类的主要功能就是存取剪切板中的数据。他有一个方法SetDataObject(),这个方法的作用就是把数据存放到剪切板中。
解决上面二个问题的代码如下:
if ( textBox1.SelectedText != "" )
Clipboard.SetDataObject ( textBox1.SelectedText ) ;
else
textBox2.Text = "在textBox1中没有选定的内容" ;
(2).把读取剪切板中的数据,并显示出来。
要实现本步骤,也需要解决好二个问题:其一,在剪切板中不仅可以存放文本,还可以存放其他类型的数据,而TextBox2能够显示出来的数据类型只有文本,所以为了程序有更好的稳定性,在显示之前,要判断当前剪切板中的数据类型是文本,其二,读取剪切板中的数据,并显示出来。
I > .判断当前剪切板中的数据类型:
判断剪切板中的数据类型,要使用到IdataObject接口,此接口的可以存放从剪切板中读取得数据。通过IdataObject接口的方法GetDataPresent()来判断是否为符合自己需要的数据类型。
II >.读取剪切板中的数据,并显示出来:
通过Clipboard类的GetDataObject()可以把当前剪切板中的数据存放到IdataObject接口中,但IdataObject接口这地数据不能直接被程序使用,必须通过IdataObject接口的GetData()获得数据。但由于GetData()地返回值是一个Object类型变量,即参考类型变量,而TextBox1显示的文本是实值类型变量,所以还要进行一次出箱的操作,这种操作在前面的文章已经比较详细的介绍过了,这里就不加叙述了。经过出箱操作后的数据就可以被TextBox1使用了。下面是解决上面二个问题的代码:
IDataObject iData = Clipboard.GetDataObject ( ) ;
//检测数据是否是可以使用的格式,即文本格式
if ( iData.GetDataPresent ( DataFormats.Text ) )
//是可以使用的格式,就在textbox2中显示剪切板中的内容
textBox2.Text = ( String ) iData.GetData ( DataFormats.Text ) ;
else
//如果不是
textBox2.Text = "没有从剪切板中接收到数据!" ;
四.本文的源程序代码
掌握了程序的主要步骤后,不难得到以下程序代码:
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
public class Form1 : Form
private Button button1 ;
private Button button2 ;
private TextBox textBox1 ;
private TextBox textBox2 ;
private System.ComponentModel.Container components = null ;
public Form1 ( )
InitializeComponent ( ) ;
protected override void Dispose ( bool disposing )
if ( disposing )
if ( components != null )
components.Dispose ( ) ;
base.Dispose ( disposing ) ;
private void InitializeComponent ( )
this.button1 = new Button ( ) ;
this.button2 = new Button ( ) ;
this.textBox1 = new TextBox () ;
this.textBox2 = new TextBox ( ) ;
this.SuspendLayout ( ) ;
this.button1.Location = new System.Drawing.Point ( 264 , 56 ) ;
this.button1.Size = new System.Drawing.Size ( 96 , 40 ) ;
this.button1.Name = "button1" ;
this.button1.TabIndex = 0 ;
this.button1.Text = "拷贝指定的数据到剪切板" ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
this.button2.Location = new System.Drawing.Point ( 264 , 104 ) ;
this.button2.Size = new System.Drawing.Size ( 96 , 40 ) ;
this.button2.Name = "button2" ;
this.button2.TabIndex = 1 ;
this.button2.Text = "从当前剪切板获得数据" ;
this.button2.Click += new System.EventHandler ( this.button2_Click ) ;
this.textBox1.Location = new System.Drawing.Point ( 64 , 64 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.TabIndex = 2 ;
this.textBox1.Text = "" ;
this.textBox2.Location = new System.Drawing.Point ( 64 , 104 ) ;
this.textBox2.Name = "textBox2" ;
this.textBox2.TabIndex = 3 ;
this.textBox2.Text = "" ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 384 , 273 ) ;
this.Controls.Add ( textBox2 ) ;
this.Controls.Add ( textBox1 ) ;
this.Controls.Add ( button2 ) ;
this.Controls.Add ( button1 ) ;
this.Name = "Form1" ;
this.Text = "Visual C#来操作Clipboard!" ;
this.ResumeLayout ( false ) ;
static void Main ( )
Application.Run ( new Form1 ( ) ) ;
private void button1_Click ( object sender , System.EventArgs e )
if ( textBox1.SelectedText != "" )
Clipboard.SetDataObject ( textBox1.SelectedText ) ;
else
textBox2.Text = "在textBox1中没有选定的内容";
private void button2_Click ( object sender , System.EventArgs e )
IDataObject iData = Clipboard.GetDataObject ( ) ;
//检测数据是否是可以使用的格式,即文本格式
if ( iData.GetDataPresent ( DataFormats.Text ) )
//是可以使用的格式,就在textbox2中显示剪切板中的内容
textBox2.Text = ( String ) iData.GetData ( DataFormats.Text ) ;
else
//如果不是
textBox2.Text = "没有从剪切板中接收到数据!" ;
五.总结
至此我们已经完成了用Visual C#实现剪切板基本操作的全部工作,这就是拷贝数据到剪切板、读取剪切板中需要的数据、显示剪切板中的数据等三个方面。其中又以前二个方面的内容最为重要。虽然以上这些操作和处理针对的对象都是文本,但实际对于其他类型的对象也是一样,只需要做少许修改就可以了,不信你试一下。
[应聘软件工程师笔试中可能出现的问题]