JAVA面试题第一阶段总结
1、简述static和final的用法(重)
答:static修饰属性、方法、代码块
1)、静态属性:也可叫类变量,通过 类名.属性名访问
注意:类中的实例变量是在创建对象时被初始化的 ,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程只进行一次。也就是类变量只会被创建一次。
2)、静态方法:类名.方法名 可以直接访问
注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性),本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。
final修饰变量、类、方法
1)、修饰变量
被final修饰的方法变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量:修饰基本数据类型–>变量的值不能改变
修饰引用数据类型–>引用只能指向固定的对象
2)、修饰方法:不能被子类覆盖
3)、修饰类:不能被继承
在一个final类中的所有方法,默认都是final的
注意:final,不能用来修饰构造方法。
2、写出冒泡排序的算法
答:
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
3、抽象类和接口有什么区别?(重)
答:
相同点:1.都不能实例化
2.接口的实现类或抽象类的子类都必须要实现已经声明的抽象方法。
不同点:1.接口需要实现用implement,抽象类需要继承用extends
2.一个类只能继承一个抽象类,可以实现多个接口
3.尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。
4.抽象类中可以有构造器,接口中不能有构造器。
4、类有哪三个基本特性?各特性的优点?
答: 类具有封装性,继承性,多态性。
封装性:类的封装性为类的成员提供公有,私有,默认,保护访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。
继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的类称为父类,产生的新类称为子类。子类不仅可以直接集成父类的共性,而且也可以创建它特有的个性。
多态性:是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。
5、Error和Exception有什么区别?列出你见过的Exception并简要说明。(重)
答:
Error表示系统级的错误,恢复不是不可能但很困难的一种严重问题,比如内存溢出,不指望程序能够处理的情况。
Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,它表示如果程序正常运行不会发生这种情况。
常见的Exception异常有:NullPointerException:当操作一个空引用时会出现此异常。
ClassCastException:强制类型转换类型不匹配时出现此异常。
SQLException:操作数据库出现问题时出现此异常
NumberFormatException:数据格式转换出现问题时出现此异常
6、Java中会存在内存泄漏吗?请简单描述。(重)
答: 内存泄漏是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。Java中存在内存泄漏,Java中的内存泄漏是指存在无用但是垃圾回收器无法回收的对象。
7、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?(重)
答:多线程有两种实现方法:继承Thread类或者实现Runnable接口。
实现同步也有两种方法:一种是同步方法,另一种是同步代码块。
同步方法是在方法返回类型前面加synchronized关键字。
同步代码块是synchronized{ }
8、sleep()和wait()有什么区别?(重)
答:sleep方法来自于Thread类,wait方法来自于Object;sleep方法没有释放锁,而wait方法释放了锁;wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用;sleep必须捕获异常,wait不用;sleep的作用是让线程休眠,到时间时自动回复,wait是让调用者的线程挂起,直到其他线程调用这个对象的notify方法才会重新激活。
9、谈谈Java跟你所知道的其他语言相比,有什么优点?
答:Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业群体。
Java是功能完善的通用程序设计语言,可以用来开发可靠的,要求严格的应用程序。,功能强大,分支众多,没有Java不能做的软件,C/S架构B/S架构,从功能上讲,没有语言能和Java比。
C语言是面向过程的,这样往往会导致所谓的单一程序,即所有的功能只能包含在几个代码模块中。当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不做检查。从应用的角度,C语言比其他高级语言较难掌握。
10、谈谈你对面向对象的理解?(重)
答:所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态。继承有点类似与我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲或母亲的一些性格,或者相貌,又或者是运动天赋。有点种瓜得瓜种豆得豆的意思。面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性,多态。对,就是多态,我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。
11、简单讲一下Java的跨平台原理?
答:Java源程序(.java文件)通过编译器编译成Class文件,class文件是基于字节码的,而字节码文件是描述程序要运行的虚指令集合,这些虚指令集合和平台无关,只需要在不同平台部署jvm,因为jvm认识,jvm能跨平台所以就实现了Java的跨平台。
12、有了基本数据类型,为什么还需要包装类型?(重)
答:因为Java是面向对象的编程语言,基本数据类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型包装起来,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本数据类型的操作。往ArrayList HashMap中放东西时,基本数据类型放不进去,只能用包装类型。
13、说一下==和equals方法究竟有什么区别?(重)
答:==操作符专门用来比较两个变量的值是否相等,就是比较变量所对应的的内存中所存储的数值是否相同,要比较两个基本数据类型的数据或两个引用变量是否相等,只能用“= =”操作符。
equals方法适用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
14、讲一下Java中的集合?(重)
答:Collection下包含List列表和Set集合,List是有序的队列,元素值可以重复,Set集合是无序的不允许重复
15、ArrayList和LinkedList的区别?(重)
答:ArrayList是基于动态数组的数据结构,有下标,LinkedList基链表的数据结构。
访问速度ArrayList比LinkedList速度快因为LinkedList要移动指针,新增和删除操作时LinkedList比ArrayList更快因为ArrayList要移动数据。
16、讲一下HashMap和HashTable的区别?(重)
答:在Java2以前,是使用HashTable来映射键值对。后来为了使用Java集合框架,Java对HashTable进行了重新设计,但是,为了向后兼容保留了所有的方法。HashTable实现了Map接口,除了HashTable具有同步功能之外,它与HashMap的用法是一样的。在使用时一般HashMap代替了HashTable。
17、请说出集合类中List、Map、Set的区别?(重)
答:List和Set继承了Collection接口,List中存放的元素是有序并且可以重复,Set中存放的元素无须并且不可重复,Map中存放是键值对形式。
18、Collection和Collections的区别?(重)
答:Collection是java.util下的接口,它是各种集合的父接口,继承它的接口主要有Set和List;Collections是java.util下的类,是针对集合的帮助类,提供一些列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
19、String、StringBuffer和StringBuilder的区别?(重)
答:首先运行速度和执行速度,StringBuilder最快,StringBuiffer第二,String最慢。
线程安全上StringBuffer是线程安全的,StringBuilder是线程不安全的。
String适用于少量的字符串操作的情况。
StringBuilder适用于单线程下再字符缓冲区进行大量操作的情况。
StringBuffer适用于多线程下再字符缓冲区进行大量操作的情况。
20、将一下线程的几种实现方式?(重)
答:继承Thread类,实现Runnable接口,实现Callable接口。
Runnable和Callable的区别:
Callable规定的方法是call(),Runnable规定的方法是run();
Callable的任务执行后可以有返回值,Runnable的任务是不能返回值的;
call方法可以抛出异常,run方法不可以;
运行Callable任务可以拿到一个Ruture对象,表示异步计算的结构。
21、讲一下线程的几种启动方式?
答:第一种是继承Thread类,然后重写Thread类的run方法,在方法体中写响应的逻辑代码
第二种方法是实现Runnable接口并编写run方法,相比继承Thread类创建线程的好处是实现接口的方式还可以继承其他类对自身的功能进行扩展。
还有实现Callable接口创建线程和Runnable接口的不同之处是当线程执行完可以带返回值,如果需要有返回值可以选用实现Callable接口的方式。
22、有没有使用过线程并发库?
23、静态变量和实例变量的区别?
答:静态变量也叫类变量,这种变量前加了static修饰的。可以直接类名点调用,也可以用对象调用,而且所有对象的同一个类变量都是共享一块内存空间。
实例变量也叫对象变量,没有static修饰,只能通过对象调用,而且所有对象的同一个实例变量不是共享一块内存空间的。
区别在于:静态变量是所有对象共有的,某一个对象改变了它的值,其他对象再去获取它的值时,得到的是改变之后的值。
实例变量则是每一个对象私有的,某一个对象将他的值改变了,不影响其他对象的取值结果,其他对象仍会得到实例变量一开始就被赋予的值。
24、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候执行,在return前还是后?(重)
答:会执行,try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回,finally{}中的代码会在return之前执行。
25、同步和异步有何异同,在什么情况下使用他们?举例说明。
答:如果数据将在线程间共享,例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法返回时,就应该使用异步,在很多情况下采用异步效率更高。
26、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:Java中的流分为两种:一种是字节流,另一种是字符流。分别由四个抽象类来表示:InputStream,OutputStream,Writer,Reader。Java中其他多种多样的流都是由它们派生出来的。
27、&和&&的区别?(重)
答:&和&&都是逻辑运算符表示 “与”,当运算符两边的表达式都是true时,结果才为true,否则是false。
&&还具有短路功能,当&&左边的表达式为false时,将不再运算&&右边的表达式,因为结果肯定是false。
28、数组有没有length()这个方法,String有没有length()这个方法?(重)
答:数组中没有length()这个方法,但是数组中有length属性用来表示数组的长度。String中有length()方法,用来得到字符串的长度。
29、构造器Constructor是否可被override?(重)
答:构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
Constructor不能被继承,所以Constructor也就不能被重写,每一个类必须有自己的构造函数,负责构造自己这部分的构造,子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数。
30、构造器如何工作?
答:Java在构造实例时顺序是这样的:
1.分配对象空间,并将对象中成员初始化为0或者空,Java不允许用户操作一个不定值的对象。
2.执行属性值的显式初始化。
3.执行构造器。
4.将变量关联到堆中的对象上。
31、super和this的区别?(重)
答:不同点:
1.super()主要是对父类构造函数的调用,this()是对重载构造函数的调用。
2.super()主要在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中使用
相同点:
super()和this()都必须在构造函数的第一行进行调用,否则就是错误。
32、GC是什么?为什么要有GC?(重)
答:GC是垃圾回收机制,当一个对象不能再被后续程序所引用时,这个对象所占用的内存空间就没有存在的意义,JVM会不定时的检测内存中这样的对象,然后回收这块内存空间。
垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。垃圾回收通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
33、接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承抽象类(重)
答:接口可以继承接口,抽象类可以实现接口,抽象类可继承抽象类,但前提是抽象类必须有明确的构造函数。
34、内部类可以引用他包含类的成员吗?有没有什么限制?
答:完全可以,如果不是静态内部类,那没有什么限制。
35、Java中有没有goto?
答:goto是Java中的保留字,但在目前版本中Java中没有使用。
36、解释内存中的栈(stack)、堆(heap)、和静态区(static area)的用法(重)
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量如直接书写的100,hello和常量都是放在静态区中。栈空间操作起来最快但是容量很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当做堆空间来使用。
37、用最有效的方法计算2乘以8?
答:2<<3 左移三位相当于乘以2的三次方,右移3位相当于除以2的三次方。
38、在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A,可以跳出多重循环。
39、两个对象值相同(x.equals(y)==true),但却可有不同的HashCode,这句话对不对?
答:不对,如果两个对象x,y满足(x.equals(y)==true),他们的哈希码应当相同。Java对于equals方法和hashcode方法是这样规定的:1.如果两个对象相同equals方法返回true,那么他们的hashcode值一定要相同;2.如果两个对象的hashcode相同,他们并不一定相同。
40、char类型变量中能不能存储一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode,一个char类型占2个字节,所以放一个中文没有问题。
41、Anonymous lnner Class(匿名内部类)是否可以继承其他类,能否实现接口?
答:可以继承其他类或实现接口。
42、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。
43、Java中的final关键字有哪些用法?(重)
答:1、修饰类,表示该类不能被继承。
2、修饰方法,表示方法不能被重写。
3、修饰变量,表示变量只能一次赋值之后不能被修改,就是常量了。
44、写出常见的5个RuntimeException(重)
答:1、java.lang.NullPointerException 空指针异常 当调用了未经初始化的对象或者不存在的对象
2、ClassNotFoundException 执行类找不到 当类的名称或路径加载错误,通常是试图通过字符串来加载某个类时可能引发异常
3、NumberFormatException 字符串转换为数字异常 当字符串数据包含非数字型数据时转换出现异常
4、IndexOutOfBoundsException 数组下标越界异常
5、IllegalArgumentException 方法传递参数异常
6、ClassCastException 数据类型转换异常
7、NoClassDefFoundException 未找到类定义错误
8、SQLException sql语句异常
9、InstantiationException 实例化异常
10、NoSuchMethodException 方法不存在异常
45、阐述final、finally、finalize的区别(重)
答:final:修饰符有三种用法修饰类时,不能被继承;修饰方法时,不能被重写;修饰变量时,不能改变
finally:通常放在trycatch的后面构造总是执行代码块,意味着程序无论正常执行还是发生异常,finally里的代码只要JVM不关闭都要执行,可以将释放资源的代码卸载finally中。
finalize:Object类中定义的方法,Java中允许使用finalize方法在垃圾回收器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾回收器在销毁对象时调用,通过重写finalize方法可以整理系统资源或者执行其他清理工作。
46、阐述ArrayList、Vector、LinkedList的存储性能和特性。
答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法添加了Synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,Vector是Java中的遗留容器。LinkedList使用双向链表实现存储、索引慢,但是插入数据时只需要记录本项的前后即可,所以插入速度快。
47、List、Map、Set三个接口存取元素时,各有什么特点?
答:List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素。Map保存键值对映射,映射关系可以是一对一或多对一,键不能重复,值可以重复。