你遇到过哪些质量很高的 Java 面试?

你遇到过哪些质量很高的 Java 面试

前阿里P7面试官来强答一波。Java 面试题是很多技术岗位面试都会问到的问题,以下就是面试中常见的 Java 面试题,帮助大家拿下面试中的 Java 部分。

1.面向对象编程(OOP)的特征有哪些?

 

答:抽象、继承、封装、多态。

  1. 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。
  2. 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
  3. 封装:封装是把过程和数据包装起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。
  4. 多态:多态是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

2.什么是GC,其优点和原理是什么?

答:

GC是垃圾收集的意思(Garbage Collection),Java使用GC作为其内存管理机制。由于有垃圾回收的机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效地防止内存泄露,有效利用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收、标记垃圾回收和增量垃圾回收。垃圾回收机制使得编程者不需要手动管理内存,极大地提高了编程效率。

3.Java编程中,构造方法能否被重写和重载?

答:构造方法可以被重载,但不能被重写。

重载是指在一个类中,两个或两个以上的方法具有相同方法名和不同参数列表,则表示这些方法为重载方法。重写是指在父类和子类中,子类的方法和父类的方法具有相同方法名、相同参数列表、相同返回类型、子类的访问修饰符范围不小于父类的访问修饰符范围,异常的类型和个数不大于或多于父类的异常类型和个数,则表示该方法为重写方法。换句话说重载方法是区分同一个类中相同方法名的方法,重写方法是找到父类相同方法名的方法并重新改变方法的行为。

4.Java编程中,抽象类和接口的区别有哪些?

答:有下面五点区别:

 

6.Java编程中,内部类可以引用它的包含类中的成员吗?有没有什么限制?

答:可以引用。

当引用包含类时要用包含类的.this来引用。当引用包含类中的局部变量时,需要将局部变量指定为final。

7.Java编程中,对象是值传递还是引用传递?

答:这是个常见的问题,但是答案说法不一,两种说法都有,如下:

 

8.同步和异步有什么不同点?它们分别在什么时候使用?如何避免一个对象或者方法同时被多个线程访问?

答:

 

9.请使用两种方式实现线程安全的单例模式。

答:如下两种:

(1)饿汉式单例:

public class Singleton {
   private final static Singleton INSTANCE = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
      return INSTANCE;
}
}

(2)借助内部类,属于懒式单例,因为Java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的。内部类加载的时候实例化一次instance。

public class Singleton {
private Singleton() { }
private static class SingletonHolder {
          private final static Singleton INSTANCE = new Singleton();
   }
public static Singleton getInstance() {
       return SingletonHolder.INSTANCE;
    }
 }

10.Java编程中,sleep()和wait()方法的区别有哪些?

答:以下几点:

 

sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源。wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

sleep需要捕获异常,而wait不需要。

 

  1. 抽象类是abstract class修饰,接口是interface修饰。
  2. 抽象类可以有任意类型的属性,接口只能有静态常量属性。
  3. 抽象类可以有普通方法和抽象方法,接口的方法都是抽象方法。
  4. 抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
  5. 抽象类只能单根继承,接口可以多重实现。
  6. 作者:九章算法
    链接:https://www.zhihu.com/question/60949531/answer/311443343
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    5.Java编程中,使用接口时的注意事项有哪些?

    答:

  7. 接口中的字段全部默认为public static类型。
  8. 接口中的方法全部默认为public类型。
  9. 接口中可以申明内部类,默认为public static。正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。
  10. 接口本身可以申明为public或者缺省。
  11. 抽象类继承自某接口。如果在抽象类中实现了接口中的方法,在其子类可以不用实现,否则在子类必须实现。
  12. 基本数据类型的传递是值传递,实例对象的传递是引用传递。
  13. Java中没有指针,所以也没有引用传递,仅仅有值传递。实例对象传递的是其地址。
  14. 同步指同一时间只能一个线程执行同一个方法,其他线程需要等待。异步指多个线程可以同时执行同一个方法,并共享同一资源。同步可以让访问的资源具有安全性,因为同一时间只能一个线程对其进行访问。但是效率不高。异步对访问的资源会造成不稳定性,比如多个线程同时访问一个资源,一个在修改、一个在删除、一个在读取,这样可能会造成资源的混乱。但是由于同时运行,执行效率会得到提高。
  15. 当多个过程之间互不依赖和影响,为了提高程序的执行效率一般使用异步。但当两个过程之间有依赖关系,比如其中一个过程需要用到另一个过程的执行结果,一般则使用同步。
  16. 可以使用互斥锁实现资源的互斥,也就是说防止多个线程同时访问一个对象或者方法。在Java编程中,可以采用在相应的对象和方法前使用synchronized关键词等方式实现互斥。
  17. sleep是Thread类的方法,wait是Object类的方法。
  18. sleep可以用在任意方法中,wait只能用在同步方法或同步块中。

作者:九章算法
链接:https://www.zhihu.com/question/60949531/answer/311443343
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

11.Java编程中,作用域public, private, protected以及不写的区别?

答:

public为公共修饰符,表示任意类都可以访问。 protected为受保护的修饰符,表示同类、同包以及不同包但是父子关系的可以访问。 private为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。 不写表示默认修饰符,或者称为package修饰符,该修饰符表示只有同类或同包下的类可以访问,出了这个包就不能访问了。

12.Java中文件读写有哪些流?JDK为这些流提供了哪些抽象类?

答:Java中有三种文件流:

分别是字节流(InputStream, OutputStream)、字符流(Reader, Writer)、对象流(ObjectInputStream, ObjectOutputStream)。

字节流用于读取或写出二进制数据,比如图片、影像等数据。字符流用于读取或写出字

符数据,比如传输字符串。所有的数据都可以通过字节流来进行处理,不过如果是字符数据,用字节流还需要进行转换后传输,如果使用字符流可以更方便。

13.XML有哪些解析技术?有什么区别?

答:基本的解析方式有三种: DOM, SAX, Pull。

 

14.JSON和XML有哪些区别?

答:

 

移动互联数据交互格式有XML和JSON等。JSON和XML的数据可读性基本相同,二者都拥有丰富的解析手段。下面是几点区别:

 

15.什么是Java序列化,如何实现?

答:

 

16.Java编程中,“==”和equals方法有什么区别?

答:

 

17.Switch语句能否作用在byte、long、String上?

答:Switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。

18.Integer和int的区别是什么?

答:

Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。

19.Java编程中,运行时异常与一般异常的区别?

答:

 

20.try语句块里有一个return语句,那么紧跟在这个try后的finally语句块会不会被执行?如果会被执行,执行的时机是什么?

答: 会在return前执行。

21.在异常处理当中throw和throws有什么区别和联系?

答:

 

22.Java编程中,关键字final,finally和finalize的区别是什么?

答:

 

23.是否可以在一个static方法中使用非static变量或者方法?

答:不能,除非先创建非static方法所在类的对象。

24.ArrayList和Vector的区别,ArrayList和LinkedList的区别,HashMap和Hashtable的区别有哪些?

答:

 

25.String和StringBuffer有什么区别?

答:

String字符串的基本类,该字符串是不可变的。StringBuffer是利用堆来存储字符串,并且可以对字符串的内容进行改变。

26.Java编程中,Iterator和Enumeration的不同点?

答:

 

27.Java开发中常用的Collection FrameWork有哪些?

答:

Java中集合框架分为Collection和Map接口,Collection接口下的集合每个元素都由一个值组成,Map接口下的集合类每个元素都是由键值对组成。

Collection接口下面有List和Set接口,List接口下常见的类有ArrayList、LinkedList、Vector, 它们中的元素可以重复,并且是有序的。Set接口下常见的类有HashSet、 TreeSet,它们中的元素不能重复,并且是无序的。

 

 

  1. DOM解析解析器读入整个文档,构建一个驻留内存的树结构,然后程序中就可以使用DOM接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
  2. SAX解析基于事件驱动型,优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改查。
  3. PULL解析同样基于事件驱动型,Android官方API提供这种方法。
  4. JSON相对于XML来讲,数据的体积小。
  5. JSON与JavaScript的交互更加方便。
  6. JSON对数据的描述性比XML差。
  7. JSON的速度要远远快于XML。
  8. 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化为了解决在对对象流进行读写操作时所引发的问题。
  9. 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出,要恢复的话则用输入流。
  10. == 是判断两个变量或实例是不是指向同一个内存空间。equals是判断两个变量或实例所指向的内存空间的值是不是相同。
  11. == 是指对内存地址进行比较。equals是对字符串的内容进行比较。
  12. == 指引用是否相同。equals指的是值是否相同。
  13. 运行时异常是指继承于RuntimeException的异常,这些异常在编译时可以不进行处理,当运行时如果出现问题才会抛出。如NullPointException, ArrayIndexOutOfBoundsException。
  14. 一般异常也称为编译时异常,这些异常是继承Exception但又不属于RuntimeException的子类,如果程序中出现这些异常,在编译时必须进行捕获或抛出,否则编译无法通过,如IOException, FileNotFoundException。
  15. throw是在代码中抛出一个异常,后面跟的是异常对象,虚拟机运行到这里时会立即引发一个异常。
  16. throws是写在方法声明上的,表示声明该方法可能会抛出异常,后面跟的是异常类型。调用该方法的时候可以选择处理它或继续往外抛出。
  17. final是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。
  18. finally是异常处理块中的代码块,表示无论如何都会执行的代码块。
  19. finalize是Object类的方法,该方法在对象被垃圾回收之前被执行。
  20. ArrayList是JDK1.2的集合类并且线程不安全,Vector是JDK1.0的集合类并且线程安全,二者用法类似。
  21. LinkedList是链表结构的集合,ArrayList数组结构的集合。
  22. LinkedList在中间或前面增加或删除数据时效率比ArrayList高。
  23. LinkedList在最后添加或删除数据时效率比ArrayList低。
  24. 遍历数据时ArrayList效率高于LinkedList。
  25. HashMap线程不安全且能放空键或空值,Hashtable线程安全且不能放空键或空值。
  26. 函数接口不同
    Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。Iterator有3个函数接口,Iterator除了能读取集合的数据之外,也能数据进行删除操作。
  27. Iterator支持fail-fast机制,而Enumeration不支持。Enumeration是JDK 1.0添加的接口,使用到它的函数包括Vector, Hashtable等类,这些类都是JDK 1.0中加入的。Enumeration存在的目的就是为它们提供遍历接口,Enumeration本身并没有支持同步,而在Vector, Hashtable实现Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap, ArrayList等集合提供遍历接口。
  28. Iterator是支持fail-fast机制的。fail-fast机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
  29. 小编在学习过程中整理了一些学习资料,可以分享给做java的工程师朋友们,相互交流学习,需要的可以加入我的学习交流群 587675720 即可免费获取Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

    作者:dingyu002

    来源:dingyu002

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值