java面试------基础部分
java基础
一、 jre、jdk、jvm
1、 jre,jdk,jvm之间的区别是什么?
java -version命令,验证虚拟机运行环境在不在。
jvm是虚拟机。
jre包括jvm和java程序所需核心类库。
jdk给开发人员使用的,它包括了jre。
简而言之:使用JDK开发完成的java程序,交给JRE去运行。
2、 java中一个char类型是否可以存储一个汉字?
可以,char是两个字节,一个中文是两个字节。
3、 一个int类型的取值范围是多少?
Int是4个字节,一共32位,-(2)31到231 -1
4、 自动类型转换规则是什么?
首先数值类型要互相要兼容
其次是目标类型大于原类型(小的向大的转换)
二、运算符
1、 运算符优先级顺序是什么?
!> 算数运算符 > 比较运算符 > && > ||
2、 If和Switch选择结构的区别是什么?
If判断的是表达式。
Switch是等值条件的判断
三、循环
1、 break和continue的区别是什么?
break跳出本层循环,continue继续本层的下一轮循环。
2、 使用数组的步骤是什么?
声明数组→分配空间→赋值→处理数据
四、类和对象
1、 类和对象之间的关系?
类是对象的抽象描述,对象是类的实例。
2、 类的开发步骤是什么?
发现类→发现属性→发现方法
3、 成员变量和局部变量的区别是什么?
区别一:作用域不同。
成员变量的作用域在整个类的内部都是可见的。
局部变量的作用域仅限于定义它的方法。
区别二:初始值不同。
成员变量有默认的一个初始值。
局部变量没有默认的初始值。
区别三:生命周期不同。
区别四:同名的情况下:局部变量优先级高于成员变量。
五、静态变量、实例变量
1、 静态变量和实例变量的区别?
区别一:静态变量在内存中只有一个内存空间,在加载类的过程中完成静态
变量的内存分配,可以直接通过类名来访问。
区别二:每创建一个新的实例对象,就会为实例变量分配不同的内存,各个
对象访问自己的实例变量。
区别三:无论创建了一个类的多少个对象,静态变量只初始化一次,所有的实例都可以访问静态变量,而且可以通过类名直接访问。
2、 String a = “a”;String b = “a”;String c = new String(“a”);问:a和b分别用双等号(==)和equals比较的结果是什么?为什么?
都返回True。 = =比较两个引用是不是指向的同一地址,JAVA中的常量是存在常量池中的,如果用“”赋值的话,会先从常量池中找“a”,如果已存在刚返回它的地址,所以返回True。
Equals比较两个地址存的内容是否一致,所以返回True。
3、 String类中常用的方法都有哪些?
①toUpperCase( ),toLowerCase( ),(大小写切换)。
②Split( ),(拆分字符串)。
③substring( ),(字符截取)。
④charAt( ),(求一个字符串中某个位置的值)。
⑤trim( ),(去掉两端空格)。
⑥indexOf( ),(查找指定字符串是否存在)。
⑦length( ),(取字符串长度)。
⑧Replace( ),替换字符串。
⑨concat( ),字符串连接。
六、字符串、数组
1、 String 、StringBuffer、StringBuilder的区别?
都是用来处理字符串的拼接,string适用于少量,stringbuilder(单线程)和stringbuff(多线程)适用于大量字符串操作。
使用的场景jdbc中的statement拼接SQL。
2、 | 与 || 以及 & 与 && 的区别?
区别一:& 和 | 成为布尔运算符, && 和 ||称为条件布尔运算符。
区别二:两种运算符得到的结果完全相同,但是:条件布尔运算符性能比较
好,它检查第一个操作数的值,再根据该操作数的值进行操作,可能根本就不处理第二个操作数。
3、 如何判断数组是null还是空呢?
数组为null:是创建传输组的引用,但在堆中并没有数组中的元素.
例如:int [ ] array = null;
判断的时候用array.length( );
数组为空:数组的空就是数组的长度为0,数组是真正的对象,只是对象中没有元素,也就是说里面没有内容
例如:int [ ] array = { };
判断的时候:直接使用变量名 ==null
4、 数组中有没有length()这个方法,String有没有length()这个方法?
数组:没有length()这个方法,但是数组中有length这个属性。用来表示
数组的长度。
String:有length()这个方法,用来得到字符串的长度。
5、 heap和stack有什么区别?
在jvm中,内存分为两个部分,Stack(栈)和Heap(堆)。
区别一:从内存观点考虑,Heap是 Stack的一个子集。
区别二:Stack存取速度仅次于寄存器,存取效率高,Heap存取效率低。
区别三:Stack可共享存储数据,Heap不可共享存储数据。
区别四:Stack数据的大小和生存期必须在运行前确定,Heap数据大小和生
存期都可以在运行时再确定。
七、抽象和封装
1、 你对面向对象4大特性的理解?
描述顺序:封装→继承→多态→抽象。
① 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的
类被称为父类;得到继承信息的类被称为子类。
② 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访
问只能通过已定义的接口。我们在类中编写的方法就是对实现细
节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单
的编程接口。
③ 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响
应。简单的说就是用同样的对象引用调用同样的方法但是做了
不同的事情。多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性。
方法重写(override)实现的是运行时的多态性。
④ 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据
抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并
不关注这些行为的细节是什么。
2、 方法的重载和重写的区别?
区别一:方法的重载实现的是编译时多态性,方法重写实现的是运行时的多态性。
区别二:方法的重载,方法名相同,参数列表不相同,与返回值、访问修饰
符无关。
方法的重写,方法名相同,参数列表相同,返回值类型相同,访问
权限不能严于父类。
区别三:方法的重载是发生在一个类里面的,对返回类型没有要求。
方法的重写是发生在父子类之间的,要求子类被重写方法与父
类被重写有相同的返回类型。
八、继承
1、 public、private、protected 、default之间的区别是什么?
2、 多重继承下初始化的顺序是什么?
父类后子类,先父类构造方法,后子类构造方法。(super,this)
九、多态、接口
1、 使用运行时多态进行开发的步骤是什么?
第一步:编写父类。
第二步:编写子类,子类重写父类方法。
第三步:使用父类的类型,子类的对象。
2、 类中的向上转型和向下转型的区别是什么?
向上转型是子类转换为父类,自动进行类型转换。
向下转型是父类转换为子类,结合instanceof运算符进行强制类型转换。
3、 接口和抽象类的区别?
区别一:语法方面
在抽象类方式中,类中可以有自己的数据成员,也可以有非抽象的
成员方法。单继承
在接口方式的实现中,接口中只能够有静态的不能被修改的数据成
员,所有的成员方法都是抽象的。多实现
区别二:概念方面
抽象类所体现的是一种继承关系,父类和派生类之间必须存在
"is-a"关系。
对于接口,实现的是接口定义的契约而已,"has-a"的关系。
区别3:设计方面
抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象
类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类
局部(行为)进行抽象。
抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
十、异常、Object类、包装类
1、 Java中常见的异常有哪些?
2、 多重异常编写的注意事项有哪些?
① 排列的顺序,先子类,后父类。
② 不要“吃掉异常”。(意思是:要输出异常信息和打印异常发生的堆栈信息)
3、 Error和Exception的区别?
它们的父类都是Throwable类。
Error类一般指与虚拟机相关的问题。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。
4、 检查型Exception和运行时Exception的区别?
运行时异常编译时能通过,但一运行就终止了,程序不会处理运行时异常,出现此类问题,程序会终止。Bug的来源,要去检查。 父类是Runtime
受检查的异常需要用try…catch或者throws字句声明抛出,交给父类处理,否则编译不会通过。 父类是Exception
5、 final、finally、finalize 的区别?
Final: 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,
被修饰的类不可被继承。
Finally:异常处理语句结构的一部分,表示总是执行。
Finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对
象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。
6、 throw 和 throws 的区别?
区别一:throw用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的
调用者来进行异常的处理。
区别二:throw是具体向外抛出异常的动作,它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获异常的类型,表示出现异常的一种可能,并不一定会发生这种异常。
7、 什么是装箱和拆箱?包装类的应用场景?
装箱:就是把基本数据类型转换为包装类型。
拆箱:就是把包装类型转换为基本数据类型。
包装类主要应用在集合类中。因为包装类里面描述是对象,集合里面所容纳的元素也是对象。
十一、集合、泛型
1、 List、Set、Map的区别?
List中存储的数据是有序的,允许重复的。
Map中存储的数据是没有顺序的,其键是不能重复的,值可以重复。
Set存储的数据是无序的,不允许有重复。
2、 ArrayList和LinkedList的区别?
ArrayList 基于数组实现的,非线程安全的,效率高,查找快,删除慢。
LinkedList基于链表实现,链表内存是散乱的,每一个元素存储本身内存
地址的同时还存储下一个元素的地址,链表增删快,查找慢。
3、 如果一个HashMap存放有很多值,但是在不知道KEY是什么的情况下,如何遍历出所有的KEY和VALUE?
4、 Hashtable与Hashmap的区别?
都是实现Map接口,Hashtable继承Dictionary类,Hashmap继承
ArbstractMap类
Hashtable是线程安全的,效率低,键和值都不允许为空。
Hashmap是非线程安全的,效率高,键和值都允许为空。
5、 泛型对集合方法的影响?
不使用泛型时,集合中的方法参数类型是Object类型,
使用泛型后,集合的方法的参数类型时指定的类型。
6、 Collection和Collection的区别?
Collection是java提供的一个集合接口,存储一组不唯一,无序的对象,它有两个子接口,List和Set。
Collections是一个类,专门用来操作集合的类,他提供了一系列的静态方法实现对各种集合搜索、排序、线程安全化操作。
7、 Vector和ArrayList的联系和区别?
联系:实现原理相同,功能相同,都是长度可变的数组结构,很多时候可以
互用。
区别一:Vector是早期的JDK接口,ArrayLIst是替代Vector的新接口。
区别二:Vector线程安全,ArrayList线程非安全,速度快。
区别三:长度需要增加时,Vector默认增长一倍,ArrayList增长0.5。
8、 Set集合中的数据是如何保证唯一的?
底层实现了hashCode()和equals()方法。
十二、文件IO流
1、 如何读取xml文件?
JAVA操作XML文档主要有四种方式,分别是dom、sax、jdom和dom4j。
dom和sax是官方提供的,而jdom和dom4j则是引用第三方库的。
其中用的最多的是dom4j方式。运行效率和内存使用方面最优的是sax
对于不用进行频繁修改的需求,还是应该选择使用sax。
十三、线程
1、进程和线程的区别?
进程是运行起来程序,并行的。
线程一定要是属于某个进程的。线程共享进程的资源。
每一个进程都独享一块内存空间,一个进程可以包含多个线程。
2、线程的实现方式有哪几种?
① 继承Thread类,编写简单,可直接操作线程,适用于单继承。
② 实现Runnable接口,避免单继承局限性,便于共享资源。推荐使用Runnable接口方式。
③ 编写Callable 实现类,实现call( )方法,call( )方法与run( )方法不同,call( )方法有返回值。
3、多线程中调用start方法和run方法的区别?
若调用start( )方法,则先执行主线程的,再执行子线程的。
若调用run( )方法,相当于函数调用,按照程序的顺序执行。
4、线程的状态?
① 新建状态(New):新创建了一个线程对象。
② 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。
③ 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
④ 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种:
a) 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify( )notifyAll( )方法才能被唤醒,
b) 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
c) 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
⑤ 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
5、Join ( ) 和yield ( ) 的区别?
join ( )是等待该线程终止。
yield ( )是礼让是让出CPU资源让其他线程执行,但不一定会礼让。
十四、反射
1、 获取Class对象的三种方式是什么?
① 没有new,根据类的class属性来获取Class对象。
② 在new的情况下通过对象.getClass( )方法来获取Class对象。
③ 通过Class.forName(“包名+类名”)方法来获取Class对象。
2、 对反射的理解?
① 平时我们创建对象的时候,我们都是通过new某某类来创建的,但是通过反射,我们可以通过Class.forName(类的全路径)来创建实例。例如加载JDBC驱动的时候,就是采用反射技术。Servlet的创建也是。
② 反射在平时开发中,主要应用于框架层的开发,例如Spring框架内部就用了反射技术,来创建实例。
3、 什么是工厂模式?(代码默写出来)
工厂模式:简单来说,对象的创建由传统的自身创建交付给一个工厂类创建,然后自身通过工厂类的工厂方法获得对象即可,适用场景是对象的创建步骤繁琐,过程比较复杂。
4、 什么是单例模式?(面试题,代码要求能够默写出来)
单例模式:它的类只能有一个实例。它必须自行创建这个实例,必须自行向
整个系统提供这个实例。
要求: 一是单例模式的类只提供私有的构造函数。
二是类定义中含有一个该类的静态对象私有对象。
三是该类提供了一个静态的公有函数用于创建或获取它本身的静
态私有对象。
5、 工厂模式和单例模式的区别?
区别一:工厂模式可以创建不同种类的对象实例,单例模式只能创建一种对象实例。
区别二:工厂模式创建的对象实例在内存中没有只能创建一份的要求,单例模式创建的对象实例在内存中只有一份。