问题整理(常问3连)

Posted webster1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题整理(常问3连)相关的知识,希望对你有一定的参考价值。

1、static final关键字的作用
static final用来修饰成员变量和成员方法,可以理解为“全局变量”
final成员变量表示常量,只能被赋值一次,赋值后不能再被改变
final类不能被继承,final类中的方法默认是final的
final方法不能被子类的方法复盖

static表示“静态”的意思 用来修饰成员变量和成员方法
静态变量:它不属于任何实例对象,是属于类的,所以在内存中只会有一份,在类的加载过程中,JVM为静态变量分配一次内存空间

2、bio、nio、aio 区别
BIO表示同步阻塞式IO:客户端有连接请求时服务器端就需要启动一个线程进行处理,处理过程线程是阻塞的
NIO表示同步非阻塞IO:客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理
AIO表示异步非阻塞IO:服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成IO操作后再通知服务器应用来启动线程进行处理。
什么是同步什么是异步?
同步是这事情要我自己干。
异步是这事情我可以喊别人帮我干,然后后面它通知我返回结果
IO是什么?
两个过程,一个是等待数据的过程(准备),一个是读写(拷贝)数据的过程

3、什么是平衡二叉树
可以是空树。
左右子树的高度相差不超过 1 的树为平衡二叉树
二叉搜索树的查找效率取决于树的高度,因此保持树的高度最小,即可保证树的查找效率
平衡二叉树的失衡调整主要是通过旋转:有两种处理方式,左旋 与 右旋

4、堆栈溢出一般是由什么原因导致的?
Memory Analyzer 插件安装
可能是由于循环的递归引起的 (栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出)
动态申请空间使用之后没有释放 (不断的new 一个对象,一直创建新的对象,就会造成堆溢出)
nio直接操作内存,内存过大导致溢出

5、SQL语句的优化? (mysql优化)
1:按需查询 避免“select *”
2:有嵌套查询时,尽可能在内层过滤掉数据
3:多表关联查询时,需注意表顺序,并尽可能早的过滤掉数据 在使用Join
4:嵌套表数据 内表大小确定是否用 in 或 exists

6、带索引的sql优化
遵循SARG范围内的匹配 sql查询语句查询过程中用到索引查找的是SARG写法
对字段进行 null 值判断
能用UNION ALL就不要用UNION
遵循最左索引
用not exists都比not in要快
函数和运算 都会导致失效 等待

7、什么是多态?
指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为
实现多态有 3 个必要条件:继承、重写和向上转型
继承:有继承关系的子类和父类
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法
向上转型:将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

多态分为编译时多态(重载)和运行时多态(重写)

8、HTTP和HTTPS的主要区别?
传输信息安全性:
http是超文本传输协议,信息是明文传输
https是具有安全性的ssl加密传输协议 (浏览器和服务器之间的通信加密)

连接方式不同:
http的连接很简单,是无状态的
https是由SSL+HTTP协议构建的

端口不同:
http端口是80, https端口是443

证书申请方式不同
http是免费的, https需要到ca申请证书

SSl是一种安全协议

9、长连接与短连接
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接(如:http)
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接(如:tcp)

10、String,Stringbuffer,StringBuilder的区别
String类被final修饰是不可变的 (拼接的字符串jvm会创建新的对象,并将就的对象回收掉,所以执行速度很慢)
StringBuilder与StringBuffer都继承自AbstractStringBuilder 使用的字符数组
StringBuilder没有对方法进行加同步锁,所以是 非线程安全的

11、ArrayList和LinkedList有什么区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

12、JAVA8的ConcurrentHashMap为什么放弃了分段锁
锁的粒度 (加入多个分段锁浪费内存空间)
首先锁的粒度并没有变粗,甚至变得更细了。每当扩容一次,ConcurrentHashMap的并发度就扩大一倍。
Hash冲突 (map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待)
JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntry)能够快速的找到查找的元素。在1.8中通过链表加红黑树的形式弥补了put、get时的性能差距。
扩容 (为了提高 GC 的效率)
JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。

13、JAVA的反射机制?
在运行状态中,对于任意一个类,动态获取或调用类的属性和方法
Class cls = Class.forName("chb.test.reflect.Student");
Object student = cls.newInstance();
Field field = cls.getDeclaredField("age");

Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);
setMethod.invoke(student, 15);//调用set方法

反射有什么用
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
生成动态代理

14、反射中,Class.forName和ClassLoader区别
Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块 ( Class.forName(name,initialize,loader)带参数也可控制是否加载static块 )
classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块

15、Spring如何处理线程并发问题?
绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题

16、Spring中@Autowired和@Resource之间的区别
@Autowired默认是按照类型装配注入的
@Resource默认是按照名称来装配注入的

17、Spring 框架中都用到了哪些设计模式?
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例
单例模式:Bean默认为单例模式。。
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate

18、Spring支持的几种bean的作用域?
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 等

18、spring的事务传播行为?
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务 (内部嵌套事物失效)
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务 (内部嵌套隔离开不会相互影响提交,外部事物挂起)
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行 (上下文事务 ,如果外部方法没有事物则以无事物方式运行)
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 ()
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常 等等

事务的隔离级别多个事务并发运行会诱发3个问题
脏读(a方法update还未提交,b方法select出来的数据还是未提交的原数据)
不可重复读和幻读(1或N事物。多次查询每次读的数据不一致)不可重复读的重点是修改 / 幻读的重点在于新增或者删除同样的条件

Spring中的隔离级别
ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别
ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据 (不可重复读,幻读,读未提交)
ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新 (可以防止脏读 不可重读,读提交)
ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新 (可以防止脏读,不可重复读 ,会出幻读(锁定所读取的所有行),可重复读)
ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新 (三种问题都可以避免但是性能低(锁表),可串行化)

19、Spring加载bean流程
1. 加载applicationContext.xml XML文件,封装成Resource(urlResource/classpathResource)对象
2. 调用Reader对象方法读取XML文件内容,并将相关属性放到BeanDefinition实例
3. 将BeanDefinition对象放到BeanFactory对象
将applicationContext.xml配置的Bean信息构成BeanDefinition对象,然后放到Factory的map中(这一步就是所谓的注册),这样以后程序就可以直接从Factory中拿Bean信息了

20、多线程常用的线程模型
Futura模型 (Future模型通常在使用的时候需要结合Callable接口配合使用)
Join模型 (拆分任务)
Master-Worker模型 (任务分发策略,开启一个master线程接收任务,然后在master中根据任务的具体情况进行分发给其它worker子线程,然后由子线程处理任务。如需返回结果则worker处理结束之后把处理结果返回给master)

21、线程池的几个参数含义
线程池的核心线程数
线程池最大线程数 (当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常)
线程空闲时间 (线程池的工作线程空闲后,保持存活的时间,当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=核心线程数)
任务队列 (当核心线程数达到最大时,新任务会放在队列中排队等待执行)
任务拒绝处理器:
两种情况会拒绝处理任务:
- 当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
- 当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务


22、单例模式
1:饿汉式
private static final Singleton instance = new Singleton();
public static Singleton getInstance() return instance ;
2:懒汉式 (多线程不安全)
private static Singleton singleton;
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
3:懒汉式 双重锁机制 (if (instance == null) + synchronized(Singleton.class) + if (instance == null))
4:静态内部类(懒加载,线程安全)
public class Singleton {
private Singleton() {}
//内部类在外部类调用的时候才会被初始化
// 内部类一定要在方法调用之前初始化
private static class SingletonInstance {
private static final Singleton instance = new Singleton();
}
// static 使单例空间共享 final使得方法不能被重写重载
public static final Singleton getInstance() {
return SingletonInstance.instance;
}
}









0








以上是关于问题整理(常问3连)的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发,重点iOS技术点+面试题整理

Android面试:整理了Android面试官最常问的174道面试题,让你秒变offer收割机

iPhone开发常问的十个问题

万字长文,最常问的MySQL面试题集合

面试官最常问的10道测试用例和5道思维面试题及答案,每1题都很经典

MyBatis 延迟加载一二级缓存架构设计的面试题(常问,重点了解)