JAVA面试(完结)
2020-07-29 09:48:34 3 举报
AI智能生成
java面试基础整理
作者其他创作
大纲/内容
Java高级知识
多线程
请解释多线程的两种实现方式及区别,分别编写程序以验证两种实现方式。
- 多线程的两种实现方式都需要一个线程的主类,而这个类可以实现Runnable接口或继承Thread类,不管使用何种方式都必须在子类中覆写run()方法,此方法为线程的主方法;
- Thread类是Runnable接口的子类,而且Runnable接口可以避免单继承局限,并且可以更加方便地实现数据共享的概念。
同步异步有什么区别,在什么情况下分别使用它们?举例说明。
如果一块数据要在多个线程间进行共享。例如,正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
如果一块数据要在多个线程间进行共享。例如,正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
abstract的method是否可以同时是static,是否可以同时是native,是否可以同时是synchronized?
method、static、native、synchronized都不能和“abstract”同时声明方法。
method、static、native、synchronized都不能和“abstract”同时声明方法。
当一个线程进入一个对象的synchronized方法后,其他线程是否可访问此对象的其他方法?
不能访问,一个对象操作一个synchronized方法只能由一个线程访问。
不能访问,一个对象操作一个synchronized方法只能由一个线程访问。
请解释多个线程访问同一资源时需要考虑到哪些情况?有可能带来哪些问题?
①多个线程访问同一资源时,考虑到数据操作的安全性问题,一定要使用同步操作。同步有以下两种操作模式:
①多个线程访问同一资源时,考虑到数据操作的安全性问题,一定要使用同步操作。同步有以下两种操作模式:
- 同步代码块:synchronized(锁定对象){代码};
- 同步方法:public synchronized 返回值 方法名称(){代码} 。
请解释sleep()和wait()的区别。
- sleep():是Thread类定义的static方法,表示线程休眠,将执行机会给其他线程,但是监控状态依然保持,会自动恢复;
- wait():是Object类定义的方法,表示线程等待,一直到执行了notify()或notifyAll()后才结束等待。
Java常用类库
请解释String类、StringBuffer类和StringBuilder类的区别。
- String类的内容一旦声明则不可改变,而StringBuffer类与StringBuilder类声明的内容可以改变;
- StringBuffer类中提供的方法都是同步方法,属于安全的线程操作;而StringBuilder类中的方法都属于异步方法,属于非线程安全的操作。
请解释什么叫GC,如何处理?
- GC(GarbageCollector)垃圾回收器,指的是释放无用的内存空间;
- GC会由系统不定期进行自动回收,或者调用Runtime类中的gc()方法手工回收。
final、finally、finalize的区别。
- final表示终结器,用于定义不能被继承的父类,不能被覆写的方法、常量;
- finally表示异常处理的出口;
- finalize是Object类定义的一个方法,用于执行对象回收前的收尾操作。
Java类集框架
数组(Array)与数组列表(ArrayList)有什么区别?什么时候用该使用Array而不是用ArrayList?
- 数组(Array)中保存的内容是固定的,而数组列表(ArrayList)中保存的内容是可变的。在很多时候,数组列表(ArrayList)进行数据保存与取得时需要一系列的判断,而如果是数组(Array)只需要操作索引即可。
- 如果在已经确定好长度的前提下,完全可以使用数组(Array)来替代数组列表(ArrayList),但是如果集合保存数据的内容长度是不固定的,那么就使用数组列表(ArrayList)。
请解释ArrayList和LinkedList的区别。
- ArrayList中采用顺序式的结果进行数据的保存,并且可以自动生成相应的索引信息;
- LinkedList集合保存的是前后元素,也就是说,它每一个节点中保存的是两个元素对象,一个是它对应的下一个节点,以及另外一个它对应的上一个节点,所以LinkedList要占用比ArrayList更多的内存空间。同时LinkedList比ArrayList多实现了一个Queue队列数据接口。
请解释ArrayList与Vector的区别。
- Vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。
请解释HashMap与Hashtable的区别。
- HashMap是非synchronized的,是非线程安全,Hashtable是synchronized,是线程安全的;
- Hashtable不允许有null的键和值,HashMap允许有空的键和值。
请解释Collection与Collections的区别。
- Collection是集合操作的接口,包含List子接口与Set子接口。
- Collections是集合操作的工具类,可以直接使用类中提供的方法,进行List、Set、Map等集合的数据操作。
Java基础知识
文件名称后缀必须是*.java
执行程序,包括:
①编译程序 javac *.java
②解释程序 java *
①编译程序 javac *.java
②解释程序 java *
类的定义有两种形式:
①public class 定义,类名称必须和文件名保持一致,否则程序无法编译。在一个*.java中只能有一个public class
②class定义,类名称可以和文件名称不一致,但是生成的是class定义的名称。在一个*.java程序中可以同时存在多个class,编译之后会分为不同的*.class文件
①public class 定义,类名称必须和文件名保持一致,否则程序无法编译。在一个*.java中只能有一个public class
②class定义,类名称可以和文件名称不一致,但是生成的是class定义的名称。在一个*.java程序中可以同时存在多个class,编译之后会分为不同的*.class文件
配置CLASSPATH解决在不同路径下访问指定目录类的问题
任意指定CLASSPATH是不可取的,最好做法是从当前所在路径下加载所需要的*.class文件,这个时候往往将CLASSPATH设置为“.”
任意指定CLASSPATH是不可取的,最好做法是从当前所在路径下加载所需要的*.class文件,这个时候往往将CLASSPATH设置为“.”
常见面试题:请解释PATH和CLASSPATH的区别。
- PATH:是操作系统的环境属性,指的是可以执行命令的程序路径;
- CLASSPATH:是所有*.class文件的执行路径,Java命令执行时将利用此路径加载所需要的*.class文件。
尽量使用单行注释,因为在使用一些开发工具时,多行注释格式化后的效果不好
标识符的定义:标识符由字母、数字、_、$组成,其中不能以数字开头,不能是Java中的关键字。
除了类名外,属性名、方法名等也都属于标识符。
编写标识符时尽量不去使用数字;命名尽量有意义;对于“$”符号有特殊意义,不要使用。
Java有两个未使用的关键字:goto 、const;JDK 1.4之后增加了assert关键字;JDK 1.5之后增加了enum关键字;Java有3个特殊含义的标记(严格来讲不算是关键字):true、false、null。
除了类名外,属性名、方法名等也都属于标识符。
编写标识符时尽量不去使用数字;命名尽量有意义;对于“$”符号有特殊意义,不要使用。
Java有两个未使用的关键字:goto 、const;JDK 1.4之后增加了assert关键字;JDK 1.5之后增加了enum关键字;Java有3个特殊含义的标记(严格来讲不算是关键字):true、false、null。
数据类型
基本数据类型
数值型
整数类型(byte、short、int、long)
浮点类型(float、double)
字符型(char)
布尔型(boolean)
引用数据类型
类(class)
接口(interface)
数组
基本数据类型一共分为八种,引用数据类型一共分为三种。
基本数据类型不牵扯内存的开辟问题,引用数据类型需要开发者为其分配空间。
基本数据类型的选择:
基本数据类型不牵扯内存的开辟问题,引用数据类型需要开发者为其分配空间。
基本数据类型的选择:
- 表示整数使用int,表示小数使用double。
- 表示日期时间数字或者表示文件或内存大小,就用long;
- 实现内容传递或者编码转换就用byte;
- 实现逻辑控制,就用boolean;
- 想处理中文,使用char可以避免乱码问题。
基本面试题
请解释&和&&、|和||的区别?
①逻辑运算
与运算分为普通与(&)和短路与(&&)两种。
位运算包括位于运算(&)、位或运算(|),其中“&&”和“||”不能应用在位运算上。
①逻辑运算
与运算分为普通与(&)和短路与(&&)两种。
- 普通与(&):所有的判断条件都要判断;
- 短路与(&&):如果前面的判断返回了false,后面不再判断,最终结果就是false;
- 普通或(|):所有的判断条件都要判断;
- 短路或(||):如果前面的判断返回了true,后面不再判断,最终结果就是true。
位运算包括位于运算(&)、位或运算(|),其中“&&”和“||”不能应用在位运算上。
数据类型面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 中的1是int类型,运算时会自动提升表达式的类型,所以s1+1结果是 int 型2,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误,即需要强制转换。
- short s1 = 1; s1 += 1;中S1+=1实际上可以写成S1=(short)(S1+1);它是先把S1+1的结果强制转换为short类型了,所以符合语法规定,正确。
char类型变量能不能储存一个中文的汉子,为什么?
- char类型变量是用来储存Unicode编码的字符的,unicode字符集包含了汉字,所以char类型当然可以存储汉字的,还有一种特殊情况就是某个生僻字没有包含在unicode编码字符集中,那么就char类型就不能存储该生僻字。
Integer和int的区别
- int是java的8种内置的原始数据类型。Java为每个原始类型都提供了一个封装类,Integer就是int的封装类。
- int变量的默认值为0,Integer变量的默认值为null,这一点说明Integer可以区分出未赋值和值为0的区别。
- Integer类内提供了一些关于整数操作的一些方法,例如整数的最大值和最小值。
switch语句能否作用在byte上,能否作用在long上,能否作用在string上?
- byte的存储范围小于int,可以向int类型进行隐式转换,所以switch可以作用在byte上
- long的存储范围大于int,不能向int进行隐式转换,只能强制转换,所以switch不可以作用在long上
- string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了。
能否在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量?
答:不行,我们不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。
答:不行,我们不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。
java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?
答:false,因为因为有些浮点数不能完全精确的表示出来。
答:false,因为因为有些浮点数不能完全精确的表示出来。
java 中 float f = 3.4; 是否正确?
答:不正确,3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f = (float)3.4; 或者写成 float f = 3.4F; 才可以。
默认的小数类型是double,如果使用float,需要将double强转换为float。
答:不正确,3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f = (float)3.4; 或者写成 float f = 3.4F; 才可以。
默认的小数类型是double,如果使用float,需要将double强转换为float。
面向对象
封装性
封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口进行访问。
Java的四种访问控制符:
封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口进行访问。
Java的四种访问控制符:
- 私有的(private):使用private修饰,在同一类内可见。
- 默认的(default):不使用任何修饰符,在同一包内课件。
- 受保护的(protected):使用protected修饰,对同一包内和所有子类可见
- 公共的(public):使用public修饰,对所有类可见。
继承性
继承是从已有的类得到集成信息并创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承中最常使用的两个关键字是extends(用于基本类和抽象类)和implements(用于接口)。Java中类的继承是单一继承,若使用extends只允许有一父类,使用implements则不限。
继承是从已有的类得到集成信息并创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承中最常使用的两个关键字是extends(用于基本类和抽象类)和implements(用于接口)。Java中类的继承是单一继承,若使用extends只允许有一父类,使用implements则不限。
多态性
①方法的多态性
①方法的多态性
- 方法的重载:同一个方法名称,会根据传入的参数类型和个数不同,执行不同的方法体。
- 方法的覆写:同一个方法,会根据子类的不同,实现不同的功能。
- 向上转型:自动完成 父类 父类对象 = 子类实体;
- 向下转型:强制完成 子类 子类对象 = (子类)父类实体。
面向对象面试题
请解释一下方法重载与覆写的区别。当方法重载时能否改变其返回值类型?
- 重载:方法名称相同,参数的类型或个数不同;对权限没有要求;发生在一个类中
- 重写(覆写):方法名称,参数类型,返回值类型全部相同;发生在继承类中;
- 在发生重载关系时,返回值可以不同,但是考虑到程序的统一性,重载时应尽量保证方法的返回值类型相同。
请解释抽象类与接口的区别。
定义接口的是interface,如public interface 接口名{ },用于实现接口的是implements。
抽象类的关键字:abstract
abstract 关键字,和哪些关键字不能共存?
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了
- 一个类可以实现多个接口,但是却只能继承最多一个抽象类;
- 抽象类可以包含具体的方法,接口的所有方法都是抽象的;
- 抽象类可以声明和使用字段;接口则不能,但接口可以创静态的final常量;
- 接口的方法都是public的,抽象类的方法可以使public,private,protecte或者是默认的packag;
- 抽象类可以定义构造函数,但是接口不行。
定义接口的是interface,如public interface 接口名{ },用于实现接口的是implements。
抽象类的关键字:abstract
abstract 关键字,和哪些关键字不能共存?
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了
冒泡排序(从大到小)
请解释String类中“==”和“equals()”比较的区别。
- “==”是Java提供的关系运算符,主要的功能是进行数值相等判断,如果用在String对象上表示的是内存地址数值的比较;
- “equals()”是由String提供的一个方法,此方法专门负责进行字符串内容的比较。
局部变量、成员变量、静态变量分别怎么声明?
- 局部变量:相对于成员变量而言,在类的方法内定义的变量叫局部变量;
- 成员变量:作用于整个类的,就是只被类的花括号包含的变量;
- 静态变量:用static修饰,可以直接用类名调用。
编写一个Factory程序(工厂设计模式)如右图:
编写一个单例设计模式程序,并说明其主要特点。
- 代码如右图
- 特点:构造方法被私有化,只能通过getInstance()方法取得Singleton类的实例化对象,这样不管外部如何操作,最终只有一个实例化对象,在单例设计模式中,一定会存在一个static方法,用于取得本类的实例化对象。
异常面试题
请解释 throw和throws的区别。
throw和throws都是在异常处理中使用的关键字,区别如下:
throw和throws都是在异常处理中使用的关键字,区别如下:
- throw:指的是在方法中人为抛出一个异常对象(这个异常对象可能是自己实例化或者是抛出已存在的);
- throws:在方法的声明上使用,表示此方法在调用时必须处理异常。
请解释一下RuntimeException和Exception的区别。请列举出几个常见的RuntimeException。
区别:
区别:
- RuntimeException是 Exception的子类;Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性地进行处理。
- Exception:在程序中必须使用try...catch进行处理。
- RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。
- NullPointerException(访问null对象成员)、NumberFormatException(数字格式异常)、ArrayIndexOutOfBoundsException(数组索引越界异常)。
java中static与final关键字
- 使用final定义的类不能再有子类。
- 使用final定义的方法不能被子类覆写。
- 使用final定义的变量就成为了常量,常量必须在定义的时候设置好内容,并且不能修改。
- 使用static定义的属性,不需要创建对象去调用,直接根据类名就可以去访问。
- 使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接调用。
@GetMapping和@PostMapping 和@RequestMapping区别
- @GetMapping是@RequsetMapping(method = RequestMethod.GET)的缩写,只接受get方式的请求
- @PostMapping是@RequestMapping(method = RequestMethod.POST)的缩写,只接受post方式的请求
- @RequestMapping 两者都能用
springmvc工作机制
ASP.NET MVC底层运行机制
- 用户在浏览器输入地址,向页面发送请求(实则是向控制器发出相关命令);
- 控制器接受命令后,向模型请求获得相关的数据;
- 模型将相应的数据返回给控制器;
- 控制器将相关数据发送到指定的视图;
- 指定的视图呈现相关的数据。
jvm工作机制
Tomcat 部署项目的三种方法
前端。。
JS获取HTML DOM元素的8种方法
- 通过ID获取(getElementById)
- 通过name属性(getElementsByName)
- 通过标签名(getElementsByTagName)
- 通过类名(getElementsByClassName)
- 通过选择器获取一个元素(querySelector)
- 通过选择器获取一组元素(querySelectorAll)
- 获取html的方法(document.documentElement)document.documentElement是专门获取html这个标签的
- 获取body的方法(document.body)document.body是专门获取body这个标签的。
0 条评论
下一页