常见Java基础面试总结

1. final 在 Java 中有什么作用?

  • 修饰的类不可以被继承
  • 修饰的方法不可以被重写
  • 修饰的变量不可以被重新赋值。final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

2. 抽象类与接口的比较

共同点:1)不能实例化 2)都位于顶端,需要继承或实现 3)都包含抽象方法
不同点:在这里插入图片描述

3. 抽象类和普通类的比较

抽象类可以包含抽象方法,普通类不能包含抽象方法
抽象类不能被直接实例化,普通类可以直接实例化

4. 抽象类不能用final修饰

定义抽象类就是让子类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾

5. 静态变量与普通变量区别

  • 静态变量是对象共享的,在内存中只有一个副本,它只有在类第一次加载时被初始化。
  • 非静态变量是对象所私有的,在创建对象的时候被初始化,对象之间互不影响。

6. ==与equals()方法的区别

  • ==是运算符,基本类型比较的是值是否相等,引用类型比较的是内存地址相同
  • equals()是Object类的方法,本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。

7. Object类中的hashCode()与equals()

hashCode()方法是为对象产生整型的 hash 值,用作对象的唯一标识。将对象放入到集合中时,首先判断要放入对象的hash值在集合中是否存在,不存在则直接放入集合。如果hash值存在,然后通过equals()方法判断要放入对象与集合中的对象是否相等,如果equal()判断不相等,直接将该元素放入集合中,否则不放入。

8. 为什么重写equals()时必须重写hashCode()方法?

根据 hashcode 的规则,两个对象相等其 hash 值一定要相等。当我们自定义对象时,例如:

	Student stu1 = new Student("Tom",24);
	Student stu2 = new Student("Tom",24);

如果重写了 equals() 而未重写 hashCode() 方法,因为equal都是根据对象的特征进行重写的,因此stu1 = stu2。但是由于默认的 hashCode()方法是根据对象的内存地址经哈希算法得来的,两者的 hash 值不一定相等。故违背了hashcode 的规则,因此重写equals()时必须重写hashCode()方法。

9. hashCode() 相同,那么 equals() 也一定为 true吗?

不一定。以hashMap为例,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对包含的内容相等。

10. hashCode()中可以使用随机数字吗?

不行,因为同一对象的 hash 值必须是相同的。

11. BIO,NIO,AIO 有什么区别?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制

12. String,StringBuilder,StringBuffer的区别

  • String类中使用final字符数组保存字符串,所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中使用非final字符数组保存字符串,这两种对象都是可变的。
  • String中的对象是不可变的,也就可以理解为常量,线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

13. String s=new String(“abc”)创建了几个对象?

  • 如果字符串常量池中含有"abc",此时只在堆中创建了一个对象new String(“abc”);
  • 如果字符串常量池中没有"abc",,则会创建两个对象。一个在常量池中创建共共享的"abc",一个在堆中创建了对象new String(“abc”)。

14. String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

15. String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

16.获取反射机制的方式?

  • 反射机制:允许程序在执行期间借助反射的API获取任何类的内部消息,并能直接操纵类的内部属性以及方法
  • 获取反射的三种方法:
    1.Class.forName(“类的全路径”)
    2.类名.class
    3.实例.getClass()
	//方式一
    Class obj1 = Class.forName("fanshetest.Student");
	//方式二
	Class obj2 = Student.class;
    //方式三
    Student stu = new Student();
    Class obj3 = stu.getClass();

17.Java的序列化和反序列化

  • 序列化:就是将内存中的对象转换为字节序列,方便持久化到磁盘或者网络传输。
  • 反序列化:就是将字节序列转换为内存中的对象,可以是文件中的,也可以是网络传输过来的
  • 对象实现序列化的要求
    1.实现Serializable接口
    2.对象所在的类提供一个常量—>序列版本号
    3.对象的属性也是可序列化的

17. Java创建对象的四种方式

  • 通过new语句实例化一个对象。
  • 通过反射机制创建对象。
  • 通过clone()方法创建对象。
  • 通过反序列化创建对象。

18. Error和Exception的区别

Error和Exception都是Throwable的子类

Error:这是程序无法处理的错误,一旦出现,程序只能停止运行。比如SOF,OOM等
Exception:程序可以处理的异常,捕获后可能恢复;分为两类

  • CheckedException检查异常,编译不通过。比如int a = “abc”;
  • RuntimeException运行时异常,常常发生在程序运行过程中,导致程序运行失败。比如 int a = 10 / 0;

19. 浅拷贝和深拷贝的区别

  • 浅拷贝
    (1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。
    (2) 对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝只是把内存地址赋值给了成员变量,它们指向了同一内存空间。改变其中一个,会对另外产生影响。
  • 深拷贝
    (1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。(和浅拷贝一样)。
    (2) 对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。

20. 其他

集合常见面试题
并发编程常见面试题目
JVM常见面试题汇总
MySQL数据库常见面试题目
Spring常见面试题总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

corlor_龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值