SQL优化?
答: 1:尽量避免使用*查询 2: 可以常用查询字段使用索引 但不建议使用过多, 一般都是不超过6个 3:where语句后尽量不出现运算符 4: 尽量不使用模糊查询 和子查询 5: 常用字段也可以分表, 但具体的还要看业务功能
mysql引擎有几个?
答: 1:innodb 支持事务 2:myISAM 3:memory 4: merge
redis了解吗?
答: redis是一种支持key-value等数据结构的存储系统, 可用于缓存, 事件发布,场景. 使用C语言编写 支持网络 支持String hash list set 等数据类型 基于内存 可持久化
性能极高 读的速度可达110000/s 写的速度 81000/s
怎样看待java对象?
答: java中 可以理解成一切皆是对象, 例如 电脑,人物 等都可以成为对象. 类和对象是密不可分的, 类相当于对象的模子 用来描述对象信息
string是基本数据类型吗?为什么?
答: 不是,String是final修饰的类
ajax是怎样实现异步请求的?
答:ajax在前端页面实现异步请求的步骤是
1:先创建$.ajax函数 2: 参数定义为json格式 3: json里定义url、data、type、dataType、success
jsp的隐含对象有哪些?
答: out request response application exception pagecontext session config page
怎样建立索引?
答: create index 索引名 on 表名(字段名) 尽量在常用字段加索引 还有就是 在分组 过滤 排序 联合查询 的字段上加
request作用域?
答: request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。
什么是GC ?
答: 垃圾收集,java中的GC机制可以自动检测对象的作用域 从而回收清理内存,例如在某个时间点一个或一个以上的引用指向一个对象,说明该对象是活着的,不会被GC回收, 反之则会被清理掉, 但有个例外就是Thread 对象 当线程还在运行中 就不会被GC清理, java中GC可以防止内存泄漏
简单聊一下springboot
答: Springboot是基于spring4.0设计,简化了spring繁琐的配置(直接在yml或properties文件配置),集成tomcat,提高开发效率
说一下spring
答: Spring是一个开源的轻量级的应用开发框架, 其目的是用于简化企业级应用程序开发, Spring提供的IOC 和 AOP 是spring中重要角色,IOC:控制反转,
事务说一下
答: 简单来说事务指的是对数据库的一系类操作, 这些操作要把它当做一个整体来看待, 要么全部成功,要么全部失败
设计模式了解几种
答: 工厂模式, 单例模式,建造者模式,观察者模式
模糊查询去掉百分号会全盘扫描吗?
答:%在后不会全盘扫描,会用到索引, 没有%索引有效 其他情况会全盘扫描
项目是怎么部署的
答: springboot项目可以直接导成jar包 部署
springMVC里的 handlerMapping 是用什么实现controller和路径地址的关系?
答: 用map实现的
springboot都有哪些注解?
答: @componentscan @service @controller @requestMapping @exceptionHandler @mapperScan @config @transactional等
拦截器和过滤器的区别
答: 1:拦截器是属于springMVC框架里面的组件, 而过滤器是javaEE的 所以过滤器可以在任何web应用上使用, 而拦截器只能在框架里使用. 2:拦截器配置了白名单功能 可以将不需要拦截的请求设置到白名单里去, 过滤器则没有配置白名单功能 3: 执行时间不一样, 拦截器执行是在dispatcherservlet 之后 ,所以遇到中文编码问题 就需要过滤器解决 因为他可以在dispatchservlet之前执行
mybatis里的拦截器
答:pagehelper 插件里面就用到了拦截器,拦截器会拦截query,然后对查询进行一系列操作
怎么获取ajax json数据的
json中有几个参数 url : 请求路径 data: 需要提交到服务器的请求参数 type: 请求类型 dataType: 请求类型 success: 服务器响应成功后会被回调的函数
mysql怎么解决中文编码问题
答: 建表时用utf8mb4 解决
char可以存中文字符吗?
答: 可以
get和post区别?
答:1:使用get请求, 请求的参数会暴露在URL中, post 会封装在请求体中,是不可见的. 所以当请求参数涉及到隐私 都应该使用post 2: get请求参数长度也会有限制, 无法提交太长的请求参数
解释一下自动装箱?
答: 自动拆装箱就是基本数据类型和包装类之间的可以自动转换, 为什么要转换? 原因是: java是面向对象的语言, java中基本数据类型不是面向对象的,为了解决这个问题, 就对每个基本类型上设计了对应的包装类. 包装类拥有对象的特征, 并且添加了相应的属性和方法
说一下session
答: session是一种记录客户端状态的机制, 因为http是无状态协议, 在开发过程中需要记录某些用户的信息, 这个时候就用到了session. session实现是, 当服务器第一次接收到请求后, 会生成一个session对象, 针对该用户生成一个sessionID 并将sessionID以cookie形式响应给客户端, 等客户端下一次请求时,会携带这个sessionID, 然后服务器会根据这个sessionID去找到对应用户信息, 这样解决了http无状态的问题. session默认存活时间是30分钟, 但是可以在web.xml里面设置时间
mybatis 是怎么解决sql注入的?
答: 用#{} 做占位符 进行预编译 可以解决sql注入
做金融项目用什么数据类型
答: 用bigDecimal 精度高
mybatis的plus是什么?
答: 这个是mybatis的增强插件, 简化开发, 提高效率而用的.
创建对象的方式?
答: 可以通过反射instance, 还有new关键字
String StringBuffer Stringbuilder 哪个运行速度最快?
答: Stringbuilder(线程不安全的)最快>>StringBuffer(线程安全的)>> String(需要开辟内存空间)
xml的解析方式
答: dom解析方式 sax解析方式
Mybatis底层是通过反射什么来操作数据库的?
答: JDBC -> 注册驱动,获取连接, 创建statement对象 ,运行sql语句 关闭连接
servlet生命周期?
答: 默认情况下,当第一次向servlet发起请求时,此时会容器会将servlet实例化,默认是单例的, 实例化后,会初始化 调用init() 只被调用一次, 然后会处理请求,调用service() 会被调用多次, 最后销毁
项目节点?
答:指的是几台服务器 一服务器做存储, 另有一台服务器做备份
怎么理解反射?
答: 反射是一种动态机制. 当我们需要在运行期执行某种操作时(例如创建某类对象, 调用某对象方法)这时候就可以用到反射 反射有一个特出之处就是可以访问私有方法 前提是需要把setAccessible权限打开
什么是单例?
答: 就是当一个对象被多次创建, 这个时候就可以用到单例
hashMap 数据结构?
答: 数组加链表结构,HashMap 中利用了数组下标查询快的特点, 实现根据key高效查询Value,散列表为了提高 性能, 避免在散列桶中进行顺序查询, 设置了加载因子, 当元素数量超过加载因子(3/4)约定的门槛数量, 就进行 数组扩容, 扩容以后元素重新散列, 可以大大减少散列值冲突问题,默认的加载因子 75% ,比较时候, 计算出 门槛: 数组大小*75% 得到门槛,如果元素数组超过门槛, 就进行扩容, 并且重新散列,扩容为2倍
创建散列表时候, 会在其内部创建一个数组,默认时候, 创建一个16个元素的数组
保存数据时候: 根据key的hashCode, 计算出一个数组下标, 将数据保存到下标对应的数组元素
根据key的hashCode映射到数组下标时候, 会出现重复情况, 利用equals检查key是否重复
重复时候, 散列表会利用链表存储数据, 此链表被称为散列桶
散列桶中的元素, 只能顺序查询, 可能会产生性能瓶颈,
为了避免出现大量的散列桶链表, 当元素数量达到数组的75%的时候, 进行数组扩容, 扩容后, 出现散列值冲突机会大大减少. Java 8 为应付大数据量, 在散列桶元素超过8个以后, 会将链表转 换为红黑树, 提升查找性能.
查找时候: 根据key的hashCode, 计算出数组下标位置, 再利用下标到数组取得数据, 利用equals确认是否 成功找到数据,如果有散列桶, 就在散列桶中查找, 使用equals比较每个key,因为保存和查找时 候, 本质上都用了数组下标查找数据, 所以其速度非常快;
什么是reids持久化?
答: RPD和AOF两种持久化机制;
springMvc的优点?
答: 1.可以支持各种视图技术, 而不仅仅局限于jsp
2. 与spring框架集成(ioc容器,aop等)
3. 清晰的角色分配: 例如: dispatcherservlet handlerMapper ViewResolver等
4.支持各种请求资源的映射策略
cookie 禁止掉后 session还能用吗?
答: 可以使用 可以在url方式 也可以通过表单的形式
实现mybatis的接口绑定
答: 1: 可以通过xml 的namespace
2: 注解绑定
String 的缓冲区?
字符串缓冲区就是stringBuffer类,作为常用的string类来说,是不可改变的,每次的创建都会为string在内存中分配一次空间,这样在大量的字符串的操作时,是很不可取的,这时可以使用stringBuffer类,这个类使字符串能自动的根据获取的大小分配内存,减小了系统的内存压力
Thread 的start方法和run方法区别?
答: start方法是Tread类的线程启动方法, 而run方法是普通方法. 单独调用run方法是不会启动线程的
sleep和wait区别?
答: sleep会占用资源,wait不会占用资源
sleep睡眠时间到了自动唤醒,而wait需要手动唤醒
产生死锁的条件?
答: 1.互斥条件, 2.循环等待条件, 3.请求与保持条件, 4.不可剥夺条件
springboot主要的配置文件
答: application bootstrap
springboot的监听器?
答: 监听器主要是监测web应用中的某些对象, 信息的创建 销毁 修改等动作发生, 然后做出相应处理 主要应用于: 1.统计在线人数和在线用户, 系统加载时初始化信息, 统计网站访问量等
什么是spring的IOC和DI 注入?
答: ioc是控制反转,就是将对象的控制权限交给容器,由容器去创建和管理对象, di: 依赖注入在spring里创建对象的工作不再是有调用者, 而是由spring容器来完成,然后注入给调用者. 所以称为依赖注入 ioc和di目的就是实现解耦,防止代码耦合度高,
什么是AOP?
答: 1.面向切面编程 Spring AOP使用的动态代理。它的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
springMvc的工作原理和生命周期?
答: dispatcherServlet->handlerMapper->dispatcherServlet->controller->dispatcherServlet->viewResolver ->dispatcherServlet->视图组件
properstantment 和 stantment 的区别?
答: properstantment是预编译的, 运行速度要比stantment快
可以使用for循环删除集合中的元素吗?
答: 可以新循环遍历集合会被编译器改为迭代器遍历。因此要注意,使用新循环遍历集合的过程中不得通过集合的方法增删元素。
StringBuffer线程安全?
答:在线程安全上,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,可变字符序列,效率低,线程安 全,StringBuilder并没有对方法进行加同步锁,可变字符序列,效率高,线程不安全. String底层使用了一个不可变 的字符数组(final char[])String是final类。也就可以理解为常量,显然线程安全. String对象一旦被创建就是固 定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
final修饰StringBuffer后 用append可以改变他的值吗?
答:可以 因为final修饰的是引用,修饰后引用是不可变的,但是引用的那个值是可以进行修改的
线程池除了设置初始线程数和最大线程数还可以设置什么参数?
答:线程池的主要参数有:corePoolSize(线程池基本大小)、maximumPoolSize(线程池最大大小)、keepAliveTime(线程存活保持时间)、workQueue(任务队列)、threadFactory(线程工厂)、handler(线程饱和策略)
说一下final?
答:final是一个关键字,可以修饰类,方法,变量。修饰类代表类不能被继承,修饰方法说明方法不能被重写,修饰变量,变量不能被修改。
线程的五大状态?
答:新建状态 就绪状态 运行状态 阻塞状态 死亡状态
ArrayList内部的可变长数组是怎么实现扩容的?
答:采用数组复制实现的扩容利用可变长(更换数组)数组实现的线性表数据结构
- 创建默认的ArrayList, 其内部封装了一个对象数组elementData, 默认长度为0
- 在添加第一个元素时候, ArrayList会立即分配数组空间, elementData长度为10. 数据添加到数组elementData的第一个元素中.
- 添加第二个元素时候, 元素按照顺序存储到数组elementData中
- 当数组容量不够时候, ArrayList会进行扩容, 扩容到1.5倍
- 插入元素时候, 数组中元素会向后移动位置, 然后将新元素插入到数组中
给你一个util.date怎样转换日期格式?
答:simpledateformat
1*0.3==0.3 会返回什么?true还是false?
答:返回true
JVM内部了解吗?
答:JVM内部有类加载器,内存结构,GC,执行引擎
volatile了解吗?
答:volatile关键字修饰的变量在多线程并发中是具有可见性的,即并发修改后其他线程可以及时看到最新的值,避免脏读现象。
为什么会出现脏读?
答:Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。变量的值何时从线程的工作内存写回主存,无法确定。
Spring有几种配置 注入方式有哪些?
1.xml 配置 2.注解配置 3.java配置
1.构造器注入 2.setter注入 3.注解注入
springCloud有哪些组件?
答:服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
String都有哪些方法?
答:split indexOf lastIndexOf charAt subString toUpperCase/LowerCase trim valueOf length
什么是C/S B/S架构?
答:B/S架构是指 浏览器/服务器架构 C/S架构是指 客户端/服务器架构
B/S 后期维护简单,只需维护升级服务器即可, C/S 维护成本较复杂,但是相对安全
@controller这个注解有什么用?
答:@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。
线程Callable接口了解吗?
答:Callable接口可以创建线程,相比较Runnable接口创建的线程 ,Callable方法可以有返回值,还可以抛出异常,执行callable需要实现类FutureTask接收运算结果,callable规定的方法是call
redis中存储详情数据用的什么数据类型?
答:用String类型即可 常规缓存 获取用get就可以
如何创建线程池?
答:使用ExecutorService创建线程池 newFixedThreadPool(50)
RabbitMQ消息丢失怎么解决的?
答:消息丢失分为三种情况:1.生产者丢失 2.消息队列丢失 3.消费者丢失
第一种情况:可以选择RabbitMQ的事物模式confirm模式,一版推荐使用confirm模式。你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。
第二种情况:需要开启持久化,写入消息后持久化到磁盘,设置持久化有两个步骤,第一个是创建queue的时候设置,第二个是发送消息的时候将消息的deliveryMode设置为2;
第三种情况:这个时候得用RabbitMQ提供的ack机制,也是一种处理完成发送回执确认的机制。如果MQ等待一段时间后你没有发送过来处理完成 那么RabbitMQ就认为你还没处理完,这个时候RabbitMQ会把这个消费分配给别的consumer去处理,消息是不会丢的;
消息的重复消费怎么解决的?
答:可以使用唯一ID,判断是否被重复消费;
concurrenthashMap怎么实现的线程安全?
答:ConcurrentHashMap Java 5 提供的并发版本的散列表, Java 8 中其有多把锁, 每个散列桶一把, 因为采用分段加锁, 并发好. 而且并发安全. 适合在并发情况下使用!
redis每种数据类型的作用,并且在实际项目中redis是如何使用的?
答:String:这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。
hash:这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没 嵌套其他的对象)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的某个字段;
list:有序列表可以通过 list 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西;
set:无序集合,自动去重,直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对 一些数据进行快速的全局去重;
zset:是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序;
为什么使用RabbitMQ出于什么考虑的?
答:解耦,流量削峰,rabbitmq采用信道通信,不采用tcp直接通信
布隆过滤器的好处
答:相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。