1、面向对象、面向过程的区别
面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)、及各自需要做什么
2、面向对象三大特性
封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项;
继承:继承基类的方法,并做出自己的改变和扩展;
多态:基于对象所属类的不同,外部对同一方法的调用,实际执行的逻辑不同。
3、==和equals的区别
==对比的是栈中的值,基本数据类型是变量值,引用数据类型是堆中内存对象的地址。
4、final的使用
修饰类:表示类不可被继承
修饰方法:表示方法不可被子类覆盖,但是可以重载
修饰变量:表示变量一旦被赋值就不可以更改它的值(成员变量和局部变量)
5、String、StringBuffer、StringBuilder
String是final修饰的,不可变,每次操作都会产生新的对象
StringBuffer和StringBuilder都是在原对象上操作
StringBuffer方法都sychronized修饰的
性能:StringBuilder>StringBuffer>String
场景: 经常使用改变字符串内容时使用后面两个。
6、重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private 则子类就不能重写该方法。
7、接口和抽象类的区别
抽象类可以存在普通成员函数,而接口中只能存在public abstract 方法;
抽象类中的成员变量可以是各种类型的,而接口的成员变量只能是public statsic final类型的;
抽象类只能继承一个,接口可以实现多个;
使用场景:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用借口。
8、List和Set的区别
List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素。
Set:元素,不可重复,最多允许有一个Null元素对象,取元素时只能Iterator接口取得所有元素,在主逐一遍历各个元素。
9、ArrayList 和LinkedList区别
ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度存数时需要新建数组,然后将老数组的数组拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入元素),使用尾插法并指定初始容量可以极大提升性能,甚至超过linkedList(需要创建大量的node对象);
LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐一遍历,遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对List重新遍历,性能消耗极大。
另外不要试图使用indexOf等元素索引,并利用其进行遍历,使用indexOf对List进行遍历,当结果为空时会遍历整个列表。
Java基础面试题(一)
于 2022-02-25 22:15:50 首次发布