201811试水面试

1.博彦科技

2.蚂蚁外包

    java8的新特性

    jvm内存模型

    outofmemory处理

3.方付通
    首轮----经理:

    redis和Memcached区别:redis支持不仅KV存储,还支持hash,list,set等数据格式,memcached支持缓存其他图片视频等数据。redis支持主从集群,应用场景一般NOSQL,消息队列,数据缓存,Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。

    springboot和spring的区别

    项目业务场景流程介绍

    开户接口字段

    签章业务基本流程

    Mybatis的实现原理:底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程,然后继续与底层jdbc打交道。

    等等。

    二面----架构师(挂掉)?
    arrayList和linklist区别,使用场景:arrayList基于数组实现,查找效率高,linkList基于链表数据结构实现,插入删除效率较高一些。当查询执行较多时使用arrayList,执行插入删除较多使用LinkList。

    hashmap底层实现原理:基于链表的entry数组,同时满足查询和插入操作优化,可以理解为HashMap也可以说是一个数组链表,HashMap里面有一个非常重要的内部静态类——Entry,这个Entry非常重要,它里面包含了键key,值value,下一个节点next,以及hash值,Entry是HashMap非常重要的一个基础Bean,因为所有的内容都存在Entry里面,HashMap的本质可以理解为 Entry[ ] 数组。

    为什么在项目中使用hashmap并没遇到数据同步问题?(不解)

    synchronized锁定的是对象?方法(不存在?)?类:锁定非静态方法为对象锁,锁定代码块传入this也为对象锁,锁定静态方法时为类锁,锁定方法块传入本.class也为类锁。

    synchronized、Lock的区别:后者可以判断是否获取锁,前者会自动释放锁,后者需要代码释放。前者会阻塞后面线程进行一直等待,后者线程获取锁失败可以去执行其他任务,前者锁不可重入、不可中断、非公平,后者锁可重入、可判断、公平。前者多用并发量小的同步,后者多用于大并发的问题。

    concurrentHashMap实现原理:(jdk7)主干是个Segment数组的分段锁实现。在ConcurrentHashMap,一个Segment就是一个子哈希表,Segment里维护了一个HashEntry数组,并发环境下,对于不同Segment的数据进行操作是不用考虑锁竞争的。(就按默认的ConcurrentLeve为16来讲,理论上就允许16个线程并发执行)

    redis ,数据类型,及各给出两个命令:redis基础

    String:

  • set(key, value):给数据库中名称为key的string赋予值value
  • get(key):返回数据库中名称为key的string的value
  • getset(key, value):给名称为key的string赋予上一次的value
  • mget(key1, key2,…, key N):返回库中多个string的value
  • setnx(key, value):添加string,名称为key,值为value
  • setex(key, time, value):向库中添加string,设定过期时间time
  • mset(key N, value N):批量设置多个string的值
  • msetnx(key N, value N):如果所有名称为key i的string都不存在
  • incr(key):名称为key的string增1操作
  • incrby(key, integer):名称为key的string增加integer
  • decr(key):名称为key的string减1操作
  • decrby(key, integer):名称为key的string减少integer
  • append(key, value):名称为key的string的值附加value
  • substr(key, start, end):返回名称为key的string的value的子串    

    List 

  • rpush(key, value):在名称为key的list尾添加一个值为value的元素
  • lpush(key, value):在名称为key的list头添加一个值为value的 元素
  • llen(key):返回名称为key的list的长度
  • lrange(key, start, end):返回名称为key的list中start至end之间的元素
  • ltrim(key, start, end):截取名称为key的list
  • lindex(key, index):返回名称为key的list中index位置的元素
  • lset(key, index, value):给名称为key的list中index位置的元素赋值
  • lrem(key, count, value):删除count个key的list中值为value的元素
  • lpop(key):返回并删除名称为key的list中的首元素
  • rpop(key):返回并删除名称为key的list中的尾元素
  • blpop(key1, key2,… key N, timeout):lpop命令的block版本。
  • brpop(key1, key2,… key N, timeout):rpop的block版本。
  • rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

    list,map使用过那些方法?

    vector线程安全吗,如何实现:vector自身方法都是经过添加syn关键字实现线程同步,如果多并发,线程是相继执行,所以说是线程安全的。但是如果在操作vector时代码上未作线程同步,也可能导致现ArrayIndexOutOfBoundsException (删除和迭代同时进行)。

    vector和list都会出现:ConCurrenceModificationException,这是因为几乎所有的集合类都有快速失败的(Fail-Fast)校验机制。这实现原理就是modCount修改计数器。如在遍历列表的时候(使用迭代器的方式),这时候会保存当前的modCount值,当每次迭代器取值的时候,会通过checkForComodification()方法来校验modCount是否发生了改变。如果发生了改变,就会抛出ConCurrenceModificationException的异常。

    hashmap为什么是线程不安全的:hash冲撞问题和扩容导致,当多线程的并发执行,同计算所得hash值相同,责会进入链表,当同时取到前一个节点相同,插入方法不是同步的,所以同时插入必然会出现丢失一个,所以出现问题。再者是进行resize扩容的时候,若多个线程同时进行扩容时并把之前table值赋予新的map,则只会把最后一个扩容的插入操作成功,其他的都会被刷掉,所以会出现线程不安全。

    Mybatis的mapper文件中#和$的区别:#传入参数做字符串处理,采用预编译技术,占位符是sql能缓存在系统内存中,不再重组sql语句,有效防止sql注入,传入参数只当字符处理,$传入多为字段,表名等,会直接编译成sql语句的一部分,没法防止注入攻击。

    #如何实现防止sql注入攻击:

    是否接受996???

4.蚂蚁金服电面(外包):

    error和exception区别;error系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

    垃圾回收算法及回收器(查看详细):垃圾回收主要集中在 java 堆和方法区中,栈其他对象大都随线程而生,随线程而灭,不需要额外回收。进行回收之前首先要判断对象是否存活,目前所知有两个算法去判断是否存活,引用计数法和可达性分析法(GC Roots:虚拟机栈中引用对象,方法区中类静态属性实体引用对象,方法区中常量引用对象,本地方法栈中JNI引用对象)。垃圾清理的算法包括:标记-清理算法(Mark-Sweep):标记所有需要回收的对象,然后依次全部清除。但是有不足,一是效率问题,标记和清除两个过程效率都不是很高,二是空间问题会产生很多碎片,对于大对象无法分配空间;复制算法(Copying):将内存分为大小相等的两块,每次用一块,当一块内存用问了,将存货的对象移动到另一块,然后将本快内存全部清除;标记-整理算法(Mark-Compact):让多有存活的对象向一端移动,然后清理掉边界以外的空间。;分代收集算法(Generational Collection):分为新生代和老年代,新生代堆已死对象进行清除,少量存活的对象迁移到老年代。然后老年代才用标记-清除算法或者标记-整理算法进行清理。垃圾收集器主要是:Serial收集器:最古老,最稳定以及效率高的收集器,串行收集器,一个线程去新生代和老年代里去执行串行回收,新生代复制算法,老年代标记-压缩算法,垃圾收集过程暂停服务(Stop-The-World);ParNew收集器:相当于多线程的Serial收集器,新生代并行,老年代串行,其他区别不大。Parallel收集器:Parallel Scavenge  主要关注系统吞吐量,虚拟机会根据当前系统情况控制停顿时间和最大吞吐量。老年代收集器Parallel Old收集器: Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。CMS收集器和G1收集器详细请见查看详细

    对幂等性的理解:在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

    消息队列的使用场景:主要解决应用耦合,异步消息,流量削锋,日志处理等问题。

    concurrenthashmap如何实现线程安全:node+cas+syno

    启用多线程的方法:thread,runnable,callable,后俩个主要区别在于后者有返回值,可以用future进行接受,前者没有返回值。

    递归需要注意点:找到相似性,定义出口。被调函数为主调函数,注意每次分配形参并非统一个变量,注意每次调用层次不同(栈理解),注意返回次序。

    mysql中联合索引的最左原则:在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配(即当联合索引(col1,col2,col3,相当于建立col1,col1,col2,col1,col2,col3三个索引)进行查询时,回首先查询col1满足条件,然后col2,然后col3。索引是因为B+树结构 所以查找快 如果单看第三列 是非排序的。 多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了)

    mysql乐观锁和悲观锁,共享锁与排他锁,悲观锁使用排他锁,独占资源吞吐量限制较大,若查询情况多的话建议使用乐观锁。乐观锁是在增删改的时候默认读取当前数据的版本号,或时间戳标志,如果操作失败会有二次尝试。所以当写入量不打,吞吐量不要求建议使用悲观锁。Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB ,MyISAM操作数据库使用表锁,而InnoDB引入了行级锁同时支持事务。共享锁(in share mode)首先当数据库增删改都是排他锁,查询不加锁,当共享锁想要修改数据时,需要等待其他共享锁释放完之后加排他锁继续修改,排他锁( for update ),锁定当前资源,只有自身可以增删改,其他人无法操作。

    final关键字,使用final好处,举出final定义的类:一般用于定义常量,代表不可修改,方法不可重写,类不可继承。好处是,提高性能,会在jvm主存和线程缓存该变量,,jvm同时会对方法,变量和类进行优化,可以在多线程环境先安全的运行,不需要额外的系统开销。String,Integer是常见的final修饰的类及其他包装类,所以不可重写。重写会出现编译报错,原理是类加载的双亲委派模式,会首先找到jre/lib目录下的rt.jar包里面java自带的java.lang.String.class(java的对系统api安全性考虑),可用代理模式实现。   

    二面在线编程:GG了   在线笔试

    5.新致软件:

    进程和线程的区别:进程是操作i系统资源分配最小单位,线程是任务调度和执行的基本单元。进程都有独立的堆栈空间和数据段,进程间相互切换开销代价较大,同类线程间可相互共享进程中堆栈空间和数据段,每个线程都有独立的运行栈和程序计数器,切换开销小。进程之间相互独立互不干扰,通信机制复杂,线程间通信相对简单。

    mybatis 中namespace作用???

    mybatis 中dao层相互调用如何实现???

    springboot启动类构成及注解意思:

    sql全连接注意事项:

    listB中AddAll(listA),listA循环remove,会影响listB吗:不会

    springMvc工作流程:1.客户端发请求到前端控制器DispatcherServlet;2.DispatcherServlet收到请求后调用HandlerMapping处理映射器;3.HandlerMapping处理映射器通过配置或注解找到相应的处理器,生成处理器对象和拦截器返回给DispatcherServlet;4.DispatcherServlet调用HandlerAdapter,HandlerAdapter适配到对应Controller;5.Controller完成返回ModelAndView,HandlerAdapter将ModelAndView返回给DispatcherServlet;6.DispatcherServlet将ModelAndView返回给前端视图解析器ViewReslover;7.ViewReslover解析后返回具体View给DispatcherServlet;8.DispatcherServlet将view进行渲染数据,填充数据,同时返回给客户端。

    业余爱好?读过什么书???

    堆和栈中分别放什么:

    StringBuffer与StringBuilder区别:StringBuffer线程安全支持并发,StringBuilder线程不安全,单线程情况下比StringBuilder性能好。

    StringBuffer为什么是线程安全的:synochonize关键字

    filter生命周期和先后拦截顺序:init,dofilter(),destrory(),执行顺序根据web.xml配置顺序有关

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MVC(Model-View-Controller)是一种软件架构模式,它将一个应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller),以此实现应用程序的松耦合,使得代码的复用和维护更加容易。 下面以一个选课管理系统为例,介绍MVC架构的基本使用方法。 1. 模型(Model) 模型是应用程序的数据和业务逻辑部分,它负责处理应用程序的数据和数据操作,同时也包括一些业务逻辑的处理。在选课管理系统中,模型可以包括学生信息、课程信息、选课记录等数据操作,同时也包括一些业务逻辑的处理,如选课冲突检查、选课人数限制等。 2. 视图(View) 视图是应用程序的用户界面部分,它负责展示应用程序的数据和处理结果。在选课管理系统中,视图可以包括学生信息、课程信息、选课记录的展示页面,同时也包括一些操作页面,如选课页面、退课页面等。 3. 控制器(Controller) 控制器是应用程序的业务逻辑处理部分,它负责将模型和视图进行协调,处理用户请求和响应。在选课管理系统中,控制器负责处理用户的选课请求、退课请求等,同时也负责将模型中的数据展示到视图上。 在实现选课管理系统时,我们可以按照MVC架构的思路进行开发。首先,我们需要定义好模型中的数据结构和业务逻辑处理方法;其次,我们需要实现视图的展示页面和操作页面;最后,我们需要编写控制器,将模型和视图进行协调,处理用户请求和响应。 总体来说,MVC架构的优点在于它能够将应用程序的各个部分分离,使得代码的复用和维护更加容易,同时也能够提高应用程序的可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值