JAVA面试 之 简答题

(一)override与overload有何异同?

Override(重写):是指子类重新定义了父类同名的方法,方法重写也叫方法覆盖。
Overload(重载):是在一个类中,多个方法具有相同的方法名称,但却具有不同的参数列表。
相同点:
	它们存在的形式都是方法名相同。
不同点:
	1)重写是要求子类重新定义的方法与父类的方法名称相同、参数列表相同、返回值类型相同、访问修饰符权限要大于等于、抛出的异常类型要小于等于父类的。
	2)重载是在一个类中有两个或两个以上的方法名称相同、参数列表(参数个数、参数型、参数顺序) 不相同,与参数名称、返回值类型、访问修饰符权限、抛出的异常类无关。 

(二)抽象类与接口有什么区别?

相同点:
	两者都不能实例化、都可以包含抽象方法。
不同点:
	1)子类只能继承一个直接抽象类、子类可以实现多个接口。
	2)抽象类中可以有实例成员(实例变量、实例方法)、静态成员(静态变量、静态方法)、抽象方法、内部类。抽象类中的成员方法不能用default关键字修符。
	接口中只能有常量、抽象方法、内部类、jdk8.0新增特性后,接口中可以有实现体的静态方法以及用default关键字修饰符的实现体方法。
	3)接口中成员的访问修饰符权限必须都是public,抽象类中没有此要求。
	4)抽象类中可以定义构造方法,接口没有构造方法。
	5)抽象类的最高父类是Object,接口没有最高父类。

(三)类变量和实例变量有何区别?

相同点:
	都是类内的成员变量。
不同点:
	1)类变量也叫做静态变量,属于类的成员,可以直接用类名去调用,也可以用对象名去调用。实例变量属于类创建的实例对象,可以用实例名去调用。
	2)它们初始的时机不同,类变量在类名出现的第一次就被初始化。实例变量是在创建实例时进行初始化,随着实例对象的销毁而释放内存。
	3)类变量是所有的实例对象共享一个类变量数据,实例变量只属于创建它的这个实例对象。

(四)ArrayList,Vector, LinkedList的区别?

相同点:
	它们都是List接口的实现子类,它们都可以用下标索引去获得元素。
不同点:
	1)ArrayList、Vector都是线性表,它们本质还是数组。
	2)ArrayList是非线程安全,Vector是线程安全。查找数据效率高,速度快。添加、删除数据效率低,速度慢。
	3)LinkedList是链性表。元素存储空间地址不连续。查找数据效率低,速度慢。添加、删除数据效率高,速度快。

(五)HashMap和Hashtable的区别?

相同点:
	它们都是Map接口实现子类,它们存储方式都是以键值对的形式存储。
不同点:
	1)HashMap是非线程安全,Hashtable是线程安全。所以HashMap比Hashtable的性能更高。
	2)HashMap它的键或value可以用null,Hashtable它的键和值不可以为null。
	3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 
	4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
	5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

(六)sleep()和wait()的区别?

1)sleep()的父类为Thread;wait的父类为Object。
2)sleep()休眠一段时间会自动的醒来而wait()需要notify()或者notifyAll()才会醒来。
3)sleep()休眠时不会放弃钥匙;wait()会放弃钥匙。
4)sleep()在锁池;wait()在等待池。

(七)Lock和synchronized的异同?

相同点:
	都可以使多个线程实现同步,Lock能完成synchronized所实现的所有功能。
不同点:
	1)lock是接口,而synchronized是关键字
	2)Lock有比synchronized更精确的线程语义和更好的性能。
	synchronized如果出现异常就会扔掉锁(释放锁);lock在出现异常时不会不会释放锁只有手动在finally里用unlock释放锁
	3)lock让线程中断去干别的事,而synchronized不可以
	4)lock可以知道有没有成功获取锁,而synchronized无法办到

(八)线程与进程的区别?

进程:
	每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1——n个线程。
线程:
	同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
线程和进程一样分为五个阶段:
	创建、就绪、运行、阻塞、终止。
多进程:
	是指操作系统能同时运行多个任务(程序)。
多线程:
	是指在同一程序中有多个顺序流在执行。
在java中要想实现多线程,有三种手段,:
	一种是继承Thread类,重写run方法;另外一种是实现Runable接口,重写run方法;还有就是实现Callable接口,重写call方法。

(九)简述oracle中 dml、ddl、dcl的使用?

Dml 数据操纵语言,如select、update、delete,insert 
Ddl 数据定义语言,如create table 、drop table 等等 
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等 

(十)String 和StringBuffer的区别?

相同点:
	JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。
不同点:
	String类提供了内容不可改变的字符串,字符串常量,存储在内存的常量池中。
	而StringBuffer类提供的字符串进行修改,字符串变量,存储在内存的堆中。
当字符数据要改变的时候可以使用StringBuffer。也可以使用 StringBuffer来动态构造字符数据。

(十一)JDBC中的Statement 和PreparedStatement的区别?

相同点:
	PreparedStatement是Statement的子接口。Statement PreparedStatement都可以向数据库发送并执行SQL语句。
不同点:
	1).PreparedStatement是预编译的SQL语句,效率高于Statement。 
	2).PreparedStatement支持?操作符,相对于Statement更加灵活。 
	3).PreparedStatement可以防止SQL注入,安全性高于Statement。

(十二)int和integer的区别?

最基本的区别:
	Ingeter是int的包装类,Integer是引用数据类型,int就基本数据类型。 Integer可以赋值为null,int不可以,声明数组时int的初值为0,Ingeter的初值为null。
具体区别如下:
	1).无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。
	2).两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。
	3).两个都是new出来的,都为false。还是内存地址不一样。
	4).int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

猜你喜欢

转载自blog.csdn.net/qq_40785225/article/details/82928397