圆通快递面试问题

1、Java中线程池包含了那些参数?各参数的作用是什么?(ThreadPoolExecutor)
比如去火车站买票, 有10个售票窗口, 但只有5个窗口对外开放. 那么对外开放的5个窗口称为核心线程数, 而最大线程数是10个窗口.
如果5个窗口都被占用, 那么后来的人就必须在后面排队, 但后来售票厅的人会越来越多, 已经人满为患, 就类似于线程队列已满.
这时候火车站站长下令, 把剩下的5个窗口也打开, 也就是目前已经有10个窗口同时运行. 后来又来了一批人,10个窗口也处理不过来了,
而且售票厅人已经满了, 这时候站长就下令封锁入口,不允许其他人再进来, 这就是线程异常处理策略.而线程存活时间指的是,
允许售票员休息的最长时间, 以此限制售票员偷懒的行为。
ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 闲置线程存活时间
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingDeque(),// 线程队列
Executors.defaultThreadFactory(),// 线程工厂
new AbortPolicy()// 队列已满,而且当前线程数已经超过最大线程数时的异常处理策略
);

2、BIO、NIO和AIO的区别和使用场景述一下?
IO:面向流
BIO:同步阻塞
NIO:面向缓冲,同步非阻塞,流同时具备读和写的功能。高并发(万人聊天)
AIO:异步非阻塞,异步IO的缩写

有一个烧水的案例:
假设有一个场景,有一排水壶在烧水
BIO:叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理,文件的上传和下载。
NIO:叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理,高并发的聊天工具,频繁的交换数据,但是数据量很小。
AIO:每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
由此可见AIO是最智能的,NIO相对省力,BIO最愚蠢,劳动力低下。

3、HashMap、HashTable的区别?
(1).HashMap:线程不安全效率高的,键值可以为null。
(2).Hashtable:线程安全效率低的,查看源码发现内部是通过sychronized实现的,而且键值不能为null。
(3).多线程环境下,通常用HashMap和Collections工具类一起使用实现线程安全,下面有介绍。
(4)HashMap的key、value值均可为null,Hahtable的key、value值均不可为null
但两者的的key值均不能重复,若添加相同key的键值对,后面的value会自动覆盖前面的value,
但不会报错。

4、ArrayList、Vector、LinkedList的区别?
Vector和ArrayList本质都是用数组实现的,而LinkList是用双链表实现的。
Vector是线程安全的,ArrayList是线程不安全的。
扩容:扩容的代价很高,所以能确定容量范围时尽量指定
注意:只有ArrayList和Vector可以指定。

5、说说对Volatile关键字的理解?
1、内存可见性,即线程A对volatile变量的修改,其他线程获取的volatile变量都是最新的。
2、可以禁止指令重排序。
那么什么是指令重排序?–为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱。

6、Spring中FactoryBean和BeanFactory有什么区别?
https://blog.csdn.net/cap423654/article/details/81591980
首先,这俩都是个接口;
实现 BeanFactory 接口的类表明此类事一个工厂,作用就是配置、新建、管理各种Bean。
而 实现 FactoryBean 的类表明此类也是一个Bean,类型为工厂Bean(Spring中共有两种bean,一种为普通bean,另一种则为工厂bean)。
顾名思义,它也是用来管理Bean的,而它本身由spring管理。

7、说说对IOC和AOP的理解?
Spring的核心主要包括IOC和AOP;
内部最核心的是IOC,即控制反转,就是将一个对象的创建反转给Spring框架来完成,主要实现方式是在Spring的xml配置文件的bean标签中来
配置创建对象和调用对象的方法。其中用到的是Java里面的反射技术,在运行时动态的去创建和调用对象。
其次还有一个核心内容是AOP,即面向切面编程,就是在调用某一类对象的具体方法的前后去调用你指定的模块,从而达到对一个模块扩充的功能,
这些都是通过在配置文件中配置来完成的。
其中包含两个重要的概念:静态代理和动态代理。
静态代理就是针对于某个类或者接口编写一个代理类;动态代理是针对于一个方面,利用JDK反射包中的Proxy类为各种接口动态生成代理类。
Spring目的:就是让对象与对象(模块与模块)之间的关系不是通过代码来关联的,而是通过配置文件来说明管理的,Spring是一个容器,
只有在容器里的对象才会有Spring所提供的这些服务和功能。

8、JDK各个版本的新特性jdk1.8-jdk9(每个版本至少写2条新特性)
1、新增default关键字
2、新增Lambda表达式,这意味着java也开始承认了函数式编程。
3、对Date Api进行更新  
jdk1.9新特性:
1、模块化系统
2、集合工厂方法
3、接口中的私有方法
4、响应式流

9、动态代理有几种实现方式?分别是什么?有什么区别?
1、jdk动态代理 创建接口,实现类,主类中使用Proxy调用newProxyInstance方法。
2、cglib动态代理 调用CglibProxy对象。
两者区别:jdk动态代理基于接口,cglib基于类即可。
https://www.cnblogs.com/wenming205/p/7600388.html

10、final、finalize、finally有什么区别?
在java中,final可以用来修饰类,方法和变量;
finally只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行,经常被用在需要释放资源的情况下。
finalize()是在Object对象中定义的,这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象,
所以一般是不需要程序员去实现finalize的。

11、有表t_student,包含score字段,如何查出分数最高的前1000名学生?
请写出相关SQL,注意SQL性能。
ALTER TABLE t_student ADD INDEX score (column)
SELECT * FROM t_student ORDER BY score DESC LIMIT 0,1000;

12、有一个整型数组[a,b,c,d,e],根据数组元素大小并以a<=b>=d<=c>=e格式输出,举列:数组
[1,5,3,4,7,5],输出如:1<=4>=3<=7>=5<=5,请写出相关算法代码。
// 第二种方法
public static void method2(int[] array) {
// 直接按0,2,1,4,3,6,5,8,7…的顺序排序
for (int i = 0; i < array.length; i = nextIndex(i)) {
for (int j = nextIndex(i); j < array.length; j = nextIndex(j)) {
if (array[i] > array[j]) {
int c = array[i];
array[i] = array[j];
array[j] = c;
}
}
}
}

public static int nextIndex(int i) {
return i == 0 ? i + 2 : (i % 2 == 0 ? i - 1 : i + 3);
}

13、Post和get的区别?
1、get是从服务器上获取数据,post是向服务器传送数据。
2、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
3、get安全性非常低,post安全性较高。但是执行效率却比Post请求高。
4、在进行文件上传时只能使用post而不能是get。

14、Kafka的简单概述
Kafka是一个分布式发布-订阅消息传递系统。
producer:消息生产者,发布消息到kafka集群的终端或服务。
consumer:从kafka集群中消费消息的终端或服务。
topic:每条发布到 kafka 集群的消息都属于topic类别,即 kafka 是面向 topic 的。
生产者将输入写入到主题topic,而消费者则从主题topic中读取写入的数据。因为卡夫卡是一个分布式系统,所以topic主题会实现跨多个节点
分区和复制。

15、Redis的使用?
1、活动倒计时方案
2、秒杀方案

16、group by的作用
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,
然后针对若干个“小区域”进行数据处理
看到每一般情况下都需要group by

17、索引建立在什么字段上?
1、表的主键、外键必须有索引;
2、经常与其他表进行连接的表,在连接字段上应该建立索引;
3、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

18、模糊查询like查询时索引生效?
前通配走全表,后通配走索引。

19、maven的使用,packet打包和install打包的区别?
1.install:打包好的jar包会安装到本地的maven仓库中,供其他项目使用。
2.package 指定参数打包,打包后的文件存放到项目的target目录下。

20、mysql组合索引
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引,比如给用户名和密码同时建立索引。

redis分布式锁
业务场景是要求同一个用户针对同一类借款,只可以存在一笔待还借款。
第三方平台每次都会在同一时间发送多次相同的借款请求。
使用redis锁控制用户借款串行执行。

jdk8的函数表达式的原理
JDK8在实现Lambda时使用了JDK7虚拟机开始有的invokedynamic方法调用指令,该知使得虚拟机执行到Lambda 表达式时才动态的去创建相应的实现类,并加载执行。

线程安全和线程不安全是怎么定义的?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时进行保护,其他线程不能进行访问直到该线程读取完,
其他线程才可使用。线程不安全会出现数据不一致或者数据污染。

redis的存储数据用过哪些?
String、List、Set、Hash、SortedSet。

mq异常处理怎么用的?用在什么场景?
1、Broker 禁止自动创建 Topic,且用户没有通过手工方式创建Topic

添加商品信息后要同步索引库,同步缓存,生成静态页面。ConnectionFactory、topicDestination
为了解决业务逻辑耦合度高,业务拆分不明确问题。

1、springMVC的执行原理
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配到DispatcherServlet的请求映射路径(在web.xml中指定),
web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及
HandlerMapping的配置找到处理请求的处理器(Handler)。
3、将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
4、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
5、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
6、Dispatcher通过model解析出ModelAndView()中的参数进行解析,最终展现出完整的view并返回给客户端。

请求–前端控制器–处理器–处理器适配器–试图对象–前端控制器–视图解析器
2、Mybatis和JDBC有什么不同?
JDBC是Java提供的一个操作数据库的API;
MyBatis是对JDBC的封装,可以优化获取和释放;可以进行SQL统一管理,对数据库进行存取操作;
可以生成动态SQL语句,Mybatis可以在配置文件中通过使用标签进行SQL语句的拼接,生成动态SQL语句。

3、线程有哪几种停止方式?有什么区别?
1、在循环中设置flag标志控制退出。
2、使用interrupt方法终止线程。

4、怎样进行权限控制? 用的什么权限框架,说一下执行过程? 单点登录是怎么实现的,说一下大概思想?
Shiro是一个权限管理的框架,实现用户认证、用户授权和会话管理。
SSO:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
流程:首先在portal门户页面点击登录跳转到sso模块中的登录页面,输入用户名和密码后先校验,校验成功后生成token,把token作为key,用户信息
作为value放入到redis中,并设置过期时间,然后保存成功后返回登录成功,并把token放入到cookie中。

1、session是存储在服务器端,cookie是存储在客户端的。
2、session的安全性要比cookie高,然后我们获取session里的信息是通过存放在会话cookie里的sessionid获取的。
3、由于session是存放在服务器的内存中,所以session里的东西不断增加会造成服务器的负担,所以需要把很重要的信息才存储在session中,
而把一些次要东西存储在客户端的cookie里。
cookie分为两大类:会话cookie和持久化cookie,会话cookie的生命周期和浏览器是一致的,浏览器关了会话cookie也就消失了;
持久化cookie是存放在客户端硬盘中,持久化cookie的生命周期就是我们在设置cookie时候设置的那个保存时间,
当浏览器关闭时session会不会丢失?
当浏览器关闭的时候只是会话cookie中的sessionid消失了,但session的信息还存在服务器端。
session在什么情况下丢失?
在服务器关闭的时候,或者是session过期(默认时间是30分钟),再或者调用了invalidate()方法。
session在什么时候被创建呢?
通过调用getsession()来创建。
访问HTML页面是不会创建session,但是访问index.JSP时会创建session(JSP实际上是一个Servlet,Servlet中有getSession方法)。

1、从地址栏上区别:forword转发地址栏不发生变化,redirect转发地址栏发生变化。
2、从性能上区别:forword性能要高于redirect。
因为上性能的问题,在项目中请求跳转建议使用forword,如果是跨域访问,建议使用redirect。

一切脱离业务的架构设计与新技术的引入都是耍流氓。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章