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

回眸只為那壹抹淺笑 提交于 2020-04-03 05:25:12

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

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

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

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

多态,相同的函数作用在不同的对象上会获得不同的结果。

封装,只给用户看用户需要看的东西。

 

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,而原始类型实例变量的缺省值与它们的类型有关。

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

后续待补充

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!