这是我参与更文挑战的第18天,活动详情查看: 更文挑战
前言
今天介绍java面试中高频出现的阐述两两区别的问题。
一、String和StringBuilder、StringBuffer的区别?
String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
StringBuilder只能单线程使用,其方法都没有被synchronized修饰。
StringBuffer方法有被synchronized修饰,可以多线程使用,是安全的。
二、ArrayList和LinkedList的区别
从线程安全角度看,两者都是不同步,不能保证线程安全;
从底层数据结构,Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
从执行效率上, ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i),近似O(n)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。
LinkedList 采用链表存储,所以插入、删除元素的时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n),两者的效率区别不言而喻了。
是否支持快速随机访问 ,LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
三、Spring和SpringBoot的区别
Spring框架是一个平台,为Java应用的开发提供综合性的基础支撑,因此你可以聚焦业务开发,而不用关心基础开发。Spring Boot是Spring的扩展,主要是简化开发一些环境的搭建。
最大的区别就是Spring更多的需要人工配置,Spring Boot实现了自动装配,具体有哪些配置呢,应用容器配置、数据库配置、安全配置、测试和部署方便等等。
四、equal和==的区别
首先,equal和==最根本的区别在于equal是一个方法,而==是一个运算符。
1、对于java基本类型(short,int,long,byte,char,float,double,boolean)
比较基本类型,只能用==,不能用equal,这里的==比较的是两个变量的值
2、比较对象
==和equal比较的都是内存地址,因为equal没有被重写,没有被重写的equal都是object的equal方法。
equal()可以重写,在set集合中,jvm就是根据hashcode(),和equal()这两个方法来判断元素是否重复,如果要重写,建议两个方法一起重写,否则可能会出现安全性问题。
五、阐述final、finally、finalize的区别。
final:java关键字 ,修饰符,三种用法:一个类如果是由final修饰的,那么说明它不能再派生出新的子类,不能被继承,她和abstract是反义词。有方法被修饰,当然就有变量被final修饰,被修饰的变量不可改变,只能被读取不可修改,且在声明之时就要给定初值。
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
**finalize()**是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,
用法:调用super.finalize();