面试题
一、简答题
1-Overload和Override的区别,Overload的方法是否可以改变返回值的类型?
答:Overload重载、Override重写,两者皆为java多态性的不同表现,Override存在于子类与父类中,指子类拥有与父类相同的名称和参数,则称子类重写了父类的方法;重载存在与一个类的多个方法上,指的是在一个类上定义了多个同名的方法,这些方法拥有相同的方法名,但参数个数或参数类型不相同,则称为该现象为重载,Overload可以改变返回值的类型。
2-数组有无length()这个方法?String有无length()方法?
答:数组并没有length()方法,但其有length属性,可通过数组名.length求得数组的长度,而String可通过**String.length()**求得String的长度。
3-Set里的元素是不能重复的,通过什么方法来区分重复与否?使用==还是equals()?两者有什么区别
答:Set是Coollection容器的一个子接口,其不允许出现重复元素,Set可以通过iterator()方法区分是否重复,equals()用于判断两个set是否相等**///***
4-int和integer的区别?
答:
1.int是基本类型,Integer是int的包装类型;
2.基本类型不可以为null,而包装类型则可以;
3.基本类型在的数值直接存储在栈中,而包装类型是存储在堆中的;
4.包装类型创建的是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,而基本类型则不是。
5-什么是java虚拟机,为什么java被称作是”平台无关的编程语言“?
答:java虚拟机是一个可以执行java字节码的虚拟机进程,其内部拥有堆、栈、方法区以及垃圾回收器等,java虚拟机被设计为一个应用程序,其不不限制平台便可以运行,因此被称为平台无关的编程语言。
6.JRE以及JDK分别是什么?
答?jre是java运行环境,其是一个软件,jre内部拥有java虚拟机以及标准基础类别函数库,Jdk是java开发工具包,其包含jre、编译器、调试器等开发工具。
7.值传递和引用传递的区别?
答:值传递指传递的是值的一个拷贝副本,因此当对象副本发生改变时,并不会影响源对象的值;而引用传递传递的是对象的引用,其传递是双向的,当对象的引用发生改变时,对象也会发生相应的变化。
8.Iterator和ListIterator的区别是什么?
答:ListIterator实现了Iterator接口,ListIterator包含了Iterator的所有功能,Iterator可用用来遍历set及List集合,但ListIterator只能用来遍历List集合,Iterator只能前向遍历,而ListIterator既可以前向也可用后向。
9.HashMap和HashTable有什么区别?
答:HashMap和HashTable两者都实现了Map接口;
1.HashMap允许键和值为空,而HashTable不允许键或值为空;
2.HashMap不是同步的,而HasTable为同步,因此HashMap更适合于单线程环境,而HashTable则适合于多线程环境;
10.Java内存结构?
答:栈、堆、方法区、程序计数器
11.java中的两种异常类型是什么,他们的区别?
答:两种异常分别为运行时异常(非检查异常RuntimeException)和检查异常(非运行时异常CheckedException);
1.运行时异常是不检查的异常,其是在程序运行的时候可能会发生的异常,程序可用捕捉也可以不捕捉,该类错误一般是由程序的逻辑错误引起的(ClassCastException(类转换异常)\IndexOutOfBoundsException(数组越界异常)\NullPointerException(空指针异常)\ArrayStoreException(数据存储异常,操作数组时类型不一致)\BufferOverflowException(还有IO操作的,缓冲溢出异常)\JSONException(Json异常)\NumberFormatException(数字格式化异常))
2.检查异常,该类异常是程序必须捕捉检查处理的,否无法通过编译(IOException(IO异常)\SQLException(SQL异常)\FileNotFoundException(找不到文件异常)\ClassNotFoundException(找不到类异常)\EOFException(到达文件尾异常))
12.throw和throws有什么区别?
答:
1.throws:用在方法声明后面,跟的是异常类名,可以通过逗号隔开填写多个,由该方法的调用者来处理,throw表示出现异常的可能性,并一定会发生该类异常;
2.throw:用在方法体内,跟的是异常对象名,只能填写一个,表示抛出异常,由方法体内的语句处理,表示一定抛出了某种。
13.异常处理的时候,finally代码块的重要性是什么?
答:finally代码块最终一定会被执行,无论是否抛出异常等情况,finally代码块最终会被执行,其主要用来释放资源,如:I/O缓冲区、数据库连接等。
14.什么是数据库连接池?
答:数据库连接池用于减少资源的浪费及提高程序运行效率,频繁地开关数据库会产生不必要的资源以及耗时,数据库连接池的作用是建立多个连接并存放于池中进行维护,在连接使用完毕后,将连接归还于池中,用于满足后续的其他请求。
15.doGet()和doPost()方法有什么区别?
答:Get方法会把网页的请求键值对追加在URL后面,该方法用于无敏感信息的传递;Post方法会将网页请求的键值对封装在请求体内,该键值对是不对外暴露的,可方法可用于需要传递敏感信息。
16.sendRedirect()和forward()方法有什么区别?
答:sendRedirect()方法会创建一个新的请求,而forward()方法只是把请求转发到一个新的目标上,重定向之后之前请求作用域范围内的对象失效,因为产生了一个新的请求,而转发(forward)之后,之前请求作用域范围还是能访问的,重定向要比转发速度更慢。
17.final、fianlly、finalize的区别?
答:final用于声明属性、方法及类,代表常量、不可覆盖的、不可继承的;
finally是异常处理语句结构的一部分,表示最终执行;
finalize是object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。
18.垃圾回收的优点和原理,说出2种回收机制?
答:回收机制:分代复制垃圾回收、标记垃圾回收和增量垃圾回收。
19.java的基本类型(8个)每个基本类型所占位数与字节数
byte:1字节 8位
short:2字节 16位
int:4字节 32位
long:8字节 64位
char:2字节 32位
float:4字节 32位
double:8字节 64位
boolean:1字节 8位
20.&和&&的区别?
答:&是位运算符,表示按位运算,&&是逻辑运算符,表示逻辑与;&&具有短路功能,当第一个表达式的值位false的时候则不再计算第二个表达式,而**&则两个表达式都执行**。
21.Servlet的生命周期?
1.创建servlet实例化后,将调用这个对象的init()方法进行初始化;
2.调用服务的service的方法处理doGet和doPost方法;
3.容器关闭的时候调用销毁方法destory()。
22.软件开发流程?
答:需求分析-概要设计-详细设计-编码-测试-软件交付-验收-维护
23.GC是什么?为什么要有GC?
答:GC是指垃圾回收,其是指java虚拟机内提供的垃圾回收机制,垃圾回收机制可以自动检测对象是否超过作用域从而达到自动回收内存的目的,通过该垃圾回收机制,程序员可以不过分关心垃圾回收问题,从而保证系统的稳定性。
24.同步和异步有什么区别,分别在什么情况下使用?
答:同步:如正在写的数据以后将被另一个线程读到,或者正在读的数据可能已经被另外一个线程写过了,则该数据为共享数据,应当使用同步;
异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应当使用异步编程,异步编程效率更高。
一、编程题
1.冒泡排序
/**
* Created with IntelliJ IDEA
* User: GHYANG
* Date: 2020-06-10
* Description:
* 1.每次冒泡都会将一个数值送至其该存在的位置
* 2.外循环重复
* 3.numbers.length - 1 - j : 每次循环都会将1个数归位,因此第一轮将比第二轮少比较一次
*/
public class demo_maopao {
public static void main(String[] args) {
//冒泡排序算法
int[] numbers = new int[]{3, 5, 15, 26, 2, 27, 4, 19, 36, 38};
for (int j = 0; j < numbers.length - 1; j++) {
for (int i = 0; i < numbers.length - 1 - j; i++) {
if (numbers[i] > numbers[i + 1]) {
// change
int temp = numbers[i + 1];
numbers[i + 1] = numbers[i];
numbers[i] = temp;
}
}
}
System.out.println("冒泡排序结果为:");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
}
}
2.选择排序
/**
* Created with IntelliJ IDEA
* User: GHYANG
* Date: 2020-06-10
* Description:
* 1.每次寻找最小的数值
* 2.将找到的最小数值放在已排序的序列的末尾
*/
public class demo_select {
public static void main(String[] args) {
int[] numbers = new int[]{3, 5, 15, 26, 2, 27, 4, 19, 36, 38};
//选择排序的优化
for(int i = 0; i < numbers.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < numbers.length; j++){
if(numbers[j] < numbers[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,再进行交换
if(i != k){
int temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
System.out.println("排序结果为:");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
}
}