图片均为借鉴
1BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
2接口和抽象类有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
3final在java中有什么作用?
final在java中是修饰符关键字,可以修饰变量方法类,修饰的变量是不可更改的,值不可修改,引用不可修改,不能给其赋予新对象
修饰的方法禁止子类继承重写方法,由于内联机制inline,方法执行更快,修饰的类不能被继承
4两个对象的 hashCode()相同,则 equals()也一定为 true是错的
5== 和 equals 的区别是什么?
1、功能不同
""是判断两个变量或实例是不是指向同一个内存空间
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同
2、定义不同
"equals"在JAVA中是一个方法
""在JAVA中只是一个运算符
3、运行速度不同
"“比"equals"运行速度快,因为”"只是比较引用
“equals"比”=="运行速度要慢
6jdk与jre的区别?
JDK是面向开发人员使用的SDK
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者
7hashset不允许重复
重写equal和hashCode同样无重复
重写equal不重写hashcode则是否同一组元素的内存地址一样就不一定
8为什么要尽量少的操作dom树?
dom修改导致页面重绘、重新排版(用户阻塞操作)
9list与set方法的区别有:list可以允许重复对象和插入多个null值,而set不允许;list容器是有序的,而set容器是无序的等等
10Hashmap:底层结构是哈希表,在jdk1.8以前,哈希表是由数组加链表实现的,在jdk1.8中,哈希表是由数组+链表+红黑树实现,当链表长度超过阈值(8)时,会转为红黑树,然后大大提高了查询的性能。线程不安全,所以效率高,不允许键重复,允许null值和null键
11Hashtable:底层结果与hashmap相同,唯一不同的就是线程安全,键和值都不允许为null
12Java中创建线程主要有三种方式:
①继承thread重写run,调用start
②实现runnable接口,重写run方法,创建当前实例,new一个thread对象参数为创建的实例,调用start方法
③实现callable接口,重写call方法,创建当前实例,传入futureTask(),将future作为参数传入创建new thread,执行。最后调用future的get方法得到一个返回值
总结:常用后两种,因为没有继承可以继承其他类,多个线程共享一个target,用多个相同的线程处理同一份资源。比如买票多窗口,thread就是每个窗口都卖那么多的票,实现接口就是所有窗口共同去卖这么多的票
13加锁
Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定。
但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将 unLock()放到finally{} 中;
通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的
14解决死锁
避免多次锁定
具有相同的加锁顺序
使用定时锁
死锁检测
15①简单工厂模式
②工厂模式
③抽象工厂模式
16Jvm垃圾回收机制常见的算法:
搜索算法:
(1)引用计算器计数,不能处理循环引用计数器,被抛弃
(2)根据索算法:通过一些GC roots对象作为起点,从这些节点往下搜索,搜索通过的路径就会成为引用链,当一个对象没有被GC roots引用链连接时,就认为这个对象不再被使用了。
常见的GC roots对象包括:
1、虚拟机栈中的引用的对象
2、方法区域中类静态属性引用的对象
3、方法区域中常量引用的对象
4、本地方法栈中jni引用的对象
回收算法:
(1)标记-清除算法
(2)复制算法
(3)标记-整理
(4)分代收集:根据对象的存活时间把内存分为老年代和新生代,然后根据对象的存活特点,采用不同的垃圾回收算法,新生代是使用复制算法,老年代使用标记-整理算法。
17四种安全沙箱:
1、类加载体系
2、Java虚拟机内置的安全特性
3、安全管理器以及api
4、.class文件检验器
18
19innoDB支持外键支持事务不支持全文索引用于频繁修改或者涉及安全性高的应用,Mysql5.5.5以后 默认使用innoDB,建表后6、innoDB建表后只生成一个.frm文件,清空整个表时,Innodb是一行一行删除,效率比较慢。Innodb使用行锁
20
21线程池ThreadPoolExecutor->AbstractExecutorService->ExecutorService->Executor(顶层接口)
22比较两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。(线程安全)
23servlet实现页面跳转:
request.getRequestDispatcher("/index.jsp").forward(request,response);(只能跳转到本web项目中的页面)
response.sendRedirect("/index.jsp");(可以跳转到任何页面)