面试总结(某猎头公司)

面试总结(某猎头公司)

两个Long对象判断相等

使用equals方法判断两个long对象相等

UTF-8字符如何转成GBK集,具体怎么实现的

String的重载方法,将字节数组传入String的构造器,传入指定的字符,可以实现相互转换字符集

线程的几种创建方法

  1. 继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。此方式没有返回值。
  2. 实现Runnable接口,复写run方法,创建Thread类对象,将Runnable子类对象传递给Thread类对象。调用start方法开启线程。此方法2较之方法1好,将线程对象和线程任务对象分离开。降低了耦合性,利于维护。此方式没有返回值。
  3. 创建FutureTask对象,创建Callable子类对象,复写call(相当于run)方法,将其传递给FutureTask对象(相当于一个Runnable)。 创建Thread类对象,将FutureTask对象传递给Thread对象。调用start方法开启线程。这种方式可以获得线程执行完之后的返回值。该方法使用Runnable功能更加强大的一个子类.这个子类是具有返回值类型的任务方法。
  4. 线程池的方式

线程池的核心参数介绍一下

1
2
3
4
5
6
7
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

corePoolSize核心线程数量:线程池内部核心线程数量,如果线程池收到任务,且线程池内部线程数量没有达到corePoolSize,线程池会直接给此任务创建一个新线程来处理此任务

maximumPoolSize最大允许线程数量:线程池内部线程数量已经达到核心线程数量,即corePoolSize,并且任务队列已满,此时如果继续有任务被提交,将判断线程池内部线程总数是否达到maximumPoolSize,如果小于maximumPoolSize,将继续使用线程工厂创建新线程。如果线程池内线程数量等于maximumPoolSize,就不会继续创建线程,将触发拒绝策略RejectedExecutionHandler

keepAliveTime、unit:当线程池内部的线程数量大于corePoolSize,则多出来的线程会在keepAliveTime时间之后销毁

workQueue工作队列:线程池需要执行的任务的队列,通常有固定数量的ArrayBlockingQueue,无限制的LinkedBlockingQueue

threadFactory线程工厂:线程池内初初始没有线程,任务来了之后,会使用线程工厂创建线程

handler拒绝策略:当任务队列已满,又有新的任务进来时,会回调此接口。有几种默认实现,通常建议根据具体业务来自行实现

线程池核心线程数是5个,启动的时候会创建几个工作线程

启动的时候不会创建线程,只有执行execute方法的时候才会创建工作线程,每次执行execute方法会创建一个工作线程执行任务,直到工作线程等于核心线程数

线程池的阻塞队列里的任务什么时候会被获取执行

当工作线程满了并且等于核心线程数的时候,如果继续向线程池提交任务,队列如果也没有满的话,就将会从阻塞队列里获取任务并执行;如果队列满了,并且核心线程小于最大线程数的时候,就会创建新的工作线程从队列获取任务执行

Java Exception的父类是什么

Throwable是所有异常类和Error的父类

RuntimeException、Exception和Error区别

RuntimeException是运行时异常类

Exception是异常类,是运行时异常的父类

Error是错误类

项目的业务异常为什么要定义RuntimeException

因为是业务类的异常,业务异常都是业务类型的错误,所以只能定义运行时异常

Http和Https区别

https是加密的http协议

Spring Bean 默认类型

单例的Singleton Bean

单例Bean 原型Bean 在销毁的时候是否一样的

不一样,scope为prototype的bean,容器会将创建好的对象实例返回给请求方,之后,容器就不再拥有其引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。

所以:scope为singleton的bean的destroy方法则是在容器关闭时执行,而scope为prototype的bean是不会执行destroy方法的

Mysql 联合索引 (a + b + c),以下哪些会走索引

select * from table where a = ? and b = ? 会走索引
select * from table where a = ? and c = ? 会
select * from table where b = ? and c = ? 不会
select * from table where b = ? and a = ? 会

建索引的几大原则:

1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

2、=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

3、尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。

4、索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’)。

5、尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

有一个user表,需要根据age倒序排,然后获取50-80行的数据,sql怎么写

SELECT * FROM user ORDER BY age desc limit 50, 30;