距离上次总结的面试,又过了一个星期了,期间又遇到了一些问的比较多的面试试卷中的问题,总结一下。

1、 说出ArrayList、Vector、Linkedlist的存储性能和特性?

1.1 ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦

1.2 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始

1.3 ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.

1.4 Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.

1.5 LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.

arraylist和vector的区别? 
1).同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的 
2).数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

2、多线程有几种实现方法,都是什么?线程同步有哪几种实现方式?(还有这样问的:你知道哪些实现线程同步的方法?)

多线程有两种实现方法:

      方法一:继承Thread类,重写方法run();

      方法二:实现Runnable接口,实现方法run();

这两种方法的共同点:

不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。

两种方法的不同点:

1、继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承

2、继承Thread类必须如果产生Runnable实例对象,就必须产生多个Runnable实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性

线程同步的方法网络上给的答案,最多的是7中,参考:java笔记--关于线程同步(7种同步方式)

3、说出servlet生命周期

Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup>1</loadon-startup>

    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

详细可参考:Servlet生命周期与工作原理

4、请描述数据库连接池的工作机制是什么?

数据库连接是一种关键的有限的昂贵的资源,这一点企业级应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

具体工作机制如下:

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
详细理解参考:谈谈数据库连接池的原理

5、switch支持的数据类型有哪些?

switch语句支持的数据类型有byte、short、int的常量表达式、char,枚举常量、java7之后,开始支持字符串字面量(即String类型)。

6、Linux下查看所有Tomcat进程的命令?

ps -ef|grep tomcat

显示所有的tomcat进程,先执行ps -ef 获取所有的进程,再执行过滤出来带有tomcat关键字的进程。

-e查询所有进程。

7、写API接口时需要注意的事项?

我没做过接口开发,但是面试中问到了,可以参考API接口设计 注意问题

8、union与union all的区别 ?

UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复   union 是取唯一值,记录没有重复
<1>、UNION 的语法如下:[SQL 语句 1]UNION[SQL 语句 2]<2>、UNION ALL 的语法如下:[SQL 语句 1]UNION ALL[SQL 语句 2]效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。简要回答:
UNION去重且排序UNION ALL不去重不排序

9、哪些情况下索引会失效?

例子以商品表为例,以name字段为索引。

9.1、like查询已 '%...'开头不会走索引,但是以'xxx%'结尾会继续使用索引。(模糊查询like查询,只要%不出现在第一个位置,都能使用索引);

如:select * from 商品表 where name like '%java";

9.2查询语句中没有where语句,不会用到索引;

如:select name from 商品表;

再以学生成绩表为例分析其他错误的索引用法

9.3 当数值型字段遇到非等值操作符(如大于号>  小于号< 或者!=以及<>符号)就不能用到索引;

如:select name from 学生成绩表 where 成绩 >95;

而 select name from 学生成绩表 where 成绩 = 60 这个语句时可以用到索引的。

9.4 对索引字段进行了某种左值操作(表达式计算),那么无法用到索引

例如:select name from 学生成绩表 where 成绩 + 40 =100;

9.5 对索引字段进行了函数操作,那么无法用到索引;

如:select * from 商品表 where substr(name)='J';

补充:

9.6 where语句中使用 or,但是没有把or中所有字段加上索引

10、mybatis的一级缓存和二级缓存

一级缓存基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。

一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),

第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。

当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。

关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。
二级缓存是mapper级别的缓存。使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。

二级缓存的作用域是mapper的同一个namespace。不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。
在MyBatis配置文件(mybatis-config.xml)中开启二级缓存
//value属性默认为false
在**Mapper.xml中开启当前mapper的namespace下的二级缓存

代表创建了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的。
evicition收回策略,默认是LRU
(1)LRU最近最少使用策略,一处做长时间不被使用的对象。
(2)FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
(3)SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
(4)WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象

11,请叙述继承与组合这两种技术各自的优缺点,如何选择这两种技术

可以参考:深入理解Java中的组合和继承

12、为什么要用redis而不用map做缓存?

可参考:为什么要用redis而不用map做缓存?

缓存分为本地缓存和分布式缓存。以java为例,使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。

使用redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持redis或memcached服务的高可用,整个程序架构上较为复杂。

详细的区别:

  1. Redis 可以用几十 G 内存来做缓存,Map 不行,一般 JVM 也就分几个 G 数据就够大了

  2. Redis 的缓存可以持久化,Map 是内存对象,程序一重启数据就没了

  3. Redis 可以实现分布式的缓存,Map 只能存在创建它的程序里

  4. Redis 可以处理每秒百万级的并发,是专业的缓存服务,Map 只是一个普通的对象

  5. Redis 缓存有过期机制,Map 本身无此功能

  6. Redis 有丰富的 API,Map 就简单太多了

类似的问题:redis有哪些好处(优点)?

1)速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的

时间复杂度都是O(1);

2) 支持丰富数据类型,支持string,list,set,Zset(sorted set),hash;

3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部

不执行

4)丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

类似问题:

Memcache与Redis的区别都有哪些?

1)存储方式

Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

Redis有部份存在硬盘上,这样能保证数据的持久性。

2)数据支持类型

Memcache对数据类型支持相对简单。

Redis有复杂的数据类型。

3)使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的

时间去移动和请求。

4)value大小

redis最大可以达到1GB,而memcache只有1MB

总结一下最近面试经常被问到的问题(2019年4月)相关推荐

  1. ElasticSearch 面试 4 连问,你顶得住么?

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 者:yanglbme github.com/doocs/ad ...

  2. 之前遇到一位老面试官,问我的问题真的有点东西

    这篇文章其实源于一次我的面试经历. 那次我面对是一位老面试官,真的很有东西. 那次面试我和他叨叨了两小时....我滴妈我嘴巴都干了真的. 他的提问都很有深度,可以说对我的学习之路有很大的帮助. 我记得 ...

  3. 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

    来自:烟雨星空 前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希 ...

  4. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

    0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...

  5. 几道 BAT 算法面试中经常问的「字符串」问题

    https://www.toutiao.com/a6675839856192520711/ String 作为最常见的编程语言类型之一,在算法面试中出现的频率极高. 1. 验证回文串 题目来源于 Le ...

  6. 那些巨头公司的前端面试都喜欢问些什么?

    在过去的几年里,我在亚马逊和雅虎面试过很多专注于前端开发的Web开发者和软件工程师,在这篇文章中,我想分享一些面试技巧,帮助候选人为面试做好准备. 免责声明--本文并非旨在列出在前端面试中可能会被问到 ...

  7. 数组去重是面试中经常问到的问题

    数组去重是面试中经常问到的问题 [html] view plaincopy var arr=[1,3,4,52,4,5,4,8,7,6]; 第一种方法:使用ES5中的indexOf进行去重: [jav ...

  8. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  9. 阿里面试 Java 都问什么?万字总结!

    作者:rhwayfunn blog.csdn.net/u011116672/article/details/50991618 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试.在这 ...

  10. 为什么产品经理面试都喜欢问注册问题?

    咖友提问:为什么产品经理面试都喜欢问注册问题? 如题.两次面试,一次要求画一个注册登录框,另一次被问如何设计一个注册功能,怎么跟UI和开发沟通.真的很好奇为什么都喜欢问注册啊?考察的点到底是什么呢? ...

最新文章

  1. 双向循环链表的选择排序
  2. 封装caffe-windows-gpu(支持模型有多个输出)
  3. Materialized Views
  4. mysql约束深入了解_MySQL 的约束
  5. vaadin_Vaadin Flow –奇妙的鹿
  6. Java开发框架!阿里大牛亲手操刀微服务架构实战
  7. Derek解读Bytom源码-P2P网络 地址簿
  8. shell回文判断_习题07_Shell编程
  9. Sonar问题及解决方案汇总
  10. 使用Shell和Java驱动程序的MongoDB身份验证配置示例
  11. 幅频响应 matlab画法,MATLAB环境下频率响应曲线的绘制方法.pdf
  12. [Ubuntu] fg、bg让你的进程在前后台之间切换
  13. 至将北漂或刚北漂的程序员
  14. 鹏鹏seo第三课:长尾关键词的认识!
  15. 码农翻身全年文章精华
  16. Allegro建立非标准热风焊盘之 理解X IX IY 命令
  17. php编辑菱形图案代码,打印菱形图案 (15 分)
  18. 2023中国传媒大学计算机考研信息汇总
  19. npm ERR! code EINVAL npm ERR! EINVAL: invalid argument, read
  20. Java---->强烈安利0_0详解注解和反射机制

热门文章

  1. mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rows等…期望参数1为资源或结果
  2. 家里的电脑频繁断网怎么回事
  3. linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取
  4. 计算机系统集成 行业标准,行业标准信息服务平台
  5. linux 本地端口关,Linux查看端口使用状态、关闭端口方法
  6. esc centos 安装mysql_CentOS7安装Mysql
  7. vue点击网页全屏_vue中实现点击变成全屏的多种方法
  8. json ajax查询,jQuery AJAX和JSON性能查询
  9. 实验2-2-2 计算摄氏温度 (10 分)
  10. java加法运算器界面_Java 接口实现计算器加减乘除(字符交互界面)