Java常见面试题——仅供实习

注:从网络整理而来。红字为不理解,待查阅内容java

1.面向对象的特征有哪些方面?程序员

抽象,就是将具备一致属性和行为的对象抽象成一个类,只强调本质的属性和行为,先不考虑具体的细节。sql

继承,子类自动共享父类的属性和行为。单重继承是指子类只继承一个父类的属性和行为,多重继承是子类能够继承多个类的属性和行为。编程

多态,相同的函数做用在不一样的对象上会得到不一样的结果。设计模式

封装,只给用户看用户须要看的东西。数组

 

2.int 和 Integer 有什么区别安全

Java 提供两种不一样的类型:原始类型(或内置类型)和引用类型。Java为每一个原始类型提供了封装类。网络

Int是java的原始数据类型,Integer是java为int提供的封装类。
原始类型     封装类
boolean     Boolean
char          Character
byte          Byte
short        Short
int            Integer
long         Long
float         Float
double      Double多线程

引用类型和原始类型具备不一样的特征和用法,它们包括:大小和速度问题等。另外,对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。ide

3.String 和StringBuffer的区别
      JAVA平台提供了两个类:String和StringBuffer,它们能够储存和操做字符串。

     String类提供了数值不可改变的字符串。而StringBuffer类提供的字符串能够进行修改,常使用StringBuffers来动态构造字符数据。

4.说出ArrayList,Vector, LinkedList的存储性能和特性
     ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,它们都容许直接按序号索引元素,可是插入元素要涉及数组元素移动等内存操做,因此索引数据快而插入数据慢。

    Vector因为使用了synchronized方法(线程安全),一般性能上较ArrayList差。

    LinkedList使用双向链表实现存储,按序号索引数据须要进行前向或后向遍历,可是插入数据时只须要记录本项的先后项便可,因此插入速度较快。

5.Collection 和 Collections的区别。
  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
      Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各类集合的搜索、排序、线程安全化等操做。

6.HashMap和Hashtable的区别。

      HashMap是Map接口的实现,容许键(key)和值(value)为null,使用containsKey()和containsValue()来判断是否含有某数据。

      Hashtable继承Dictionary类,不容许值为null,使用contains()判断是否含有某数据。

      最大不一样时HashMap不支持线程安全,所以,多线程访问时必须提供外同步方法,使用方法为Map map = Collections.synchronizedMap(new HashMap());)

      Hashtable支持线程安全,多线程访问不需提供外同步方法。

7.final, finally, finalize的区别。
  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
      finally是异常处理语句结构的一部分,表示老是执行。
      finalize是Object类的一个方法,在垃圾收集器GC执行的时候会调用被回收对象的此方法,能够覆盖此方法提供垃圾收集时的其余资源回收,例如关闭文件等。

8.sleep() 和 wait() 有什么区别?

     sleep()是Thread类里的方法,调用并不释放锁,即占有资源等待。通常给sleep()指定时间,时间一到,线程处于可运行状态。能够在任意地方使用sleep(),但使用时须要捕捉InterpretedException。

     wait()是Object类里的方法,调用释放锁,即释放资源后进入被释放资源的等待池等待被notify。通常不给wait()指定时间,由于时间一到,线程也只是转入到就绪状态。wait()必须和notify()/notifyAll()在同步控制方法中一块儿使用。

9.Overload和Override的区别。Overloaded的方法是否能够改变返回值的类型?

    Overload是重载,是同一个类中的多态的体现。相同名字的函数改变参数个数或者参数类型能够实现重载。

    Override是重写,是父类和子类之间的多态的体现。若子类中定义的函数与父类中某函数具备相同的名称和参数,则该方法被重写。

    Overload重载的方法能够改变返回值的类型。
10.error和exception有什么区别?

    error表示恢复很困难的严重问题,如内存溢出。程序并不能处理这样的状况。

    exception指程序中的问题。在程序中,能够throw,也能够被捕捉进行处理。

11.abstract class和interface有什么区别?

    interface中有:

          变量(public、static、final),由于是static的,因此不经过对象访问;由于是final的,因此声明时须要有value(指定的或默认的)且该值不能修改。

          函数(public、static、abstract),不能有函数体实现,也就是函数声明后面没有{},直接跟;。

    abstract class中有:

          变量

          抽象函数,即没有方法体的函数

          通常函数

     interface体现的是“like a”,而abstract class体现的是“is a”,能够根据这个含义在实际应用中灵活使用接口或者抽象类。

     interface是实现(implement),abstract class是继承(extends)。

     interface能够继承多个interface,而且一个类能够实现多个interface,而一个类只能继承一个abstract class。

     abstract class能够实现interface。
12.内存分配的几种方式?

     栈(Heap),由系统申请和释放,存放函数的参数和局部变量。

     堆(Heap),由程序员申请。

     全局变量区,由系统申请和释放存放全局变量或者静态变量。

     常量区,存放常量字符串。

     代码区,存放代码。

13.heap和stack有什么区别?

    栈(Heap),由系统申请和释放,存放函数的参数和局部变量。栈的容量是有限的。存取效率高。

    堆(Heap),由程序员申请。堆的容量和虚拟内容有关。

14.GC是什么? 为何要有GC?GC有什么优势?

  GC是垃圾收集器的意思(Gabage Collection)。对象一旦被建立,GC就会监控它的内存地址,大小等使用状况,采用有向图的方法标记对象为可达或者不可达,当对象为不可达时,GC就会回收它。

     也可使用System.gc()主动进行垃圾回收,可是JVM回收垃圾的时间并不能获得肯定。

     Java中的垃圾回收机制可使程序员不去关注内存回收的状况,专一于本身的程序。

15.给我一个你最多见到的runtime exception。

    IndexOutOfBoundException越界

    NumberFormatException是Sring类型转换成数字类型型时出错。
16.List, Set, Map是否继承自Collection接口?
     List,Set是,Map不是

     List元素是有序可重复的,实现有ArrayList,Vector。

     Set元素是无序不可重复的,实现有HashSet,TreeSet。

 17.equals()和==的区别?

     ==是判断对象在内存中的地址是否相等。

     equals()是Object类里的方法,其实现使用==,因此,是判断对象在内存中地址是否相等。可是,在一些特殊类(如Integer,String)中,该方法被重写,能够判断内容是否相同。

18.是否能够继承String类?
    String类是final类故不能够继承。

19.swtich是否能做用在byte上,是否能做用在long上,是否能做用在String上?
    switch(expr1)中,expr1是一个整数表达式。所以传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能做用于swtich。

20.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,何时被执行,在return前仍是后?
    会执行,在return前执行。

21.两个对象值相同(x.equals(y) == true),但却可有不一样的hash code,这句话对不对?
   须要看这两个对象是什么。若是是String、Integer,会出现这样的状况,由于此时equals()是比较两个对象的内容。对于 通常的对象,equals()比较的是内存中的地址,因此,若是地址相同,则hash code也会相同。

22.编程题: 写一个Singleton出来。
   Singleton模式保证该类只有一个对象,而且易于访问。

 1    public class Singleton{
 2 
 3         private static Singleton instance;//private保证其余类不能直接访问Singleton的对象,static保证能够直接使用Singleton的名字,而非再在类外定义Singleton的对象。
 4 
 5         private Singleton()
 6 
 7         {
 8 
 9           //do something
10 
11         }  
12 
13         public static Singleton getInstance()//使Singleton的对象易于访问
14 
15         {
16 
17           if(instance==null) instance=new Singleton();
18 
19           return instance;
20         } 
22 
23 }

23.Java的接口和C++的虚类的相同和不一样处。
    因为Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能知足要求。与继承相比,接口有更高的灵活性,由于接口中没有任何实现代码。当一个类实现了接口之后,该类要实现接口里面所     有的方法和属性,而且接口里面的属性在默认状态下面都是public static,全部方法默认状况下是public.一个类能够实现多个接口。

24.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
    同步的实现方面有两种,分别是synchronized,wait与notify

25.进程、线程的基本概念、基本状态以及状态之间的关系

   进程是计算机中资源分配的基本单位,是程序的一次运行。

   线程是计算机中调度的基本单位,每一个程序至少都有一个线程。

   基本状态是:就绪、运行、阻塞或挂起、结束。

   运行start(),处于就绪状态,运行run()方法,处于运行状态,wait()是被挂起,dead()表示结束。

26.简述逻辑操做(&,|,^)与条件操做(&&,||)的区别。

    条件操做只能操做布尔型,逻辑操做不只能够操做布尔型,并且能够操做数值型

    条件操做会产生短路(肯定这个语句的结果后,后面的部分就再也不执行),逻辑操做不会产生短路。

27.j2ee经常使用的设计模式?说明工厂模式。

  Factory(工厂模式)

  Singleton(单例模式)

  Adapter(适配器模式)
工厂模式:工厂模式是一种常常被使用到的模式,根据工厂模式实现的类能够根据提供的数据生成一组类中某一个类的实例,一般这一组类有一个公共的抽象父类而且实现了相同的方法,可是这些方法针对不一样的数据进行了不一样的操做。首先须要定义一个基类,该类的子类经过不一样的方法实现了基类中的方法。而后须要定义一个工厂类,工厂类能够根据条件生成不一样的子类实例。当获得子类的实例后,开发人员能够调用基类中的方法而没必要考虑到底返回的是哪个子类的实例。

28.排序都有哪几种方法?

   插入排序:直接插入排序、希尔排序

   交换排序:冒泡排序、快速排序

   选择排序:简单选择排序、堆排序

   二路归并排序

   技术排序

29.JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别表明什么意义?在try块中能够抛出异常吗?

    Java中每一个异常都是一个对象,是Throwable类或其余子类的实例。

    throws用于函数声明的最后,代表该函数可能会发生的异常

    throw语句明确的抛出异常

    try语句块里是可能发生异常的程序,紧跟在try后面应该是catch语句块来捕捉“异常”的类型

    finally是无论语句块发生什么异常,总会执行的语句

30.一个“.java”源文件中是否能够包括多个类(不是内部类)?有什么限制?

    能够。可是必须只有一个public的类的名字与文件名相同。
31.java中有几种方法能够实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为什么不推荐使用?
    有两种实现方法,分别是继承Thread类与实现Runnable接口
    用synchronized关键字修饰同步方法
反对使用stop(),是由于它不安全。它会解除由线程获取的全部锁定,并且若是对象处于一种不连贯状态,那么其余线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这以前得到的锁定。此时,其余任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来讲,若是它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会形成死锁。因此不该该使用suspend(),而应在本身的Thread类中置入一个标志,指出线程应该活动仍是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()从新启动线程。举例

32.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
   字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。 

33.java中会存在内存泄漏吗,请简单描述。

   Java中内存泄露是指可以可达,可是不会再被使用的对象。而C/C++中内存泄露是指找不到,没法被回收的对象。

34.是否能够从一个static方法内部发出对非static方法的调用?
   不能够。这个在程序挑错里可能会出现。

  例如:

1 public class Something {
2 public static void main(String[] args) {
3 Something s = new Something();
4 System.out.println("s.doSomething() returns " + doSomething());
5 }
6 public String doSomething() {
7 return "Do something ...";
8 }
9 }

答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改为"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。

35.说出一些经常使用的类,包,接口,请各举5个

   经常使用的类:String、Integer、Math、FileReader、FileWriter

   经常使用的包:java.util、java.io、java.sql、java.lang、java.awt

   经常使用的接口:Runnable、List、Set、Map、Document

后续待补充

相关文章
相关标签/搜索