面试:被问到一个问题,一定要把你知道的所有相关知识都说出来,记得有条理,把答题时间延长。那么相应时间内hr问的问题就会少些,通过概率大。另一方面,面试时间越长,胜券也大。
目录
8.this,static,super 、extends关键字
15.Math类、Math.ceil()、Math.floor()、Math.round()
16.StringBuffer和StringBuilder的区别?
18.try-catch块中存在return语句,是否还执行finally块? 如果执行,说出执行顺序
19.说出Collection与Collections的区别?
1.JavaScript(!=,==,!==,===的用法和区别)
8.HttpServletRequest,session,servletContext有什么相同点,作用域有什么区别?
一、java基础
1.switch和多重if的区别?
1.多重if用于处理某个值处于某个连续的区间的情况
2.switch通常用于处理等值的情况
2.switch支持的类型?
switch中支持的类型为byte,short,int,char,String(JDK7+),枚举共6种,不支持浮点型与long
3.while与do-while的区别?
1.while是先判断后执行 如果条件不成立 一次都不执行
2.do-while 先执行 后判断 不管条件是否成立 至少执行一次。
4.break与continue的区别?
1.break用于 switch结构和循环结构中
2.continue用于循环结构中
作用(循环结构中):
break语句终止某个循环,程序跳转到循环块外的下一条语句
continue跳出本次循环,进入下一次循环
双重循环亦如此
5.实例变量(属性、成员变量)与局部变量的区别
局部变量 | 成员变量 | |
---|---|---|
定义位置 | 方法或方法内的结构当中 | 类的内部,方法的外部 |
默认值 | 无默认值 | 有默认值(与数组相同) |
使用范围 | 从定义行到包含其结构结束 | 本类有效 |
命名冲突 | 不允许重名 | 可与局部变量重名,局部变量优先 |
6.数组的默认值
数组属于引用数据类型,其元素都有默认值(引用数据类型都有默认值)
整数:0 byte、short、int、long
小数:0.0 float 、double
字符:\u0000 char
布尔:false boolean
其他:null String等
7.冒泡排序与选择排序
public class Test1 {
public static void main(String[] args) {
// 冒泡排序 比较规则 两两相比(两个相邻的数进行比较) 条件成立 互换位置
int [] nums = {1,55,12,78,98,120,45};
// 外层循环控制比较的轮数 轮数永远是 长度 -1
// 内层循环控制每一轮比较的次数 最多的一次 长度-1 -i
for(int i = 0 ; i < nums.length -1 ; i++) {
for (int j = 0; j < nums.length -1 - i; j++) {
if(nums[j] < nums[j+1]) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
}
}
public class Test2 {
public static void main(String[] args) {
// 选择排序和冒泡排序 比较的次数是一样
// 唯独区别在与 冒泡是立即调换位置 而选择是当一轮比较完了以后 再调换位置
// 外层循环是比较是数A 内层循环是 比较的 数 B
int [] nums = {1,55,12,78,98,120,45};
for (int i = 0; i < nums.length -1; i++) {
int minIndex = i; // 定义一个最小数的下标 假设从 i开始 依次与后边的数进行比较
for (int j = i + 1; j < nums.length; j++) {
if(nums[minIndex] > nums[j]) {
minIndex = j;
}
}
if(minIndex != i) {
int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
}
}
8.this,static,super 、extends关键字
- this关键字:
- 访问属性,直接使用this.属性即可
- 访问方法,直接使用this.方法即可
- 访问构造方法,this(形参列表)即可。 必须在构造方法的第一句,并且只能有一个。
- static关键字:
- 修饰属性,不依托于对象而存在,在内存中只有一份拷贝,将被所有的对象共享。类名.属性
- 修饰方法,不需要创建对象即可访问,在内存中只有一份拷贝。
- 修饰代码块,在加载类的时候执行,多个代码块按照顺序执行,并且只执行一次。哪怕创建 多个对象也是执行一次,因为类只被加载一次。
- super关键字:可访问的与this同
- 父类的属性,直接super.访问,访问规则结合访问修饰符权限
- 父类的方法,直接super.访问,访问规则结合访问修饰符权限
- 父类的构造方法,super(形参列表)。必须在构造方法的第一句,并且只能有一个。
- extends关键字可继承:
- public修饰的属性和方法
- protected修饰的属性和方法
- 修饰的方法在不同包子类的情况下,只能继承,不能直接访问
- 默认修饰的属性和方法,要求父子类在同包。
- extends不能继承的内容:
- private修饰的属性和方法
- 构造方法
- 默认修饰的属性和方法,但是父子类在不同包
9.分别说明方法重载和方法重写的特点
- 重载
- 同一个类中
- 方法名称相同
- 参数列表不同(个数、类型、顺序)
- 跟返回值和访问修饰符无关
- 重写
- 存在于父子类中
- 方法名称相同
- 参数列表相同
- 返回值相同或者是其子类
- 访问权限不能严于父类
- 不能抛出比父类更多的异常
- 扩展:
- 父类的静态方法 子类可以继承,但是不能重写(即使写成与父类一模一样的静态方法,虽然可以正常运行,编译器不会报错,但此时不是重写)
- 父类的普通方法 不能被子类重写为静态方法
- 父类的静态方法 子类不能定义同名的非静态方法
10.静态变量使用什么修饰,与非静态变量使用上有什么区别?
- 使用static修饰
- 静态变量在本类中可以直接访问或通过类名+.访问
- 静态变量在非本类在必须通过类名+.访问
- 非静态变量在本类或非本类静态方法中都必须先创建对象,然后通过对象访问
- 非静态变量在本类普通方法中可直接访问,比如常写的getter与setter方法
11.构造方法的写法?
- 访问修饰符 + 类名
- (了解)
- public
public就不用解释了
private
当构造方法修饰符为private级别时,只能在当前类内访问,此类不能被继承,也不能被其他类创建对象。 可以对比其他几种修饰符的作用:abstract修饰的类,不允许被实例化,这点和private修饰构造方法相同,但abstract修饰的类可以被继承,拥有子类,可以创建子类的实例;final类禁止被继承,这点和private修饰构造方法相同,但是final类可以用new创建实例对象。 - protected
如果构造函数是protected,那么该类可以继承,可以在被包内其他类中创建实例,但是无法在包外或者子类以外的地方产生实例.
12.实例变量与静态变量的区别?
- 实例变量每创建一个对象,在内存中就有一份拷贝,多个对象之间互不影响。
- 静态变量在内存中只有一份拷贝,被多个对象共享,节省内存空间
13.Java支持多继承码?
- 不支持,一个类只能有一个直接父类,但是可以通过接口继承多个接口的方式,实现类似多继承的效果,在能够满足需求的前提下,尽量使用接口
14.抽象类与接口区别:
- a:抽象类可以有普通属性,接口只有静态常量
- b:抽象类可以有构造方法,接口不能有构造方法
- c:抽象类可以有普通方法和静态方法,接口从JDK8开始才支持使用default关键字声明方法和静态方法
- d:抽象类是extends继承,接口是implement实现
- e:只能继承一个类,可以实现多个接口,接口可以继承多个接口
- f:抽象类中抽象方法必须使用abstract修饰,接口默认都是public abstract修饰的
15.Math类、Math.ceil()、Math.floor()、Math.round()
- Math.ceil() 向上取整
- Math.floor() 向下取整
- Math.round() 四舍五入
16.StringBuffer和StringBuilder的区别?
- 前者是线程安全的,效率低,先有的,since JDK1.0
- 后者是非线程安全的,效率高,后有的,since JDK1.5
17.throw与throws的区别
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
18.try-catch块中存在return语句,是否还执行finally块? 如果执行,说出执行顺序
详细链接:https://blog.csdn.net/zitian246/article/details/107966022
try语句在返回前,将其他所有的操作执行完(未考虑try出现异常的情况,出现异常时执行catch,规则与其相同),保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:
- 情况一:如果finally中有return语句,则会将try中的return语句"覆盖"掉(异常在返回值之前除外,此时不执行try中的return语句),直接执行finally中的return语句,得到返回值,这样便无法的得到try之前保留好的返回值
- 情况二:如果finally中没有return语句,也没有改变要返回的值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值
- 情况三:如果finally中没有return语句,但是改变了要返回的值,这里优点类似于引用传递和值传递的区别,分以下两种情况:
- a)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值
- b)如果return的数据类型是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的值就是在finally中改变后的该属性的值。
补充:出现异常捕获时,执行catch语句,其规则与try中相同。
任何执行try 或者catch中的return语句之前,都会先执行finally语句
19.说出Collection与Collections的区别?
Collection是一个单例集合的根接口,Collections是操作集合对象的工具类
20.ArrayList和Vector的区别?
相同点:
- ArrayList与Vector底层都是使用了Object数组实现的。
不同点:
-
Vector是JDK1.0就有的,ArrayList是JDK1.2才有的
-
Vector无参构造直接给数组长度赋值为10,而ArrayList是第一次添加内容的时候才给数组长度赋值为10
-
Vector扩容是原来的2倍,ArrayList是原来的1.5倍
-
Vector是线程安全的,ArrayList是线程不安全的
21.HashMap和Hashtable的区别?
- 此类提供与Hashtable相同的实现,但是是线程安全的,默认容量是11,扩容是两倍+1,键和值都不允许为null,无序的
-
HashMap JDK1.2 ,默认容量16, 扩容2倍, 线程不安全
Hashtable JDK1.0, 默认容量11, 扩容2倍 + 1 线程安全
22.三种遍历ArrayList的方式是什么,有什么区别?
- 普通for循环 基于下标遍历 可以做一些基于下标的操作
- 增强for循环 不能操作下标 效率高 底层实现还是迭代器
- 迭代器 不能操作下标 效率高
23.构造代码块与构造方法执行顺序
- 静态代码块初始化
- 给对象的实例变量(非“常量”)分配内存空间,默认初始化成员变量
- 成员变量声明时的初始化
- 初始化块初始化(又称为构造代码块或非静态代码块 )
- 构造方法初始化
24.多线程:调用start方法和run方法的区别?
- 调用start方法 会开启一个新的线程
- 不能调用run方法 因为不会开启新的线程
线程五状态:创建--》就绪--》运行--》阻塞--》死亡,由阻塞也可变为运行
25.线程调度的方法?
sleep 休眠 join 插入
yield 礼让 stop 中断
start 开始
26.TCP与UDP协议的区别?
TCP特征:
1. TCP协议是完全依赖IO流的,面向连接的!!!
-
数据传输没有大小限制
-
因为面向连接,所以数据安全
-
因为面向连接,所以速度较慢
-
TCP协议严格区别客户端和服务器
UDP协议下的socket:
1. 是按照数据包的方式来处理数据,面向无连接。
-
每一个数据包有大小限制,要求在64KB以内!
-
因为面向无连接,所有传输数据不安全,不稳定
-
因为面向无连接,所有传输速度贼快
-
UDP不区分客户端和服务器,只有发送端和接收端
27.获取Class对象的三种方式?
//获取Class对象方式1:new对象
Date data = new Date();
System.out.println(data.getClass());
//获取Class对象方式2:类名+.class
System.out.println(Date.class);
//获取Class对象方式3:反射(推荐使用)
Class<?> dateClass = Class.forName("java.util.Date");
28.元注解与注解中的属性要求:
-
@Target 表示注解可以声明的位置,默认不写表示在任何位置都可以使用。TYPE,METHOD,FIELD,CONSTRUCTOR,LOCAL_VARIABLE,PARAMETER
-
@Retention 表示注解的生命周期
-
CLASS表示在二进制文件中生效
-
RUNTIME表示在程序运行时生效
-
SOURCE表示在Java源代码中生效
-
生命周期长度 SOURCE < CLASS < RUNTIME
-
-
Documented 被此注解修饰的注解表示在doc文档注释中保留此注释
-
Inherited 表示被此注解修饰的注解可以被子类保留
要求:
-
注解中不能写方法,也没有抽象方法 书写格式:Type name();
-
注解中的属性支持的数据类型
8中基本类型、String、枚举、Class和其对应的数组 共(8+3)*2 = 22种
-
注解中的属性名为value并且只有一个属性的时候可以直接写值。数组的话直接大括号,大括号内写值
-
注解中可以写枚举类
二、javaweb
1.JavaScript(!=,==,!==,===的用法和区别)
<span style="color:#34495e"> var num = 1;
var str = '1';
var test = 1;
document.write(test == num); //true 相同类型 相同值 (等于,只比较值,类型不同的,会先转换)
document.write(test === num);//true 相同类型 相同值 (绝对等于,即比较类型,又比较值)
document.write(test !== num);//false test与num类型相同,其值也相同, 非运算肯定是false
document.write(num == str); //true 把str转换为数字,检查其是否相等。
document.write(num != str); //false == 的 非运算
document.write(num === str); //false 类型不同,直接返回false
document.write(num !== str); //true num 与 str类型不同 意味着其两者不等 非运算自然是true。
//== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。
</span>
2. post请求与get 请求区别(三方面)?
- url:get请求数据放在url后面;post请求数据放在请求体中,不会在地址栏显示
- 数据大小:请求参数大小有限制;post请求参数大小无限制
- 安全:get请求 明文不安全;post 请求安全
3.转发与重定向的区别(三方面)?
- url:
- 转发不发生变化址栏,一次请求;
- 重定向地址栏发生变化,两次请求
- 发生位置
- 转发:服务器行为(客户端不知情),还是原来的请求
- 重定向:客户端收到重定向url,重新发起请求 2次
- 数据携带
- 转发:数据不丢失(request.setAttribute)以键值对形式存储在request作用域中。key为String类型,value为Object类型
- 重定向:两次请求,数据丢失
- 访问权限(了解):
- 转发:web应用内部资源
- 重定向:任何资源,包括外部项目,百度等
4.servlet生命周期关键方法(四步)和作用?
- 构造方法:实例化
- init() 初始化 初始化资源
- service() 接收用户请求 返回响应数据
- destroy() 销毁时调用 释放的资源
5.介绍/什么是cookie
cookie是存储在客户端的一小块信息,以键值对(key,value)的形式存储,value是String类型(与session不同)。
cookie由服务器产生,响应时通过header向浏览器传递,浏览器保存,如果设置了时间,浏览器到期自动删除。
一旦保存了某个cookie,那么在以后每次访问web服务器时,都应在http请求头中将这个cookie回传给web服务器。
6.介绍/什么是session
session就是会话,服务器为客户端建立的一个session对象,用于存储信息,存储也是键值对,value是Object类型,可存储任何信息。
再顺便解释一下:会话,一个浏览器访问同一个应用,多个窗口共享一个会话,若浏览器关闭,则会话结束(浏览器删除session,但服务器的session有默认存储时间,不一定会删除,下次连接,无法识别浏览器,会创建新的session)。如果用户长时间不操作,超过设置的最大存活时间(默认30min),session自动失效。
补充:(首次使用到session时,服务器会自动创建session,并创建cookie存储sessionId发送回客户端 )
7.使cookie失效/使session失效
- cookie:在服务端创建新的同名cookie覆盖或者设置setMaxAge(0)发送给客户端,客户端收到响应age为0,立即删除
- session:获取当前session,setMaxInActiveInterval(0) 或者调用invalidate()(推荐这种,注销登录时用的比较多)
8.HttpServletRequest,session,servletContext有什么相同点,作用域有什么区别?
相同点:都可以用来存储数据
- HttpServletRequest在一次请求中有效
- session当前一个用户会话数据有效,会话关闭,数据销毁
- ServletContext代表当前javaweb在tomcat中的应用,当tomcat(或web服务器)启动时创建,服务器关闭时失效
9.cookie与session的(三种)区别与联系?
- 存储位置:cookie存储在客户端(由服务器生成),session存储在服务器
- 安全:cookie不安全, session安全,用户无法获取
- 数据大小:cookie不能存储超过4kb数据
- session是基于cookie实现,服务器产生的session,会将JsessionID以cookie形式发送给客户端,客户端每次请求携带JsessionID,服务器才能识别当前会话,否则会创建新的id,再次传给客户端。
10.什么是MVC?分别指的是什么?有什么作用?
mvc是一种软件设计模式,
m 指的是model模型---数据---javabean
v view视图---jsp html等
c controller控制器---- Servlet :作用1.控制界面跳转 2.提供数据
作用:解耦,将数据和界面分离,附带可重用性与可维护性等特点
11.jsp内置对象(了解)与四大域对象的优先级(重要)
常用的有6个,pageContext,request、session,application、out、response
(内置对象是用在java代码块中的)
四大域对象优先级:重要
-
pageContext(javax.servlet.jsp.PageContext) 当前jsp页面有效,一旦跳转则失效
-
request (javax.servlet.http.HttpServletRequest) 一次请求有效
-
session (javax.servlet.http.HttpSession) 一次会话有效
-
application (javax.servlet.ServletContext) 整个web应用有效(服务器重启或关闭失效)
12.隐式对象与四大作用域优先级(重要)
隐式对象用于el表达式中
四大作用域优先级:pageScope requestScope sessionScope applicationScope
pageContext.setAttribute("code",100);
request.setAttribute("code",200);
session.setAttribute("code",300);
application.setAttribute("code","400");
pageScope- code:${pageScope.code}<br>
requestScope- code:${requestScope.code}<br>
sessionScope- code:${sessionScope.code}<br>
applicationScope- code:${applicationScope.code}<br>