PS:不定期更新博文~我会把每次面试遇到的Java题尽量都写下来做记录
1、final类可以被继承吗?
答:final类不可以被继承,更不可以被重写,final 类中的所有成员方法都会被隐式地指定为 final 方法。
【拓展】
- final 修饰变量时,该变量为常量,值不可变。若修饰基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果修饰引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- final 修饰对象时,值可变,引用地址不可以改变。
- final 修饰方法时,方法不可重写,但可以重载。注意:因为重写的前提是子类可以从父类中继承此方法,如果父类中 final 修饰的方法同时访问控制权限为 private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,也不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。)
2、构造函数能否重写?
答:构造函数只能被重载,不能被重写。
重写的定义是方法名称相同,方法参数列表,返回值也要相同,只有继承了父类,子类才可以重写,但是子类的名称和父类的名称是不能一样的,从而构造函数的名字也是不一样的,所以就谈不上重写了 。
3、java基础数据类型(8种)
- 六种数字类型(四个整数型,两个浮点型):byte、short、int、long、float、double
- 一种字符类型:char
- 一种布尔型:boolean
【拓展】
- Java为每一个基本数据类型都引入了对应的包装类型
- 基础数据类型:boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
- Java中的基本数据类型只有8个,除了基本类型外,剩下的都是引用类型。
4、Servlet 生命周期的四个阶段
- 装载类及创建实例阶段:创建 Servlet 对象。
- 初始化阶段:在第一次创建 Servlet 对象时调用 init() 方法,初始化 Servlet 的信息,在后续每次用户请求时不再调用。
- 服务阶段:调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法。
- 销毁阶段:调用destroy()方法来销毁Servlet对象。
5、Java 文件中是否可同时包含两个 public 类?
答:可以有多个类,但只能有一个public的类,并且 public 的类名必须与文件名相一致(是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件)。因为编译器在编译时,针对一个 java 源代码文件只会接受一个 public 类,否则报错。但 public 类不是必须的,java 文件中可以没有 public 类。
6、HashMap 和 HashTable 的异同点
- 都实现了Map接口
- Hashtable是synchronized,而HashMap是非synchronized
- Hashtable是线程安全的,HashMap是非线程安全的。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
- Hashtable、HashMap都使用了 Iterator。而Hashtable还使用了Enumeration的方式 。HashMap的Iterator是fail-fast迭代器。JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,HashTable也是使用fast-fail的。
- 计算hash值的方法不同:Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模。HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸。
- HashMap可以使用null作为key,而HashTable不允许。
- 判断是否含有某个键:在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。Hashtable 的键值都不能为null,所以可以用get()方法来判断是否含有某个键。
7、Java 提供的并发编程同步器有哪些?
- CyclicBarrier:障栅,适合于线程数量固定的情况
- CountDownLatch:倒计时门闩
- Semaphore:信号量
- SynchronousQueue:同步队列
- Exchanger:交换器
- Phaser:阶段化处理,一个可复用的同步障栅
【拓展】
- 同步器:在多线程中,经常需要多个线程相互合作完成一项任务,使用同步器可以要求线程间能够进行协调。
- 障栅:相当于程序中的一个集合点,当结果在中间步骤需要整合的时候会用到它。当线程需要等待其他线程时,可以让该线程运行到障栅处,一旦所有线程都到达了这个障栅,障栅就撤销,线程可以继续向下运行。
- 倒计时门闩:只有等待的线程到达一定的数量,计数器值递减为零时,门闩才会打开,线程才可以继续执行。
- 同步队列:一个没有数据缓冲的阻塞队列。在同步队列上的插入操作必须等待相应的删除执行完成后才能执行,反之亦然。
- 交换器:通过方法exchange将其数据提供给另一个线程,并接收另一个线程的数据。
- 阶段化处理:把一件事情分为若干个阶段,然后规定每个阶段的任务和完成时间,从而实现阶段化的控制和管理,阶段化处理往往在完成某一项复杂工作时很高效。
8、子类可以访问父类 private 属性吗?可以访问父类 protected 属性吗?
答:子类不可以访问父类 private 属性,可以访问父类 protected 属性
- 要想在子类中访问父类的private属性,可以调用父类的get set方法来访问。
- protected:本包可以访问,子类可以继承。
9、JAVA的反射机制主要提供了哪些功能?
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
10、下面关于索引的描述不正确的是( B )。
A.索引是一个指向表中数据的指针
B.索引是在元组上建立的一种数据库对象
C.索引的建立和删除对表中的数据毫无影响
D.表被删除时将同时删除在其上建立的索引