1.面向对象特征(封装继承多态抽象)及五大原则
封装:将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公有化,提高了数据的隐秘性,使代码模块化,使其复用性得到了提高。
继承:将一类事物的共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类,既有父类的属性和行为,也有自己特有的属性和行为,扩展了已存在的代码,进一个提高了代码的复用性。
开放封闭(OCP)里氏替换(LSP)单一职责(SRP)接口隔离(ISP)依赖倒置(DIP)
多态:为了实现接口重用,主要作用是解耦。
2.final,finally,finalize区别
final是关键字,修饰变量说明该变量是常量;修饰方法说明该方法不能被重写;修饰类说明该类不能被继承。
finally是关键字,在异常处理中,try子句中执行需要运行的内容,catch子句中用于捕获异常,finally子句表示不管是否存在异常最终都会执行,常用于关闭流操作。
finalize是方法名,属于对象类。在垃圾处理器将对象从内存中清除之前做必要的清理工作,这个方法是由垃圾处理器在确定对象没有被引用时对这个对象进行调用。
3. int,Integer区别
int是基本数据类型,Integer是int的包装类。
int默认值为0,整数默认值为空值,他们可以相互转换(Java5的之后)。
4.重载和重写的区别
重载(过载):方法名相同,参数列表不同(参数类型,参数个数,顺序)。
重写(覆盖):方法名,参数列表,返回值都相同,子类方法不能缩小父类方法的访问权限,子类方法抛出的异常不能超过父类此方法抛出的异常。
5.抽象类和接口的区别
抽象类有构造方法,接口没有构造方法;
抽象类可以有普通成员变量,接口只有静态常量(默认类型:public static finall);
抽象类可以有普通方法,接口方法都是抽象方法(默认类型:public abstract);
抽象类方法的访问权限包括public、protected、缺省(一般不会出现),接口方法访问权限为public
一个类只能继承一个抽象类,但可以实现多个接口。
6.说说反射的用途及实现
反射的核心是jvm在运行时才动态加载类或调用方法或访问属性。反射会额外消耗系统资源,因此不需要动态创建对象,一般不会用到反射;此外反射还会破坏对象的封装性而导致安全问题。
7.说说自定义注解的场景及实现
四种元注解:@Retention、@Inherited、@Documented、@Target
类属性自动赋值 验证对象属性完整性 代替配置文件 可以生成注解
/** 类注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface ClassAnnotation {
String name() default "hty";
int age() default 22;
}
/** 方法注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Inherited
public @interface MethodAnnotation{
String name() default "sfl";
String value() default "good boy";
}
/** 属性注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface FieldAnnotation {
String name() default "fsw";
String description() default "very strive";
}
//创建用户类
public class User {
@FieldAnnotation(name="hty")
private String name;
@FieldAnnotation(description="donkey")
private String description;
@MethodAnnotation(value="innocent",name="wpx")
public String getString(){
return "very innocent";
}
//测试注解
@ClassAnnotation(name="fsw",age=21)
public class Test {
/**
* class注解测试
*/
public static void classTest(Class > c){
ClassAnnotation annotation = c.getAnnotation(ClassAnnotation.class);
if(annotation==null ){
System.out.println("UnKnown");
}else{
System.out.println("类:"+annotation.name()+" "+annotation.age());
}
}
/**
* method注解测试
*/
public static void methodTest(Class> c){
Method[] methods = c.getDeclaredMethods();
for(Method method : methods){
MethodAnnotation annotation = method.getAnnotation(MethodAnnotation.class);
if(annotation==null){
System.out.println("UnKnown");
}else{
System.out.println("方法注解:"+annotation.value()+" "+annotation.name());
}
}
}
/**
* field注解测试
*/
public static void fieldTest(Class> c){
Field[] fields = c.getDeclaredFields();
for(Field field : fields){
FieldAnnotation annotation = field.getAnnotation(FieldAnnotation.class);
if(annotation==null){
System.out.println("UnKnown");
}else{
System.out.println("属性注解:"+annotation.name()+" "+annotation.description());
}
}
}
public static void main(String[] args) {
classTest(Test.class);
methodTest(User.class);
fieldTest(User.class);
}
}
8.HTTP 请求的 GET 与 POST 方式的区别
GET:将名值对放在url后面,由于url对字符数目有限制,进而限制了客户端请求参数的数目,请求的参数值是可见的,不安全;
POST:将请求的参数值存放在请求体中,数目不受限制,请求的参数值不可见,安全。
9.session 与 cookie 区别
二者都是回话技术,session运行于服务器端,cookie运行于客户端;
cookie大小受限制,浏览器存放cookie的个数也有限制,session大小不受限制,与服务器内存的大小有关;
cookie不安全,通过拦截或读取本地文件cookie对其进行攻击;
session会保存在服务器一段时间才会消失(默认时间为半个小时),session过多会对服务器造成压力。
10.session 分布式处理
session复制(修改web服务器配置进行同步) session粘滞(通过方法强制将session放在同一个web服务器上) session集中管理(Redis 存储 Session 数据,实现session共享) 基于cookie管理(每次将请求的session数据放在cookie中传递给服务器)。
11.JDBC 流程
加载驱动 建立数据库连接 创建一个statement 执行sql语句 处理结果集 关闭数据库连接。
12.MVC 设计思想
模型层(model)实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现;
视图层(view)用于与用户交互,通常用jsp来实现;
控制层(controller)是view和model之间沟通的桥梁,它可以分派用户的请求并选择合适的视图进行展示,也可以解析用户的输入并映射为模型层可执行的操作。
13.==和equals区别
==:比较的是值是否相等,如果是基本数据变量的比较,则直接比较他们的值是否相等;如果是引用类型变量的比较,则比较是他们所指向对象的地址。
equals:属于object类,用于比较是否是同一个对象,如果没有对equals方法进行重写,则比较的是他们所指向对象的地址;反之则比较他们所指向对象的内容。
1.List 和 Set 区别
List是一种有序可重复的Collection,可以通过索引来获取List中的元素;
Set是一种无序不可重复的Collection。
2.List 和 Map 区别
List是一种存储单列数据的集合,存储的数据有顺序并可以重复;
Map是一种存储键值对的双列数据的集合,存储的数据是没有顺序的,其键不能重复,值可以重复。
3.Arraylist 与 LinkedList 区别
Arraylist是基于数组来实现的,通过索引查找元素,查找速度快,插入和删除慢;
LinkedList是基于链表形式来实现的,插入和删除速度快,查找速度慢,所占内存比前者要大(为每一个节点存储了两个引用,分别用于指向前后两个元素)。
4.ArrayList 与 Vector 区别
同步性:ArrayList是线程不安全的,效率高;Vector是线程安全的,效率低
数据增长:ArryList和Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,默认是两倍;ArrayList没有提供可以设置增长空间的方法,增加原来的1.5倍。
5.HashMap 和 Hashtable 的区别
历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是基于Map接口来实现的;
同步性:Hashtable是线程安全的,HashMap是线程不安全的;
值:HashMap允许键或值为空,而Hashtable不允许。
6.HashSet 和 HashMap 区别
实现的接口:HashSet是实现Set接口,HashMap是现实Map接口;
存储数据:HashSet存对象,使用add方法存储元素;HashMap存键值对;使用put方法存储元素;
重复性:HashSet存储元素不可以重复,HashMap键不可以重复而值可以重复;
效率:HashMap速度较快,因为使用唯一的键来获取对象
7.HashMap 和 ConcurrentHashMap 的原理
HashMap本质上是数组+链表,当添加新的元素时,先根据key的hash值找到该元素在数组的位置,如果该位置上没有元素,直接将元素放在数组的该位置上个,如果有存在,则依次比较链表元素的equals(),若返回true则将该位置元素的value覆盖,否则将新元素放在链表的头部。
ConcurrentHashMap是在HashMap基础上,将数据分为多个segment,默认为16个,对每段分别加锁,允许16个写进程同时进入,提高了并发的效率。
8.tomcat处理JSP页面流程
客户端请求jsp文件,服务器找到此jsp文件,把他翻译成java文件然后在编译为class文件,运行class文件并拼接成对应的jsp文件响应给客户。