当前位置: 首页 > news >正文

vivx面试题

0、自动拆箱和装箱

所有的原始类型和对应的引用类型都支持自动装箱和拆箱,不仅仅是数字类型(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实例。

转载于:https://www.cnblogs.com/koushr/p/5873403.html

相关文章:

  • centos7.2编译安装mysql5.7.21报错解决
  • 进程与线程区别
  • ASP.NET CORE系列【四】基于Claim登录授权
  • 【JSConf EU 2018】主题总结 (部分主题已有中文文章)
  • Java系列之EJB 理解
  • 百度echarts可以做什么
  • 第六章
  • Disruptor并发框架
  • Oracle基础学习(二) 存储过程和函数
  • (四)Linux Shell编程——输入输出重定向
  • RHEL6解决无法使用YUM源问题 {已验证切实可行}
  • .NET Core 中的路径问题
  • 太多脚本将会毁掉持续交付
  • java中的equals和==
  • Fcoin交易所的危险游戏!韭菜请远离!
  • 【知识碎片】第三方登录弹窗效果
  • Android Studio:GIT提交项目到远程仓库
  • java第三方包学习之lombok
  • opencv python Meanshift 和 Camshift
  • PAT A1017 优先队列
  • swift基础之_对象 实例方法 对象方法。
  • Vue.js源码(2):初探List Rendering
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 成为一名优秀的Developer的书单
  • 关于List、List?、ListObject的区别
  • 我有几个粽子,和一个故事
  • ionic异常记录
  • ​io --- 处理流的核心工具​
  • ​低代码平台的核心价值与优势
  • #{}和${}的区别?
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (03)光刻——半导体电路的绘制
  • (13)Hive调优——动态分区导致的小文件问题
  • (8)STL算法之替换
  • (附源码)计算机毕业设计大学生兼职系统
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转) Face-Resources
  • (转)EOS中账户、钱包和密钥的关系
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 6 redis操作类
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net Core与存储过程(一)
  • .NET Framework杂记
  • .NET中winform传递参数至Url并获得返回值或文件
  • .NET中使用Redis (二)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • /usr/bin/env: node: No such file or directory
  • @AutoConfigurationPackage的使用
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [20150629]简单的加密连接.txt
  • [APIO2015]巴厘岛的雕塑
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [IE编程] IE 是如何决定Accept-Language 属性的
  • [IE技巧] 让IE 以全屏模式启动