基础

io流分几种?

字节流和字符流

有了字节流为什么还要有字符流?

字符其实就是java虚拟机字节转换的,如果我们不知道编码类型的话,就容易死出现乱码,所以就干脆提供直接操作字符的接口,方法平时对字符流进行操作,图片和视频就使用字节流好一点

hashcode与equals

  1. 如果两个对象相等,那么他hashcode一定相等
  2. 如果他们的hashcode相等,两个对象不一定相等
  3. 所以我们在用equals方法的时候,hashcode也一定要给覆盖

    线程的状态

  4. 初始状态

  5. 运行状态
  6. 阻塞状态
  7. 等待状态
  8. 阻塞准备状态
  9. 终止状态

线程创建的时候他会在new的状态,调用strart方法的时候,获取到时间片后,他就会到running的状态,当线程wait状态,他需要别人通知,他才能回到running的状态,在wait状态的基础上,我们还加入了超时限制,比如sleep和wait方法可以将线程的状态变为超时等待状态.当超时时间到达之后,他就会重新回到running状态, 在线程调用同步方法的时候,在没有拿到锁,线程就会进入一个阻塞状态.线程进入runable的run方法.就会进入到终止状态

服务是如何划分?划分的依据?

疾病自查
在线医疗
健康咨询
健康百科
会员服务

划分的依据:可用性,业务逻辑性,

springAOP功能增强

前置增强
后置增强
环绕增强
异常抛出增强
引介增强

spring设计模式以及应用场景

单例模式 Bean的创建
代理模式 接口
工厂模式 各种BeanFactory
模板方法模式 各种BeanFactory

深拷贝和浅拷贝

1.浅拷贝:对基本数据类型进行值传递,对引用类型进行引用传递的拷贝,这是浅拷贝
2.深拷贝:对基本数据类型进行值传递,对引用类型,创建新的一个对象,复制内容,就是深拷贝

servlet接口中有什么方法,以及其生命周期

里面有
init
service
destory
getservletconfig
getservletInfo

init初始化之后,调用service方法里面去做doget,dopost方法,然后destory销毁, init和destory只会执行一次

get和post请求

本质上是没有区别的,底层都是tcp请求,只是两种不同的行为,get我们是像服务请求资源,post的话我们是向服务器提交资源

转发和重定向

转发是服务器行为,重定向是客户端的行为
转发是可以带数据的,但是重定向不行
可以从多方面去看, 效率来看的话,转发搞,重定向低

servlet和线程安全

servlet不是线程安全的,在多线程高并发的情况下会导致数据不一致

JSP的四种作用域

page
application
request
session

JSP的工作原理

其实JSP也是一种servlet,他是先部署后编译的,它有一个.class文件和一个.jsp文件, 这个,class文件就是对应jsp文件的servlet,当tomcat运行的时候,就不会再去编译jsp文件了,就直接调用.class文件

cookie和session

cookie存储在客户端,session是存储在服务端
cookie用于保存用户信息
安全性,cookie存储在客户端,session存储在服务端,这样session的安全性可能还要更高
一般敏感性的用户信息放在cookie中都要进行加密,然后在到服务端进行过一个解密

list和set和map

list就是对付顺序
set对付重复,
map用来查询搜索

arraylist和linkedlist

从线程安全性来说,他们都是不安全的.
从底层数据库来说: arraylist是object 的数组,linketlist用的是双向链表
从插入和删除元素来说:arraylist在删除和插入元素 会受到影响, 而linkedlist是不会的
是否支付快速随机访问:linkedlist不支持高效的随机访问.倒是arraylist支持

hashmap和hashtable

从线程安全性来讲:hashtbale的是线程安全的,hashmap是不安全的
从效率上来讲:hashtable效率太低, 不建议在代码中使用他
从null值来看的话, hashmap中 null是可以作为键的, 但是只有一个, 可以一个或者多个键对应的值是null,而hashtable一旦put的有空值,那么就会抛空指针异常
初始化容量不一样
hashtable 默认是11 拓容是2n+1 hashmap如果给定初始值的话,那么他就会给你初始成你设置的,每次拓容是2的幂次方
底层数据结构: hashmap是数组+链表+红黑树 , hashtable是数组+链表

面向对象和面向过程

面向过程:面向过程比面向对象的性能要高
面向对象:面向对象要比面向过程 更灵活,更容易维护,更容易拓展

接口和抽象类有什么区别?

接口默认都是由public来修饰的,所有方法在接口中不能有实现,java8开始可以有默认的实现,而抽象类有非方法实现
接口中除了static和fina的变量,其他的都不能有

BIO,NIO,AIO有什么区别?

BIO 是同步阻塞的模型
NIO是同步非阻塞模型
AIO是异步非阻塞模型

servlet有什么优势?

servlet只需要启动一个操作系统,启动一个JVM就可以了,大大降低了开销
如果多个请求同时操作的话,只加载这一个类就行了,也是大大降低了开销
servlet还可以和web服务器直接进行交互
servlet 还可以让各程序之间数据共享, 让数据库连接池更容易实现.

servlet的生命周期方法,和servlet中有什么方法

init,service,destory,servletconfig,servletinfo
生命周期:web容器加载servlet实例化之后,生命周期开始,init进行初始化,初始化之后请求到service方法中,service方法会根据请求调用doget或者dopost方法,当服务关闭或者项目被卸载的时候,destory会将servlet实例销毁,init和destory只会运行一次,而service方法每次请求都会调用.所以我们可以将初始化的资源放在init的方法中,销毁的资源放在destory的方法中

get和post的请求

他们本质上都是一样的, get请求是从服务器获取资源,post是给服务器提交数据,就当成不同的行为就行了.

什么情况下调用doget和dopost?

看标签吧, 你那个form的标签内是get的时候就调用 doget,如果是post 就是dopost

转发和重定向

转发是服务端行为,重定向是客户端行为
从数据共享来看的话:转发是可以共享数据的,但是重定向不可以.
用途来看的话:转发一般是用于用户登录后,将用户的信息转发给各个模块,重定向是用于用户注销之后返回主页面和跳转其他的页面.
从地址栏来看的话,转发是直接将请求的响应的内容发给浏览器,地址栏上面是不会发生改变,但是重定向的话他就相当于让用户直接跳转到那个页面了.地址栏是有变化的

servlet与线程安全

servlet不是线程安全的,会导致数据不一致的一个问题, 怎么解决? 我们可以通过加锁来解决,但是这会造成一个线程等待的问题, 所以不是很建议.

JSP的内置对象有哪些?

resquest
resphones
pageContext
page
out
session
application
exception
config

getAttribute和getparameter有什么区别

getAttribute主要是返回的类型是String
getparameter返回的类型是Object,然后我们可以用setParameter将其转换成我们需要的类型,使用很灵活

简要描述线程和进程的关系,区别及优缺点

进程可以有多个线程, 然后每个线程都有虚拟机栈,本地方法栈,还有程序计数器

程序计数器为什么是私有的?

程序计数器主要是让线程切换以后能恢复到正确的状态

synchronized关键字

synchronized主要就是解决多个线程下访问资源的一个同步问题.保证当前方法和当前的代码块只有一个线程使用

重载和重写的区别?

重载就是参数个数,参数顺序都可以不同,方法名必须相同
重写就是行为改变,方法外貌没改变

String,StringBuffer,StringBuilder的区别?String为什么是不可变的?

String和StringBuffer是线程安全的
StringBuilder是线程不安全的, StringBuffer是单线程操作大量数据,StringBuilder是多线程操作大量数据的

接口和抽象类的区别?

接口修饰的是public,所有方法在接口内不能有实现,在java8的时候可以有默认的
一个类可以实现多个接口,但是抽象类只有一个
接口中除了static,final变量,不能有其他变量,但是抽象类可以

成员变量和局部变量的区别有哪些?

成员变量是属于类的,局部变量是属于方法的,
成员变量是对象的一部分,随着对象消失而消失,而局部变量随着方法的调用而消失

arraylist和linkedlist的区别

他们都是线程不安全的
插入和删除的话,arraylist是受影响的, linklist是不受影响的
快速访问:arraylist是支持的,linkedlist是不支持的
数据结构方面的话, arraylist是object linkedlist是双向链表
内存存储方面的话arraylist他的空间浪费主要是他预留了插入元素的位置,而linkedlist就是本身自己的元素存储的就大

hashmap和vector

vector是线程安全的, 但是操作他的话要花费大量的代码在同步操作中.
hashmap是线程不安全的,不同步,所以在不需要保证数据安全中用.

hashmap和hashtable的区别

hashmap是线程不安全的,hashtable是线程安全的
hashmap的结构是数组+链表+红黑树 hashtable是数组➕链表
hashmap和hashtable的扩容机制也不一样,hashmap 扩容的是2的幂次方,而hashtable是2n+1
还有对null的支持,hashtable put的值只要为null就会抛出异常,而hashmap不会

concurrenthashmap和hashtable的区别

主要是数据安全方面的额,一个concurrenthashmap是通过数组+链表+红黑树 一个分段锁来控制的,1.8之后是通过CAS和synchronized来实现的 hashtable的话就是只有synchronized来实现的

sleep方法和wait方法

sleep方法是不释放锁,wait是释放锁
他们都是用来暂停线程的
sleep它睡眠完会自动释放锁,而wait方法需要notfiy方法唤醒

redis内存淘汰机制

在设置过期时间中,找最近时间过期的
在设置过期时间中,找随机的.
在设置过期时间中,最少使用的
直接移除最少使用的
任意数据淘汰
禁止驱逐数据.

消息队列

消息队列一种”先进先出”的数据结构,通常是用来在分布式系统中做数据的传递
为什么要用消息队列?
各种消息队列产品
消息队列的优点和缺点?
如果保证消息队列的高可用?