【面试题】-java最基础的面试题汇总

目录

 

1.面向对象的三大特性

2.什么是多态

3.多态的好处

4.虚拟机是如何实现多态的

5.final关键字加在类,方法,变量上分别有什么作用

6.static关键字的作用

7.接口和抽象类的区别

8.父类的静态方法能否被子类重写

9.什么是不可变对象

10.静态变量和实例变量的区别

11.java创建对象的几种方式

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

13.String对象的intern()

14.Object中有哪些公共方法

15.java当中的四种引用

16.java中==和equals()的区别

17.equals()和`hashcode的联系

18.a=a+b与a+=b有什么区别

19.一个java文件内部可以有类(非内部类)

20.内部类的作用

21.java中int char,long各占多少字节

22. 64位的JVM当中,int的长度是多少

23.int和Integer的区别

24.String, StringBuffer和StringBuilder区别

25.java当中使用什么类型表示价格比较好

26.可以将int强转为byte类型么 会产生什么问题

27.垃圾回收算法

28.你了解Fail-Fast机制吗

29.Fail-Fast和Fail-safe的区别

30.SimpleDateFormat是线程安全的吗?

31.Error和Exception的区别

32.throw和throws的区别

33.Serializable 与 Externalizable 的区别

34.简单解释一下类加载器

35.自定义类加载器的两种方式

36.简述堆和栈的区别

37.JDK 1.7特性

38.JDK 1.8特性


1.面向对象的三大特性

继承,封装,多态.

2.什么是多态

在面向对象的语言中,接口的多种实现方式即为多态,具体表现为在编译时体现父类的特性,但在运行时期体现子类的特性.

3.多态的好处

降低耦合,各个模块只负责编写各自的功能实现;方便了接口的调用,调用者只需要编写一处调用的代码,不必为每种实现都写一种调用.

通过继承实现的多态还可以把一些公用的方法放到父类中去实现,把一些个性化的方法放到子类中去实现,从而减少代码量.

4.虚拟机是如何实现多态的

动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法。

5.final关键字加在类,方法,变量上分别有什么作用

final关键字加在类上,该类不能被继承.

final关键字加在方法上,表明该方法不能被覆盖/重写.

final关键字加在变量上,表明该变量必须初始赋值,而且只能被赋值一次.

6.static关键字的作用

static关键字可以修饰成员变量,也可以修饰成员方法,加了static关键字修饰的变量或方法会在jvm类加载时优先于对象被加载进内存,所以静态方法可以直接被调用而不需要new创建对象的实例.被static关键字修饰的变量属于类不属于任何实例,不管创建多少个类的实例对象,该变量都只会被加载进内存一次,内存中仅存在一份该变量.

7.接口和抽象类的区别

接口是可以被多实现的,而抽象类只能被继承一次.

抽象类中可以封装一些子类都需要实现的逻辑,而接口中不能写具体的实现.

抽象类中可以有构造器,但接口中不能有构造器.

8.父类的静态方法能否被子类重写

不能,重写仅限于实例方法,静态方法不能够被重写,若子类中有和父类相同签名的静态方法,我们称之为隐藏.

9.什么是不可变对象

不可变对象就是一旦对象被创建,状态就不能够被改变,任何修改都会产生一个新的对象,比如String,Integer及其它包装类.

10.静态变量和实例变量的区别

静态变量属于类,处于方法区中,实例变量存在于堆中,其引用存在于当前线程栈,在垃圾回收时,静态变量不会被回收,实例变量可能会被回收.

11.java创建对象的几种方式

new

反射

clone

通过序列化机制

12.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”);

13.String对象的intern()

调用String对象的intern()方法,会优先去常量池中查找是否已经有该常量值,如果有则直接返回该常量值,如果没有则添加一个该值的常量到常量池中并返回.

14.Object中有哪些公共方法

equals,toString,wait,notify,notifyAll,getClass,clone

15.java当中的四种引用

java当中的四种引用主要体现在GC回收

强引用 在任何情况下都不会被GC回收,即便是内存不够用的情况下,jvm会抛出outOFMemoryException,也不会将强引用对象垃圾回收,如果要中断强引用和某个对象之间的联系,可以显示的将引用赋值为Null,这样该强引用对象就会被垃圾回收.

软引用 常被用于缓存,也就是说在内存充足的情况下软引用一般是不会被垃圾回收的,只有当内存不足时,软引用才会被垃圾回收.

弱引用 弱引用对象拥有的生命周期一般比较短,在垃圾回收时无论内存是否充足,弱引用会被立即回收.

虚引用 即根本不存在引用,形同虚设,在任何情况下都会被垃圾回收.

16.java中==和equals()的区别

==是运算符,基本数据类型用==,equals是Object类的方法,用于对象的比较.

调用==其实是在比较内存地址,调用equals比较的是内容.

17.equals()和`hashcode的联系

如果两个对象的equals相等,那么他们的hashcode也相等,在存在哈希碰撞的情况下,两个对象的equals不相等,hashcode也可能相等.

18.a=a+b与a+=b有什么区别

a+=b 是含有隐式的类型转换,而a=a+b则不会自动转换类型.

比如int byte a = 127, byte b = 127, a += b 不会报错,会自动将a+b后的结果升级为Int类型,而a = a + b 会报错.

19.一个java文件内部可以有类(非内部类)

一个Java文件只能有一个public修饰的类,但可以拥有多个default修饰的类.

20.内部类的作用

内部类提供了更好的封装,除了该内部类的外围类可以访问,其他类都不能访问该内部类.

21.java中int char,long各占多少字节

short/char 2字节 16位

int/float  4字节 32位

long/double 8字节 64位

22. 64位的JVM当中,int的长度是多少

int长度与平台无关,都是32位.

23.int和Integer的区别

int是基本数据类型,Integer是对象类型.

int的默认值是0,Integer的默认值是Null.

int和Integer之间可以通过装箱和拆箱进行转换.

24.String, StringBuffer和StringBuilder区别

String是字符串常量,用final修饰.StringBuffer是字符串变量,用synchronized修饰,线程安全,StringBuilder线程不安全.

从性能上来看StringBuilder>StringBuffer>String.

25.java当中使用什么类型表示价格比较好

如果不考虑性能和内存开销的话,使用BigDecimal类型更好,否则使用固定精度的Double.

26.可以将int强转为byte类型么 会产生什么问题

可以是可以,但强转会导致位数丢失.

27.垃圾回收算法

标记-清除算法

标记清除算法也有种叫法是:白灰黑三色算法,第一遍进行标记,将存活对象标记为白色,将被引用的对象标记为灰色,将无引用的对象标记为黑色,第二遍进行清除,将标记为黑色的节点进行垃圾回收,实际上并不存在这三色,仅仅是为了帮助理解.

标记-复制算法

在Young区的surivor区(简称S区)被划分为两块等大的区域s0和s1区,s0和s1区中始终有一块区域是空着的,在第一阶段进行标记,把标记为有用的对象都转移到空的区域中,然后把标记为无用的对象给清除,如此循环往复...

标记-整理算法

在有大量存活对象时,标记复制算法会进行很多次复制,于是出现了标记整理算法来解决该问题,标记整理算法的标记阶段跟标记清除算法一样,不同的是在标记完成后,所有存活对象都会向另外一段移动,然后清理掉边界以外的元素.

分代回收算法

垃圾回收这块不清楚的可以去我jvm分类下看,那边有详细讲解.https://blog.csdn.net/lovexiaotaozi/article/details/82883365

28.你了解Fail-Fast机制吗

Fail-Fast意为快速失败,是java中集合类的错误检测机制,当多个线程同时对一个集合进行结构改变时,有可能产生fial-fast机制,抛出ConCurrentModificationException.

29.Fail-Fast和Fail-safe的区别

java.util 包下的集合类的迭代器都是Fail-Fast的,在多个线程同时对一个集合进行结构改变时,可能会抛出ConcurrentModificationException;java.util.concurrent包下的集合类迭代器都是Fail-safe的,Fail-safe从不会抛出ConcurrentModificationException.

30.SimpleDateFormat是线程安全的吗?

不是,DateFormat的所有实现都是线程不安全的,如果一定要在多线程中使用日期格式化,推荐使用Joda-Time库,不仅线程安全,在使用上也非常易用.

31.Error和Exception的区别

Error一般是比较严重的且系统无法处理和捕获的异常,比如outOfMemoryError,而Exception一般是不太严重的错误,系统一般是可以捕获并处理的,这类异常一般不影响程序的正常运行,常见的比如RuntimeException.

32.throw和throws的区别

throw用于主动抛出一个异常,比如我们常在写业务的过程中throw一个自定义的异常,另外throw用于在方法内部抛出异常.

throws用于在当前方法无法处理或者不想处理该异常时,可以向上抛出该异常,由它的上一级去处理,若它的上级处理不了,上级还可以继续向上抛,直到有一个可以处理的上级为止.

33.Serializable 与 Externalizable 的区别

Serializable是java提供的一种序列化接口,以便于各种内容在网络上和磁盘上传输,是jvm默认的序列化方式,优点是自动化,无需去实现该代码中的逻辑,缺点是性能低,脆弱,不安全,Externalizable是Serializable的子类,它可以控制序列化的过程,在资源开销上要比Serializable少,缺点是需要自己去重写readExternal和writeExternal方法.

34.简单解释一下类加载器

在java中,类的加载可以分为五步

加载->连接->初始化->使用->卸载

其中连接可以细分为3步:

校验->准备->解析

完整的过程如图:

ç±»å è½½çå½å¨æå¾

java的类加载采用双亲委派机制,类的加载会优先调用其父类的加载器去加载,如果父类加载器无法完成加载,就会调用父类的父类加载器...直到加载请求被传递到顶层的bootstrapClassLoader中,如果顶层类加载器也无法完成加载时,才会调用其自身的类加载器,这样就可以避免类的重复加载,也可以让类的加载更安全.

35.自定义类加载器的两种方式

遵守双亲委派模型: 继承ClassLoader类,重写findClass()方法

破坏双亲委派模型:继承ClassLoader类,重写loadClass()方法

36.简述堆和栈的区别

堆:用于存放对象,jvm的垃圾回收主要发生在堆区,可以被多个线程共享.

栈:用于存放方法帧和局部变量,不能被多个线程共享.

37.JDK 1.7特性

新增了try-with-resource,可以在try(){}catch(){}中自动关闭资源.

新增了在switch语句中支持String类型.

38.JDK 1.8特性

新增了lambda表达式,链式编程.

新增了LocalDate类,是不可变类和线程安全的.

39.BIO,NIO,AIO的区别

BIO:是同步阻塞IO,每个连接就占用一个线程.以网上一个经典的烧开水的例子,帮助理解:假设有一排水壶都在烧开水,BIO的工作模式就是让一个线程停留在一个水壶上,直到这个水壶的水烧开了,再去处理下一个水壶,实际上在线程等待水壶水烧开的这段时间,啥也没做,浪费了资源,所以BIO比较慢.

NIO:同时支持同步阻塞/非阻塞IO,每一个请求占用一个线程.还以烧开水为例,NIO是让一个线程去轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步操作.

AIO:异步非阻塞IO,每一个有效请求占用一个线程.继续以烧开水为例,AIO相当于在每个水壶上装了一个提示装置,当水烧开时自动通知线程来处理.

基础部分的面试题暂时梳理到这里,特别感谢作者提供资料:https://blog.csdn.net/dd864140130/article/details/55833087

发布了89 篇原创文章 · 获赞 70 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lovexiaotaozi/article/details/89448429