基础知识:
1、集合比较List和Set比较及各自的子类的比较
List: 可以允许重复的对象,可以插入多个null元素,有序容器、输出顺序为插入顺序
常用的类有ArrayList\LinkedList\Vector:
ArrayList使用索引的随意访问
LinkedList适用于经常添加\删除元素的场景
Set: 不允许重复对象,无序容器,只允许一个null元素
常用的类有HashSet\LinkedHashSet\TreeSet:
2、HashMap的底层实现
由数组+链表组成,数组是HashMap的主体链表主要为了解决哈希冲突而存在
5、String,StringBuffer和StringBuilder的区别
String:不可变,线程安全
StringBuffer:可变,存在同步锁线程安全
StringBuilder:可变,非线程安全
7、wait和sleep的区别
wait:属于Object,放弃对象锁,进入等待,必须唤醒
sleep:属于Thread,程序暂停指定时间,让出cpu,不会放弃对象锁,不用唤醒,时间到了自动执行
8、JVM的内存结构,JVM的算法
内存结构:堆内存、方法区、栈
堆:所有线程共享内存,存放对象实例
方法:所有线程共享内存,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译的代码数据
栈:线程私有的,生命周期与线程相同
11、用过哪些设计模式
设计模式主要分为:创建型模式、行为型模式、结构型模式
创建型模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式
结构型模式:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式
行为型模式:访问者模式、模板模式、策略模式、状态模式、观察者模式、备忘录模式、中介者模式、迭代器模式、解释器模式、命令模式、责任链模式
单例模式:某个类只能有一个实例,提供一个全局的访问点。
简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。
建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
装饰模式:动态的给对象添加新的功能。
代理模式:为其他对象提供一个代理以便控制这个对象的访问。
亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化
模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
观察者模式:对象间的一对多的依赖关系。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
中介者模式:用一个中介对象来封装一系列的对象交互。
命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
12、springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的
基于Servlet的前端控制框架,其核心为IOC及AOP
流程:用户发送请求到前端控制器,前端控制器完成Controller及拦截器的处理,完成请求给前端控制器返回ModelAndView对象
并根据返回的对象选择适合的视图解析器,解析器根据view及model渲染视图,把结果返回给客户端。
IOC控制反转的实现是基于spring的bean工厂,当你需要一个对象时,将本来应该由你控制的实例化对象的操作交给配置好的xml来进行
,然后再给你注入进去,从而降低代码间的耦合度
13、spring里面的aop的原理是什么
AOP技术利用一种称为“横切”的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,
这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
15、java的多态表现在哪里
主要表现在方法重载、方法重写、抽象类、接口等
16、接口有什么用
可以被多个程序调用,节省存储空间,可以减少代码运行时出现的错误
17、http,https协议
http: 应用层协议,通过80端口进行通信,明文通信,易泄露,不验证通信方的身份,无法保证报文的完整性
https: 非应用层的新协议,在http通信部分使用SSL\TLS协议代替
21、cookie和session的区别
cookie数据存放在客户端,session数据存放在服务器
cookie不安全,session访问增多时会占用服务器性能
cookie数据保存不大,一般为4k,session无此限制
22、git,svn区别
git是分布式的,svn不是
git把内容按元数据方式存储,svn按文件存储
git内容完整性优于svn
git每台电脑都有一个版本库,可以在本地做版本管理,速度快,分支管理功能强大
svn只有一个版本库,不安全
算法:
1、java中常说的堆和栈,分别是什么数据结构
栈:具有后进先出性质的数据结构
堆:堆的存取是随意
2、一个排序之后的数组,插入数据,可以使用什么方法?答:二分法
多线程:
1、阻塞队列的实现
BlockingQueue:
核心方法:(放入数据)
offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false
offer(E o, long timeout, TimeUnit unit):可以设定等待的时间,如果在指定的时间内,还不能往队列中加入BlockingQueue,则返回失败
put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续
(获取数据)
poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
poll(long timeout, TimeUnit unit):从BlockingQueue取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,
则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败
take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入
drainTo():一次性从BlockingQueue获取所有可用的数据对象,通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁
常见BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue
BlockingQueue不光实现了一个完整队列所具有的基本功能,
同时在多线程环境下,他还自动管理了多线间的自动等待于唤醒功能,从而使得程序员可以忽略这些细节,关注更高级的功能
3、Excutors可以产生哪些线程池
newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool:创建一个定长线程池,支持定时及周期任务执行
newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
newSingleThreadScheduledExecutor:创建一个单线程化的支持定时的线程池,可以用一个线程周期性执行任务
4、volatile关键字的用法:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
禁止进行指令重排序
缺点:
无法保证操作的原子性
数据库:
2、mysql的索引分类
主键索引:主键是一种唯一性索引
唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空
普通索引:基本的索引类型,值可以为空,没有唯一性的限制
全文索引:全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建,
3、mysql的存储引擎有哪些,区别是什么
InnoDB:事务型数据库的首选引擎,支持事务安全表,支持行锁定和外键,默认的MySQL引擎
MyISAM:基于ISAM存储引擎,拥有较高的插入、查询速度,但不支持事物
MEMORY:将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问
4、事务的特性和隔离级别
特性:
原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态
隔离性:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性:指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
隔离级别:(多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性)
脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据
不可重复读:对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了
虚读:事务非独立执行时发生的一种现象
5、悲观锁和乐观锁的区别
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,
比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,适用于读写比较多的情况
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,
但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,适用于写比较少的情况
NoSql:
1、redis和memcache的区别
redis:内存数据库,数据类型丰富,创建数据时不必指定过期时间(可以通过 expire 设定),
分布式(自己可以做一主多从),挂掉后,数据可定期保存到磁盘(持久化)且可恢复,支持数据备份
memcache:内存数据库(可缓存图片、视屏),数据类型单一,创建数据时即指定数据过期时间
分布式(设定memcache集群,利用magent做一主多从),挂掉后,数据就没了且不可恢复
2、用redis做过什么
单一机器缓存服务器
3、redis是如何持久化的:rdb和aof
RDB(半持久化):数据定时更新到系统磁盘,数据库只包含一个文件易与管理,
易于数据的灾难恢复,性能最大优化,启动效率高
数据高可用性差,不可避免数据丢失,容易导致服务器短暂宕机
AOF(全持久化):数据更新时直接保存到磁盘,数据安全性高,
RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,
在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
AOF持久化配置
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化
4、redis集群如何同步
Master - Slave方式实现主从同步,读写分离
6、redis有哪些数据结构
String、list、set、hash、zset
String:
get、获取存储在指定键中的值
set、设置存储在指定键中的值
del、删除存储在指定键中的值
list:
rpush、将给定值推入列表的右端
lrange、获取列表在指定范围上的所有值
lindex、获取列表在指定范围上的单个元素
lpop、从列表的左端弹出一个值,并返回被弹出的值
set:
sadd、将给定元素添加到集合
smembers、返回集合包含的所有元素
sismember、检查指定元素是否存在于集合中
srem、检查指定元素是否存在于集合中,那么移除这个元素
hash:
hset、在散列里面关联起指定的键值对
hget、获取指定散列键的值
hgetall、获取散列包含的所有键值对
hdel、如果给定键存在于散列里面,那么移除这个键
1、JVM结构原理
每个JVM都有两种机制:
类装载子系统:装载具有适合名称的类或接口
执行引擎:负责执行包含在已装载的类或接口中的指令
每个JVM都包含:方法区、Java堆、Java栈、本地方法栈、指令计数器及其他隐含寄存器
2、Java对象的生命周期
答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等
3、Map或者HashMap的储存原理
答:HashMap是由数组+链表的一个结构组成
4、HTTP协议,GET和POST 的区别
GET:从服务器上获取数据
数据按照variable=value的形式,添加到action所指向的URL后面
不安全的,数据可见,传输的数据量小
form表单的默认方法
POST:向服务器传递数据
数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL
数据不可见,传输的数据量大,所有上传文件只能用post提交
5、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢
1、需要的时候在创建实例化
2、添加同步关键字,加同步锁
3、使用ThreadLocal
6、集群环境中,session如何实现共享
7、分布式、集群环境中,缓存如何刷新,如何保持同步
答:
缓存如何刷新?
1、定时刷新
2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,
就拿Redis和 Ehcache举例, 他们都有自带的过期机制,
另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可
缓存如何保持同步?
Redis有自带的集群同步机制,即复制功能
Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可
8、你的接口服务数据被人截包了,你如何防止数据恶意提交
答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。
这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了。