Java面试题

1、java 创建对象的方式

采用new,通过反射,采用clone,通过序列化机制;

前2者都需要显式地调用构造方法. 造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用.

2、不可变对象

指对象一旦被创建状态不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

3、HashMap的实现原理

HashMap的底层实现是“基于拉链法的散列表”。数组+链表

4、String 是最基本的数据类型吗?

不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

5、float f=3.4;是否正确?

不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

6、Get/Post对缓存的影响

此题其实是问浏览器缓存对于HTTP Method中Get和Post的请求是否支持,答案是不支持Post Method。Get可以被浏览器缓存

7、代码中如何实现多态

接口实现;继承父类重写方法;同一类中进行方法重载;

8、接口的意义

接口的意义用三个词就可以概括:规范,扩展,回调.

9、抽象类的意义

为其他子类提供一个公共的类型;封装子类中重复定义的内容;定义抽象方法,子类虽然有不同的实现,但是定义时一致的;

10、阐述 Java 7 和 Java 8 的区别。

  • lambda 表达式,Java 8 版本引入的一个新特性。lambda 表达式允许你将功能当作方法参数或将代码当作数据。lambda 表达式还能让你以更简洁的方式表示只有一个方法的接口 (称为函数式接口) 的实例。
  • 方法引用,为已命名方法提供了易于阅读的 lambda 表达式。
  • 默认方法,支持将新功能添加到类库中的接口,并确保与基于这些接口的旧版本的代码的二进制兼容性。
  • 重复注解,支持在同一声明或类型上多次应用同一注解类型。
  • 类型注解,支持在任何使用类型的地方应用注解,而不仅限于声明。此特性与可插入型系统一起使用时,可增强对代码的类型检查。

11、Object 类包含哪些方法?

以下是每个对象都具有的方法:

在 java.lang 包中,Object 类位于类层次结构的顶端。每个类都是 Object 类直接或间接的子类。你使用或编写的每个类都继承了 Object 类中的实例方法。你并不需要使用这些方法中的任何一种,但是,如果你选择这样做,则可能需要用你的类的特定代码来重写这些方法。以下是本节所讨论的从 Object 类中继承的方法:

  • protected Object clone() throws CloneNotSupportedException 创建并返回此对象的副本。
  • public boolean equals(Object obj) 判断另一对象与此对象是否「相等」。
  • protected void finalize() throws Throwable 当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法。
  • public final Class getClass() 返回此对象的运行时类。
  • public int hashCode() 返回此对象的散列码值。
  • public String toString() 返回此对象的字符串表示形式。

Object 类的 notifynotifyAll 和 wait 方法都在同步程序中独立运行线程的活动方面发挥了作用,这将在后面的课程中讨论,在此不做介绍。其中有五种方法:

  • public final void notify()
  • public final void notifyAll()
  • public final void wait()
  • public final void wait(long timeout)
  • public final void wait(long timeout, int nanos)

12、final,finally,和 finalize 三者之间有什么不同?

  • final 关键字用于在多个语境下定义只能分配一次的实体。
  • finally 代码块是用于执行重要代码 (如关闭连接、流等) 的代码块。无论是否处理异常,finally 代码块总会被执行。finally 代码块紧随 try 代码块或 catch 代码块。
  • 这是在删除或销毁对象之前垃圾回收器总会调用的方法,该方法使得垃圾回收机制能够执行清理活动。

13、如何使一个类不可变?

我认为这是一个相当困难的问题。您需要对类进行多次修改,以实现不可变性:

  1. 将类声明为 final,使其无法被继承。
  2. 所有域都用 private 修饰,不允许直接访问。
  3. 不提供变量的 setter 方法。
  4. 所有可变域都用 final 修饰, 使它的值只能分配一次。
  5. 通过构造函数执行深克隆初始化所有域。
  6. 对 getter 方法获取的对象执行克隆以返回副本,而不是返回实际的对象引用。

14、依赖注入和工厂模式之间有什么不同?

  • 依赖注入主要是一种结构性的模式,更加注重的是类与类之间的结构,它要达到的目的就是设计原则中最少知道和合成复用的原则,减少内部依赖,履行单一职责,最终就是强解耦。依赖注入目前最好的实现就是依赖注入容器。

  • 工厂是一种创建对象的模式,更加注重的是生产一个对象

15、

String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4请问s5==s2返回什么?

返回false。在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=new String(“ab”);

16、你对String对象的intern()熟悉么?

intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回。
比如 
  String s1=”aa”; 
  String s2=s1.intern(); 
  System.out.print(s1==s2);//返回true

17、linux命令下如何查看网卡的流量

https://blog.csdn.net/JackLiu16/article/details/79157105

posted @ 2019-04-15 20:45  SevenStar  阅读(240)  评论(0)    收藏  举报