0、自动拆箱和装箱

java有8种原始类型,分为数字型,字符型,布尔型。其中数字型又分为整数型和浮点数型。整数型按照占用字节数从小到大依次是byte(占用1个字节,值范围是[-27 ~ 27-1])、short(占用2个字节,值范围是)。

所有的原始类型和对应的引用类型都支持自动装箱和拆箱,不仅仅是数字类型(byte、short、int、long、float、double),还有char(字符类型)和boolean(布尔类型),分别对应Character和Boolean类型。

1、ArrayList和LinkedList的区别?

ArrayList实现是基于数组,LinkedList是基于链表。

对于get(int inxex)、set(int index, E element)方法,ArrayList比LinkedList快,因为ArrayList可以直接根据索引在数组中找到对应位置,而LinkedList需要移动指针(如果index<size/2,就从first往last方向移动,否则从last往first方向移)。

对于add(E e)和remove(int index),无法明确是ArrayList快,还是LinkedList快。

2、解释一下spring的IOC和AOP。

3、redis有哪些应用场景?持久化策略有哪些?有什么不同?

持久化策略有两种:RDB和AOF。RDB是保存数据快照,AOF是保存写命令。

4、mybatis用什么来接受参数?是#{}还是${},这两个有什么区别?

用#{}。区别是#{}能够防止sql注入,${}不能防止sql注入。#{}会把所有参数都当成字符串,即自动用单引号包裹。这里要确认下是不是有问题,如会引发类型转换错误、不走索引等等。

mybatis注释是:

By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for order by , you might use something like this: order by ${columnName},here MyBatis won't modify or escape the string.
NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.

5、linux命令会哪些?获取某文件某关键字前后50行的命令是什么?

grep -C 50 keyword a.txt

-C代表前后多少行

-B代表前面多少行

-A代表后面多少行

6、你们用kafka是如何保证应用崩溃重启后消息不会重复消费和不会遗漏消息的?

7、mysql数据库有哪些引擎?InnoDB为什么比其他的好,比如说MyISAM?

InnoDB、MyISAM。InnoDB最大最大的优点是支持事务,其他引擎都不支持。

8、NIO、BIO。

9、联合索引,有没有某些字段用不上的情况?原因是什么

以下需要实际测试

假如lvl_info表有agent_no、openid、updated_date以及其他一大堆字段,对agent_no、openid、updated_date这3个字段建了联合索引。则

select * from lvl_info where agent_no = #{agentNo} and openid = #{openId} and updated_date >= #{updatedDate}; 这个sql语句会走联合索引。

select * from lvl_info where openid = #{openId} and agent_no = #{agentNo} and updated_date >= #{updatedDate}; 这个sql语句也会走联合索引,因为where子句筛选条件的顺序在查询之前会自动被数据库优化器优化。

select * from lvl_info where agent_no = #{} and updated_date > #{}; 这个sql语句只会走agent_no处的索引,openid和updated_date字段不会走索引,因为联合索引是从左边的字段开始的,不能跳跃走,断了的话,后面的字段就不会走索引了。

select * from lvl_info where agent_no = #{} and openid != #{} and updated_date > #{}; 这个sql语句会用到agent_no字段和openid字段的索引,updated_date字段的索引用不上,这是因为openid字段用了非等查询(!=或者<>),当前字段会走索引,之后的字段不会走索引。

10、es查询超过10000行报错怎么解决?

这里说的10000其实指的是index.max_result_window的值,在查询时from+size的值不能超过这个值,否则会报错"Result window is too large, from + size must be less than or equal to: [10000]"。

解决办法有两个:

1)调大index.max_result_window的值,简单粗暴。max_result_window是动态配置的,操作对象是某个索引,可以随时更改。

2)用search_after。search_after用于一页一页的查询数据。需要上一次返回数据中最后一条数据的排序字段的值,第一次查询不用加search_after,是正常的查询及排序,从第二次开始,要加search_after。假如排序字段是updated_date。第一次查询语句如下:

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"updated_date": "asc"}
    ]
}

假如返回的第10条数据的updated_date字段值是2019-06-27 00:08:00,则第二次查询语句是:

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": ["2019-06-27 00:08:00"],
    "sort": [
        {"date": "asc"}
    ]
}

第三次、第四次依此类推。。需要注意的是,from值必须是0或者-1,否则会报错。这里假如size>10000,会怎么样??

其实还有个scroll,但是es官方不建议用scroll直接响应用户请求,scroll用于reindex时的数据操作。所以,生产上不会用这种方式处理10000报错的问题。

11、系统中用的注解有哪些?分别是什么作用?

12、线程池如何构造?里面的参数都是什么意思?

线程池类是ThreadPoolExecutor和ScheduledThreadPoolExecutor,其中ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类。除了jdk原生的这2个类,还有spring中的类,如spring-context.jar包中的ThreadPoolTaskExecutor,全类名是org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor。

1)ThreadPoolExecutor有4个构造器,参数最多的构造器有7个参数,如下:

ThreadPoolExecutor(int corePoolSize,

int maxPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler

)

corePoolSize:线程池最小的线程数。即使线程池不处理任务,换句话说,线程池里面的线程是空闲的,线程数也不会低于这个值。

maxPoolSize:线程池最大的线程数。线程池要处理很多任务,即使任务有积压,线程池里面的线程数也不会超过这个值。

long keepAliveTime:一开始任务数很少,线程数是corePoolSize,突然来了一大批任务,线程数达到maxPoolSize。当把这些任务处理完后,超出的每一个线程最多等待多少时间后还没有新任务到来,就销毁线程。

TimeUnit unit:超出的线程等待的时间度量单位

BlockingQueue workQueue:BlockingQueue是个接口,表示队列。任务超出线程池处理能力后,会把多出来的任务放到队列中。BlockingQueue常用的实现类有ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque、PriorityBlockingQueue,不同的实现类表示不同的队列。这几个类有什么区别???

如BlockingQueue queue = new ArrayBlockingQueue(10000); //最多放10000个任务

ThreadFactory threadFactory:ThreadFactory也是个接口,主要用于设置线程池中线程的名称前缀、组名等等,常用的有2种生成对象的方法:

①利用jdk原生的Executors的defaultThreadFactory()方法,全类名是java.util.concurrent.Executors。如下

ThreadFactory factory = Executors.defaultThreadFactory();

返回一个DefaultThreadFactory实例,DefaultThreadFactory是java.util.concurrent.Executors的内部类。这时线程名的格式是pool-poolNumber-thread-threadNumber。其中poolNumber是线程池的排位,假如本线程池是系统创建的第一个线程池,poolNumber值就是1,如果是第二个线程池,poolNumber就是2。threadNumber是线程的排位,从1开始,一直到corePoolSize或者maxPoolSize。线程名具体可能是pool-1-thread-1。

②利用guava中的ThreadFactoryBuilder,全类名是com.google.common.util.concurrent.ThreadFactoryBuilder。如下

ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("rpc-pool-%d").setPriority(5).setDaemon(false).build();

③利用commons-lang的BasicThreadFactory,全类名是org.apache.commons.lang3.concurrent.BasicThreadFactory。如下:

ThreadFactory threadFactory = new BasicThreadFactory.Builder().namingPattern("rpc-pool-%d").daemon(false).priority(5).build();

RejectedExecutionHandler handler:RejectedExecutionHandler也是个接口。当任务源源不断的过来,超过BlockingQueue实例的最大负载时,线程池采取的拒绝策略。RejectedExecutionHandler常用的实现类都在ThreadPoolExecutor类中,换句话说,都是ThreadPoolExecutor的内部类,有ThreadPoolExecutor.AbortPolicy、ThreadPoolExecutor.DiscardOldestPolicy、ThreadPoolExecutor.DiscardPolicy。如

RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();

AbortPolicy的拒绝策略是抛RejectedExecutionException异常,DiscardOldestPolicy的拒绝策略是从队列中移除最老的任务,然后把新任务放进队列去。DiscardPolicy的拒绝策略是直接丢弃新任务。

2)ScheduledThreadPoolExecutor有4个构造器,参数最多的构造器有3个参数,依次是int corePoolSize、ThreadFactory factory、RejectedExecutionHandler handler,这3个参数的意思和上面TheadPoolExecutor构造器中对应的参数意思一样,不再赘述。这里要强调的是,ScheduledThreadPoolExecutor的4个构造器内部都是调用父类ThreadPoolExecutor的构造器,其中传的BlockingQueue实例都是DelayedWorkQueue实例(new DelayedWorkQueue),DelayedWorkQueue是ScheduledThreadPoolExecutor的内部类。这个线程池可以执行定时任务吗???

3)spring-context.jar中的org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor。调用无参构造器生成实例,然后调用各种set方法,设置属性即可。如

略。

需要指出的是,在调用setQueueCapacity(int queueCapacity)方法给队列设置大小时,如果传参是正数,则内部用的是LinkedBlockingQueue实例,否则用的是SynchronousQueue实例。

vivo面试题的更多相关文章

  1. 金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上

    金三银四,磨砺锋芒:剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上 引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待! ...

  2. Java面试题(二)--MySQL

    1 存储引擎 1.简单描述一个Mysql的内部结构? MySQL的基本架构示意图: 大体来说,MySQL可以分为server层和存储引擎层两部分. ① server层包括连接器.查询缓存.分析器.优化 ...

  3. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  4. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  5. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...

  6. 从阿里巴巴笔试题看Java加载顺序

    一.阿里巴巴笔试题: public class T implements Cloneable { public static int k = 0; public static T t1 = new T ...

  7. JAVA面试题

    在这里我将收录我面试过程中遇到的一些好玩的面试题目 第一个面试题:ABC问题,有三个线程,工作的内容分别是打印出"A""B""C",需要做的 ...

  8. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  9. .NET面试题系列[4] - C# 基础知识(2)

    2 类型转换 面试出现频率:主要考察装箱和拆箱.对于有笔试题的场合也可能会考一些基本的类型转换是否合法. 重要程度:10/10 CLR最重要的特性之一就是类型安全性.在运行时,CLR总是知道一个对象是 ...

随机推荐

  1. python 多进程读写文件

    import time from multiprocessing import Process, JoinableQueue, cpu_count import csv ####处理一条数据的方法 d ...

  2. 测开之路九十:css的引用方式

    第一种:内联,直接在标签里面加style属性,优先级别最高,但是不利于维护 第二种:页面嵌入,在head标签里面写一个style标签,以类选择器的形式写入,优先级别第二 第三种:外联,样式表链接,单独 ...

  3. 类Calendar

    /* * Calendar类概述及其方法 * * Calendar类概述 * Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR.MONTH.DAY_OF_MONTH.HOUR等 * 日历 ...

  4. 每日js练习

    第一次玩codewars,选了个最简单的题目 要求是: You have to write a function that describe Leo: if oscar was (integer) 8 ...

  5. JS-在本页面禁止页面返回

    这个问题是最近遇到的 解决方案我百度的并测试有效 // 如果你希望用户不用有返回功能 可缩写如下 或使用location.replace('url')跳转链接 history.pushState(nu ...

  6. python 正则表达式 re.match

    #coding:utf-8 import re #匹配内容:单词+空格+单词+任意字符 #\w 单词字符[A-Za-z0-9_] #(?P<name>...) 分组,除了原有的编号外在指定 ...

  7. Docker command line 学习笔记

    deprecated ! 以后直接对这个更新 http://wangzhezhe.github.io/blog/2015/08/10/docker-operations/ 之前整理了好久,每次用到一点 ...

  8. python字典-基础

    一.解释 像列表一样,“字典”是许多值的集合.但不像列表的下标,字典的索引可以 使用许多不同数据类型,不只是整数.字典的索引被称为“键”,键及其关联的值 称为“键-值”对. 二.列表创建方式 1. I ...

  9. Ubuntu解决Nvidia驱动缺失导致的HDMI无法输出问题

    朋友的电脑是联想Y7000,因为Nvidia驱动的问题几次头疼脑大.这次是出现了HDMI在Windows 10下输出正常,而Ubuntu系统下无法输出. 原因分析 如果通过HDMI去连接显示器以后会发 ...

  10. Html标签替换(过滤掉html特殊符号)

    /// <summary> /// 替换标签,把 <>" 替换为HTML标记 /// </summary> /// <param name=&quo ...