开发人员面试宝典

单例:一个action处理多个请求。多例:一个action只处理一个请求。

URL映射:不同的URL找到对应处理的类和方法

Java介绍

Java是面向对象的,跨平台的,它通过java虚拟机来进行跨平台操作,它可以进行自动垃圾回收的(c语言是通过人工进行垃圾回收)。

java还会进行自动分配内存。(c语言是通过指定进行分配内存的),只需要new一个对象,这个对象占用了多少空间,不需要我们来管,java虚拟机负责管这些,用完之后也不需要我们来释放,java虚拟机会自动释放。

J2SE、J2EE、J2ME三者区别

Java SE = Java Standard Edition=j2se = java  标准版

Java EE = Java Enterprise Edition=j2ee= java 企业版

Java ME = Java Mobile Edition=j2me = java  移动版

 

三者特点:

J2SE主要用于桌面程序(swing),控制台开发(main程序)。

J2EE企业级开发(JSP,EJB,Spring MVC,Struts,hibernate,ibatis等),用于企业级软件开发,网络开发,web开发。

J2ME嵌入式开发(手机,小家电,PDA)。[苹果的ios,黑莓]。

 

三者之间的关系:

Java SE(Java Platform,Standard Edition,Java标准版)就是基于JDK和JRE的。Java SE为Java EE提供了基础。Java EE除了基于我们这个所谓的Java SE外,还新加了企业应用所需的类库。

JDK、JRE、JVM区别

Jdk【Java Development ToolKit】就是java开发工具箱, JDK是整个JAVA的核心里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编译成class文件,java文件是用来运行这个程序的,除此之外,里边还包含了java源生的API,java.lang.integer在rt的jar包里边【可以在项目中看到】,通过rt这个jar包来调用我们的这些io流写入写出等。

 

JDK有以下三种版本:

J2SE,standard edition,标准版,是我们通常用的一个版本

J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序

J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序

 

Jre【Java Runtime Enviromental】是java运行时环境,那么所谓的java运行时环境,就是为了保证java程序能够运行时,所必备的一基础环境,也就是它只是保证java程序运行的,不能用来开发,而jdk才是用来开发的,所有的Java程序都要在JRE下才能运行。

包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。Jre里边包含jvm。

 

Jvm:【Java Virtual Mechinal】因为jre是java运行时环境,java运行靠什么运行,而底层就是依赖于jvm,即java虚拟机,java虚拟机用来加载类文件,java中之所以有跨平台的作用,就是因为我们的jvm。

 

三者关系:J2se是基于jdk和jre,JDK是整个JAVA的核心里边包含了jre,Jre里边包含jvm。

JDK常用的包

java.lang: 这个是系统的基础类,比如String、Math、Integer、System和Thread,提供常用功能。

java.io: 这里面是所有输入输出有关的类,比如文件操作等。

java.net: 这里面是与网络有关的类,比如URL,URLConnection等。

java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。

java.sql: 这个是数据库操作的类,Connection,Statememt,ResultSet等。

Java中的基本数据类型

数据类型

大小

byte(字节)

1(8位)

shot(短整型)

2(16位)

int(整型)

4(32位)

long(长整型)

8(32位)

float(浮点型)

4(32位)

double(双精度)

8(64位)

char(字符型)

2(16位)

boolean(布尔型)

1位

 

附加:

String是基本数据类型吗?(String不是基本数据类型)

String的长度是多少,有限制?(长度受内存大小的影响)

Java中switch接受的几种数据类型

short, int, byte,char

enum(JDK1.5以后支持)

String(JDK1.7以后支持)

  1. String、StringBuffer、StringBuilder区别

String

字符串常量

不可变

使用字符串拼接时是不同的2个空间。

StringBuffer

字符串变量

可变

线程安全,字符串拼接直接在字符串后追加。

StringBuilder

字符串变量

可变

非线程安全,字符串拼接直接在字符串后追加。

 

  1. StringBuilder执行效率高于StringBuffer高于String。
  2. String是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方法,在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于StringBuffer。
  3. 对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder。
  4. 另一种说法,JDK1.6做了优化,通过String声明的字符串在进行用“+”进行拼接时,底层调用的是StringBuffer,所以性能上基本和后两者没有什么区别。
    1. Char型变量能不能存储一个汉字?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

==和equals方法的区别

“==”如果前后比较的是对象,则比较的是对象的地址,如果前后是数字,则比较的数值。

“equals”如果前后是对象,比较的是对象的地址。如果比较的对象重写了equals方法,则有可能比较的是“值”。像八个基本数据类型的封装类、String、File、Date都比较的是值。

静态变量和实例变量的区别

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

Integer和int的区别

int是java提供的8种原始数据类型之一,意思整型,占用4字节。

Integer是java为int提供的封装类,是引用数据类型。

int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。  

Math.round()的使用

Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

构造器是否可以被重写

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

抽象类和接口的区别

含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

下面比较一下两者的语法区别:

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以有普通成员变量,接口中没有普通成员变量

3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

下面接着再说说两者在应用上的区别:

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;

而抽象类在代码实现方面发挥作用,可以实现代码的重用。

新建对象有几种方式

1. 使用new关键字

2. 使用反射,调用newInstance

3. 使用clone方法

4. 使用序列化与反序列化

5. 动态代理(Proxy类和CGLIB)

&和&&的区别

&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。

另外&可以做为整数的位运算符

 

例1:对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。

例2:If(x==33 &++y>0) y会增长,if(x==33 && ++y>0)不会增长。

 

备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。

猜你喜欢

转载自blog.csdn.net/uyhbrr/article/details/83750047