java基础题简答

1、比较两个对象相等需要重写什么方法?

答:比较两个对象是否相等需要重写hashCode()和equals()方法。对象会先比较hashCode值是否相等,相等才会调用equals去比较。hashCode相等,两对象不一定相等,但是两对象相等,hashCode一定是相等的。

2、重载和重写的区别

答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载,重载对返回类型没有特殊的要求;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。

3、抽象类和接口类的区别

答:1、语法上
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2、设计上
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
通过图表来显示二者的对比:
java基础题简答_第1张图片

4、static和final的区别

答:1)final可以修饰:属性,方法,类,局部变量(方法中的变量);static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类),但是不可以修饰局部变量。
2)final修饰的属性的初始化后不能被改变,相当于一个宏定义,是一个常数;static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变,它只加载一次。
3)final修饰的方法表示该方法在子类中不能被重写,修饰的类表示该类不能被继承;static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等。

备注:static跟具体对象无关,而this、super正好跟具体对象有关,因此不能同时使用static和this或者static和super。
static final和final static没什么区别,static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问,修饰方法的时候该方法不能重写,并且调用的时候可以直接类名.方法名,无需new一个类。

5、List和Set的区别

答:List和Set都是接口继承于Collection接口;最大的不同就是List是可以重复的,而Set是不能重复的。
List接口有三个实现类:LinkedList,ArrayList,Vector,它适合经常追加数据,插入,删除数据;
Set接口有两个实现类:HashSet,LinkedHashSet,适合经常地随机储存,插入,删除。
备注:Set是如何实现元素不重复的?
答:1、存入元素的时候会在内存中申请一个空间,并且各个空间都有相应的HashCode。2、对想要存入HashSet回调用对象的hashCode()获取对应的哈希值,并尝试放入对应的空间中,如果该空间中没有对象,则直接放入,如果有,会再调用对象的equals()比较。3、空间中的对象调用equals()与要传入的对象进行比较,如果为false,则表示两个对象非重复,可以存入,反之不存。

6、equals和==的区别

答:1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的“值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量;如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。
总结:equals只是单纯比较值的大小,==比较的是地址和值。

7、序列化和反序列化

答:1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。利用序列化把对象的字节序列永久地保存在硬盘中的某个文件中,有效地节约了运行空间。

8、sleep()和wait()的区别

答:1、sleep()方法是属于Thread类中的,而wait()方法是属于Object类中的。
2、sleep()方法只是让程序暂停执行指定的时间,让出cpu该其他线程,当指定的时间到了又会自动恢复运行状态,在此期间它的监控状态一直保持着。并且在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

你可能感兴趣的:(面试)