java面试基础知识

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;

}}

你可能感兴趣的:(java面试基础知识)