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 类的 notify,notifyAll 和 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、如何使一个类不可变?
我认为这是一个相当困难的问题。您需要对类进行多次修改,以实现不可变性:
- 将类声明为
final,使其无法被继承。 - 所有域都用
private修饰,不允许直接访问。 - 不提供变量的
setter方法。 - 所有可变域都用
final修饰, 使它的值只能分配一次。 - 通过构造函数执行深克隆初始化所有域。
- 对
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

浙公网安备 33010602011771号