https://www.bilibili.com/video/BV1Eb4y1R7zd?from=search&seid=10716683573082248310&spm_id_from=333.337.0.0https://www.bilibili.com/video/BV1Eb4y1R7zd?from=search&seid=10716683573082248310&spm_id_from=333.337.0.0
上图是面试题链接
1.什么是面向对象:
①说倒面向对象就不得不说面向过程,这里我举一个例子;我需要去洗衣服。
如果是用面向过程的思想,那么就应该是: 我打开洗衣机,放衣服,关闭洗衣机,开始洗衣服。
如果是用面向对象的思想,那么就应该是: 人:打开洗衣机,放衣服,关闭洗衣机;洗衣机:洗衣服。
两者的区别是:面向过程更注重事情的顺序与步骤,而面向对象更注重事情的参与者与各自需要完成的事情,所以面向对象更加容易维护,扩展与复用。
②面向对象有三个特点:封装,继承,多态;
封装是指:内部细节对外部的调用透明,外部调用不需要修改与知道内部的实现,保证数据的安全。
继承是指:子类继承父类,子类有共性的方法直接使用父类,不需要自己再定义,只需要扩展自己的个性化就可以了。
多态是指:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
2.JDK,JRE,JVM的区别和联系:
JDK:java开发工具包 (开发人员使用)
JRE:java运行时环境 (提供给java程序用户使用)
JVM:java虚拟机
3.==与equals
==比较的是栈中的值,基础类型的变量值,引用类型比较的是引用地址;
equals默认没有重写的情况下与==没有区别,但在string类中进行了重写,内部实现是将字符一一取出进行比对。
4.final
修饰类:表示类不可被继承
修饰方法:表示方法不能被子类覆盖,但是可以重载
修饰变量:表示常量,不可修改
5.string,StringBuffer,StringBuilder的区别以及使用场景
string 是final修饰的,不可变,每次操作都会新生成一个string对象,对内存造成负担
stringBuffer和stringBuilder都是在原来的对象上进行操作,
stringbuffer线程是安全的,stringbuilder线程不安全,
性能:stringbuffer>stringbuilder>string 。
使用场景:多线程:striungbuffer,经常改变字符串使用stringbuilder,没有其他要求用string
6.重载和重写的区别
重载:发生在同一个类中,方法名相同,参数类型不同,个数不同,顺序不同,
重写:发生在父子类中,方法名,参数列表必须相同返回值范围小于等于父类,如果父类访问修饰符是private则不能重写该方法
7.接口与抽象类
①抽象类可以存在普通成员方法,而接口只能存在 public abstract 方法
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final 类型的
抽象类只能继承一个,接口可以实现很多个
②接口设计的目的是约束类行为的有无,但不对如何实现进行限制
抽象类的目的是代码复用
使用场景:当你关注一个事物的本质的时候,用抽象类。当你关注一个操作的时候,用接口。
8.List和Set的区别
List:有序,可重复,允许多个null元素,可以使用iterator取出所有元素逐一遍历,可以使用get(index)获取指定下标取出数据
Set:无序,不可重复,最有允许有一个null元素,取元素只能使用迭代器进行取出
9.hashcode与equals
hashcode()的作用是获取一个哈希码,散列码,是一个int类型的整数,哈希码的作用是确定该对象在哈希表中的索引位置
10.ArraryList和linkedList的区别
ArrayList:基于动态数组,在内存中需要连续的内存空间进行存储;存在扩容机制,在数组超出存储长度会进行扩容,创建新数组,并将旧数组数据复制到新数组中。ArrayList和linkedList集合有一个误区,普遍认为ArrayList的插入效率比linkedList低,因为涉及到扩容和数据复制。不过当ArrayList使用尾插法和指定出售长度得当,效率会大大高于linkedList。
linkedList:基于链表,可以存储分散的内存中,适合做新增和删除操作。不适合做查询:因为在linkedList底层,每增加一个元素就会新增一个node。当遍历的时候,需要从第一个元素开始遍历。而且如果使用元素索引返回元素,如果结果为空,会将整个集合进行遍历,非常影响性能。
11.HashMap和HashTable的区别?底层实现是什么?
区别:
①HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;
②HashMap允许key和value 为null,而HashTable不允许
底层实现:数组+链表实现
jdk1.8开始 链表高度到8,数组长度超过64 链表转为红黑树 元素以内部类Node节点存在
计算key的hash值,二次hash然后对数组长度取模,对应到数组下标;
如果没有产生hash冲突,则直接Node存入数组
如果产生hash冲突,先进行equals比较,相同则取代该元素,不同,则判断链表高度插入链表,链表高度达到8,并且数组长度到64转变为红黑树,长度低于6则将红黑树转为链表
key为null,存在下标0 的位置
数组扩容



