一、判断题(主要是java基础题)
1.所有的类都会生成class文件;
是的,每个类在编译后都会生成一个Class(字节码)文件,无论是否都在同一个Java文件下
二、选择题(主要是java基础题)
1.定义字符串数组,初始化问题:String str[][],是否正确?是否以初始化?
定义二维数组,要么都给出长度:
String str[3][3];
要么省略二维长度,这样必须要初始化:
String str[][3]={1,2,3,4,5,6,7,8,9};
正确,没有初始化;
double[][] s=new double[2][3];//定义一个二维数组并分配空间,有默认的初始值0.0
三、填空题(主要是java基础题,另外一些简单应用)
1.xml的api接口有哪些?有哪几种解析方式?
DOM是接口,是基于树型结构解析和创建xml文档的处理方式.
JDOM是DOM接口的一套实现
SAX也是接口,sun提出的基于事件的xml解析模型.Xerces是apache的SAX实现.
JAXP是sun推出的新的xml解析包,包含了sax和dom的优点且允许用户灵活在不同实现间切换.
目前比较流行的XML编程接口API主要有四种:文档对象模型DOM、SAX(用于XML的简单API)、JDOM和JAXP(用于XML解析的Java API)。
主要使用到了DOM和JDOM,
DOM以分层次对象模型来访问存储在XML中的信息,DOM在处理XML文档的时候,生成一棵节点树。使用者不必考虑XML文档中的信息的类型(不管是表格数据或是一列items),
DOM都会在创建一个XML文档的文档对象时创建一棵节点树,并且把文档中的文本信息转变成一组树的节点。
DOM使用树状模型来访问XML文档中的信息,由于XML文档是分层次的,所以DOM这种模式处理XML文档十分清晰明确。
DOM是采用面向对象的思想来进行设计的,故而使用DOM来处理XML文档比较简单、易懂。 DOM多用于处理包含文档数据的XML文档。
但是DOM在构件的时候,整个文档驻留在内存,所以对内存要求比较高;再者DOM解析器每次执行都要读取整个文档,代码书写量很大。
尽管如此,DOM对于处理包含文档数据的XML来说,还是最常用的方法。
dtd 和schemace
2、SAX,这个东东在一定程度上解决了DOM效率低的问题,它基于事件机制。
SAX解析器向代码发送事件,当解析器发现元素开始、结束、文本、文档开始结束时,都会告诉你。
另外SAX不需要创建任何对象,它只是讲时间传递给应用程序。
SAX在解析开始的时候就开始发送事件,更妙的是,如果只查找文档中某些内容,
代码一旦找到就抛出一个异常,该异常会终止SAX解析器,然后代码用它找到的数据做它需要做的任何事情。
SAX和DOM是各有千秋,具体什么时候使用依据应用的需要。
3、JDOM。JDOM使用SAX和DOM解析器,它的代码书写量很小,这个东西的确很好用的。
它的最大特征就是极大地减少了必须编写的代码数量。
4、JAXP。它应用在JAVA应用程序当中,它为使用DOM、SAX和XSLT处理XML提供了公共接口。
JAXP提供的诸如DocumentBuilderFactory和DocumentBuilder之类的接口为不同的解析器提供了一个标准的接口。
还有一些方法允许你控制底层的解析器是否能识别名称控件以及是否使用DTD或模式验证XML文档。
当你用Java编写应用程序的话,建议你还是用JAXP
2.应用服务器有哪几种?
jBoss,Tomcat、weblogic
web servelt : iis、Apache
3.socket编程,有哪些主要的api及其作用?
4.线程的基本知识?
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,
每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,
每个程序至少都有一个线程,即main方法执行的那个线程。
状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,
由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
如果只是一个cpu,它怎么能够同时执行多段程序呢?
这是从宏观上来看的,cpu一会执行a线索,一会执行b线索,
切换时间很快,给人的感觉是a,b在同时执行,好比大家在同一个办公室上网,
只有一条链接到外部网线,其实,这条网线一会为a传数据,一会为b传数据,由于切换时间很短暂。
5、定义一个静态变量,让后新建一个类实例,三次system.out.println()该变量,每次还要自加1,判断在哪一步出错。
四、简答编程题
1、简述mvc框架的流程
MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller)。MVC模式的目的就是实现Web系统的职能分工。
Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。
View层用于与用户的交互,通常用JSP来实现。
Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
2、编程,打印星号倒三角
*********
*******
*****
***
*
public class MyXMLReader {
public static void main(String arge[]) {
for (int j = 0; j < 5; j++) {
for (int i = 0; i <= j ; i++) {
System.out.print(" ");
}
for (int i = 0; i <=4 - j; i++) {
System.out.print("*");
}
for (int i = 0; i <=4-1- j; i++) {
System.out.print("*");
}
System.out.println();
}
}
}
//2.实现菱形的输出
*
***
*****
*******
*****
***
*
public class LingXing {
public static void main(String arge[]) {
int n=7,i,j;
for(i=1;i<=(n+1)/2;i++){
for(j=1;j<=(n+1)/2-i;j++){
System.out.print(" ");
}
for(int m=1;m<=2*i-1;m++){
System.out.print("*");
}
System.out.print("\n");
}
for(i=1;i<=(n-1)/2;i++){
for (int m=1;m<=i;m++){
System.out.print(" ");
}
for (int a=1;a<=n-2*i;a++){
System.out.print("*");
}
System.out.print("\n");
}
}
}
面试:
1、线程和进程的区别?他们在内存占用方面的区别?
线程与进程的区别可以归纳为以下几点:
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。
多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。 线程的运行中需要使用计算机的内存资源和CPU。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,
通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,
能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
2、事务的提交,什么情况下要commit()?
当对数据进行了修改之后要进行提交,如果是读取数据可以不提交;
3、extJS应用
4、数据库简单的存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程优点:
1.允许标准组件式编程
2.能够实现较快的执行速度
3.能够减少网络流量
4.可被作为一种安全机制来充分利用
CREATE PROCEDURE声明创建一个存储过程,后面跟着该存储过程的名称。
“/*……*/”中的成分是该存储过程的参数,
可包括输入参数和输出参数。
AS关键字后面的内容是该存储过程的主体部分,
其中是任何数量和类型的包含在存储过程中的SQL语句。
RETURN关键字表明存储过程结束并能返回整型状态值给调用者。
CREATE PROCEDURE dbo.up_UpdatePublisherInfo
(
@pub_id char (4),
@pub_name varchar (40),
@city varchar (20),
@state char (2),
@country varchar (30)
)
AS
UPDATE publishers
SET pub_name = @pub_name, city = @city, state = @state,
country = @country
WHERE ( pub_id = @pub_id )
RETURN
5、异常处理是在mvc的哪一层处理
mvc中只能是c层处理异常了。因为这层是做逻辑处理的。 java中就用try catch捕获异常。然后返回给v层一个message显示出来。也可以在c层打日志。
6、写一段程序,读取某个txt文件,注意异常的捕获
java读取txt文件内容。可以作如下理解:
1.首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。
2.通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西
3.既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据
4.解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。
package com.campu;
public class H20121012 {
/**
* 功能:Java读取txt文件的内容
* 步骤:
1:先获得文件句柄
* 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流
* 4:一行一行的输出。readline()。
* 备注:需要考虑的是异常情况
* @param filePath
*/
public static void readTxtFile(String filePath){
try {
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
public static void main(String argv[]){
String filePath = "L:\\Apache\\htdocs\\res\\20121012.txt";
// "res/";
readTxtFile(filePath);
}
}
一:填空:
1.System.out.println(3/6*5)的值____0
2.浮点类型分为float和____ double
3.基本程序结构有: 选择结构,顺序结构,________ 循环结构
4.JAVA的单继承性决定一个类只有一个______ 父类
二:判断:
1.覆写时,如果返回类型为一个继承关系的类,是否可以以父类作为返回类型 可以
2.java的标识符的命名规则判断(是否可以以*****开头) 错
3.vector 与 ArrayList 相比,vector 是线程安全的,为了程序的“键壮”性考虑,优先使用vector? 错
4.java的标识符的命名可以字母、下滑线和$符号开头 对
5.方法覆盖的参数和方法名必须相同,但返回类型可以是被覆盖方法的子类? 对
6.方法覆盖可以抛出更少的异常,可以抛出被覆盖方法异常的子类? 对
三:选择:
1.int a = 1;
try{
a++;
调用一个抛出异常的方法;
a++;
return;
}
catch(){
a--;
} finally{
a--;
}
最后a的值是多少 -1
2.
boolean = true;
try{
return a ? 0: 1;
}catch(){
}finally {
return 2;
}
最后返回的结果是多少 2
3.
switch(1){
case 0:
System.out.println("aa");
case 1:
System.out.println("bb");
case 2:
System.out.println("cc");
default:
System.out.println("dd");
break;
}
最后的输出结果是多少
bb
cc
dd
4.
public class test{
private static synchronized method1();
private synchronized method2();
public static void main(String[] args){
}
}
5.
Vector v = new Vector();
v.add("one");
v.add("two");
v.add("three");
v.add("four");
for(int i = 0; i< v.size(); i++){
if(vector.get(i).equals("two")){
vector.remove();
}
}
method1(v);
private static void method1(List list){
for(int i = 0; i < list.size();i ++ ){
System.out.print(list.get(i));
}
}
最后输出的结果是什么
one three four
6.
System.out.print(1 - 0.1 * 9);的值是多少?
0.09999999999999998
7.
class a{
public void method1(){
System.out.println("a");
}
}
class b extends a{
public void method1(){
System.out.println("b");
}
public static void main(String[] args){
a a1 = new b();
a1.method();
}
}
最后会输出多少 b
8.
static int num0 = 0;
static volatile int num1 = 0;
static int num2 = 0;
public static int method1(int num){
num += 1;
}
public static int method2(int num){
num += 1;
}
public static int method3(int num){
num += 1;
}
public static void main(String[] args){
for(int i = 0; i < 500000; i++){
method1(num0);
method1(num1);
method1(num2);
method1(-num0);
method1(-num1);
method1(-num2);
}
}
最后的结果是多少
0
0
0
因为整形变量存储在栈区,不能在方法里面改变