1. JAVA中的几种基本数据类型是什么,各自占用多少字节?
答: byte 1字节 short 2字节 int 4字节 long 8字节 char 2字节(C语言中是1字节)可以存储一个汉字 float 4字节
double 8字节 boolean false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)
2.String类能被继承吗?
public final class String extends Object,里边有final关键字,所以不能被继承
3.String,Stringbuffer,StringBuilder的区别?
3.1三者在执行速度方面的比较:StringBuilder > StringBuffer > String
3.2 String 字符串常量 StringBuffer 字符串变量 StringBuilder 字符串变量。String每次赋值并追加其实都是在不断创建新的对象,原来的对象就会被GC回收。而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的
3.3 StringBuilder:线程非安全的而StringBuffer:线程安全的
总结:如果操作少量的数据用 String,单线程操作字符串并大量数据,使用StringBuilder,多线程字符串大量数据使用Stringbuffer
4.error和exception的区别,CheckedException,RuntimeException的区别
Error表示系统级的错误和程序不必处理的异常,是java运行环境中内部错误或硬件问题(内存不足)
Exception 表示需要进行捕捉或者程序需要进行处理的异常,主要是程序设计有问题或者在外输入等引起的问题,程序必须进行处理。
运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常
受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。
5.java多态面试编程题
class Father{
int x = 1;
public Father(){
System.out.println("father");
}
public Father(String s){
System.out.println("father:"+s);
}}
class Son extends Father{
int x = 2;
public Son(){
System.out.println("son");
}
public Son(String s){
System.out.println("son:"+s);
}}
public static void main(String[] args){
//都是new的无参构造方法
//第一种情况,输出结果的顺序
Son f = new Son();
System.out.println(f.x); //输出结果 父类无参构造--子类无参构造--子类成员 father son 2
}
//第二种情况,输出结果的顺序
Father f = new Son();
System.out.println(f.x); //父类无参--子类无参--父类成员 father son 1
//第三种情况
Son f = new Son("hello"); //父类无参--子类有参--子类成员
System.out.println(f.x); //father son:hello 2
//第四种
Father f = new Son("hello"); //父类无参--子类有参--父类成员
System.out.println(f.x); //father son:hello 1
只要是new子类,无论是调用子类的有参构造还是无参构造都会执行父类的无参构造。当
子类和父类有同一个变量名字的变量时,如果是使用了多态则调用的是父类的变量。否则调用的是子类的变量。
6.多态面试题
http://blog.csdn.net/simon901/article/details/25078397
7.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序?
父类静态成员、静态初始化代码块,子类静态成员和初始化代码块,父类实例成员和初始化代码,父类构造方法,子类的实例成员和实例代码块,子类构造方法。
8.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么?
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
10. 继承和聚合的区别在哪。
聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
11. 讲讲你理解的nio。他和bio的区别是啥,谈谈reactor模型。
NIO 是一种同步非阻塞的 IO 模型。同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指线程在等待 IO 的时候,可以同时做其他任务。同步的核心就是 Selector,Selector 代替了线程本身轮询 IO 事件,避免了阻塞同时减少了不必要的线程消耗;非阻塞的核心就是通道和缓冲区,当 IO 事件就绪时,可以通过写道缓冲区,保证 IO 的成功,而无需线程阻塞式地等待。
BIO建立网络连接采用BIO模式,先在服务器启动服务,然后客户端启动Socket来对服务器端进行通信,默认情况服务器需要对每个请求建立一堆线程等待请求,客户端发送请求后,先咨询服务器是否有线程响应,没有则一直等待,客户端会线程会等待请求结束后才继续执行
reactor模型?
12.反射的原理,反射创建类实例的三种方式是什么?
在运行状态中,对于任何一个类,都能够知道这个类的属性和方法;对于任何一个类都能调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法功能称为java反射。
1.通过对象的getClass方法进行获取
2.任何数据类型(包括基本数据类型)都具备着一个静态的属性class,通过它可直接获取到该类型对应的Class对象
3.通过Class.forName()方法获取。
13.反射中,Class.forName和ClassLoader区别?
Java中class.forName()和classLoader都可用来对类进行加载,不同之处: class.foeName()将类的.class文件加载到jvm中,还对类进行解释,执行类中的static代码块。 classLoader只是将.class文件加载到jvm中,不会执行static中内容,只有在newInstance才执行static代码块
14.描述动态代理的几种实现方式,分别说出相应的优缺点
JDK代理(Proxy.newProxyInstance()方法创建动态代理)和CGLIB代理
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理
15.动态代理与cglib实现的区别。
JDK动态代理只能对实现了接口的类生成代理,而不能针对类 。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承,所以该类或方法最好不要声明成final ,final可以阻止继承和多态。
16. 为什么CGlib方式可以对接口实现代理
CGLIB是通过生成java 字节码从而动态的产生代理对象
17.final的用途
final修饰变量:java中普通变量是自动初始化,数值变量自动初始化为0,其余变量初始化为空。但final类型变量必须显示初始化,且初始化必须申明时或者在构造方法中直接赋值,不能通过函数赋值修改。
final修饰方法子类不允许覆盖final方法
final修饰类该类不能被继承,final类成员方法都不能被覆盖,默认都是final
18.static的用途
static变量在内存中只有一个拷贝,jvm职位静态分配一次内存,在加载过程中完成变量的内存分配,用类名直接访问。
static代码块类加载时初始化自动执行
static方法可直接用类名直接调用,只有一个存储地方,直接使用不需要创建对象。
19.写出三种单例模式实现。(http://blog.csdn.net/goodlixueyong/article/details/51935526)
饿汉模式
publicclassSingleton{
privatestaticSingleton instance =newSingleton();
privateSingleton(){}
publicstaticSingleton newInstance(){
returninstance;
}}
懒汉模式
publicclassSingleton{
privatestaticSingleton instance =null;
privateSingleton(){}
publicstaticsynchronizedSingleton newInstance(){
if(null== instance){
instance =newSingleton();
}
return instance;
}}
双重校验锁
publicclassSingleton {
private static volatile Singleton instance =null;
privateSingleton(){}
publicstaticSingleton getInstance() {
if(instance ==null) {
synchronized(Singleton.class) {
if(instance ==null) {
instance =newSingleton();
}}}
returninstance;
}}