写在前面:本篇面试题整理是我在北京地区进行面试整理得出,常见的基本都在下面了。java
封装:对象只须要选择性的对外公开一些属性和行为。
继承:子对象能够继承父对象的属性和行为,而且能够在其之上进行修改以适合更特殊的场景需求。
多态:容许不一样类的对象对同一消息作出响应。web
数据类型 | 占用字节 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
char | 2 |
boolean | 4 |
int是Java中的原始类型,Integer是Java为int提供的封装类,他们有不一样的特征和用法,包括大小、速度、默认值。面试
String一旦定义就不可改变,可空赋值。操做少许数据时使用。
StringBuilder可改变,线程不安全。操做单线程大量数据时使用。
StringBuffer 可改变,线程安全。操做多线程大量数据时使用。数据库
ArrayList和Vector都是使用数组方式存储数据,容许按序号索引元素,可是插入数据会涉及到元素移动等内存操做,因此索引快插入慢。编程
ArrayList懒加载 默认大小10 每次扩容1.5倍 线程不安全 性能较高
Vector 实例化时初始化 默认大小10 每次扩容2倍 线程安全 性能较低 已弃用后端
多读少写建议使用CopyOnWriteArrayList
CopyOnWriteArrayList原理是发生修改的时候复制一份
多写少读或读写比较均匀建议使用Connections.synchronizedList数组
LinkedList 使用双向链表方式存储数据,插入只须要记录本项的先后项,索引须要向前或向后进行遍历,因此插入速度较快,线程不安全,频繁在任意位置插入和删除的状况可使用,若是须要多线程访问,可使用Connections.synchronizedList()或ConcurrentLinkedQueue缓存
Collection是集合类上级接口,继承他的主要有List和Set
Collections是集合类的帮助类,提供了对集合的搜索、排序、线程安全化等操做。安全
List是存储单列数据的集合,Map是存储键值对双列数据的集合
List存储的数据是有顺序且可重复的,Map存储的数据是无顺序,键不可重复,值可重复的。服务器
HashMap是Map接口的实现,非线程安全,容许空键值。
HashTable是Dictionary的子类,线程安全,不容许空键值。几乎被淘汰,建议使用ConcurrentHashMap。
HashMap使用的是快速失败迭代器,在迭代器建立后,除非经过迭代器自身的remove或者add方法,其余任何方式的修改都会抛出异常。
JDK1.8之前:数组+单链表的组合,以键值对的方式存储元素。
JDK1.8及之后:引入红黑树结构,添加元素时,若链表个数大于8,链表会转换为红黑树,反之小于6时会修剪或还原成链表结构。
选择6和8能够有效防止频繁的链表和红黑树转换。
扩容条件:
String最为常见,由于String对象不可变,且重写了equals和hashcode方法。
不可变性是必要的,若是key的hashcode存入和获取是不一致,就没法找到。
获取对象时须要用到equals和hashCode方法,正确的重写这两个方法是很是重要的,由于两个不相等的对象返回不一样的hashCode的话,碰撞的概率就会小些,就能够提升HashMap的性能。
final用于修饰属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示老是执行。
finalize是Object类的一个方法,在GC执行时会调用被回收对象的此方法。
sleep()是Thread类的,wait()是Object类的方法
sleep不会释放锁,wait会释放锁。
sleep可在任意地方使用,wait notify notifyAll只能在synchronized块\方法中使用。
sleep必须捕获异常,而wait不须要。
抽象类中能够有构造方法、静态方法、普通方法、普通成员变量。接口中不能有。
抽象类中的抽象方法访问类型能够是public、protected和默认类型,接口中只能是public。
抽象类中的静态成员变量访问类型能够任意,接口中只能是public的。
一个类只能继承一个类,可是能够实现多个接口。
抽象类和子类为“是否是”的关系。主要用于为一些类提供公共实现代码。
接口和实现为“有没有”的关系。主要用于代码的扩展性和可维护性。
重载是一个类中多态性的一种表现,在一个类中定义了多个同名的方法,他们有不一样的参数列表。
重写是父类与子类之间多态的一种表现,子类中定义了与父类有相同名称和参数的方法时,子类对象使用该方法会调用子类中的定义。
forward是服务器请求资源,服务器访问目标URL,把响应内容发给用户,用户不知道数据是从哪来的。
redirect是服务器向客户端发送一个状态码,告知从新请求该URL。
服务器启动时会创建必定数量的池链接,客户端须要链接时,池会返回一个未使用的链接并将其标记为忙,若是没有空闲链接,池会新建必定数量的链接,当链接使用完毕后,池会将其标记为空闲。
序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化,能够对流化后的对象进行读写操做,也能够将流化后的对象传输于网络之间。
可经过实现java.io.Serializable接口来实现序列化。
AOP是面向切面编程,用于在不改变原有逻辑的基础上增长一些额外的功能,如事务管理、日志、缓存、权限控制等。
Spring AOP是基于代理的。
若是目标对象实现了接口,则默认采用JDK动态代理。
若是目标对象没有实现接口,则采用CgLib进行动态代理。
若是目标对象实现了接口,且强制CgLib代理,则采用CgLib动态代理。
IOC翻译为控制反转,他还有个别名为DI(依赖注入)。
IOC就是由IOC容器来负责对象的生命周期和对象之间的关系。
控制反转就是原本应该你作的事情,让系统去作,好比一般获取一个对象须要经过new,而使用IOC则是IOC将对象建立后注入到被注入的对象中。
注解注入(Spring)、构造器注入、setter方法注入、接口方式注入(不推荐)
#{}是预编译,可防止SQL注入。${}是直接拼接在SQL语句中。
核心注解:@SpringBootApplication
包含:
@SpringBootConfiguration 实现配置文件功能
@EnableAutoConfiguration 打开自动配置功能
@CompoentScan 组件扫描功能
属性上使用@Value注解
类上使用@ConfigurationProperties注解
读取指定文件注解可在类上使用@PropertySource(不支持yml文件读取)
注入Environment对象获取到。
SpringCloud采用基于HTTP的REST API,Dubbo采用RPC方式。
请求熔断:请求服务失败量超过必定比例(默认50%)断路器会切换到开路状态,这时全部请求不会发送到后端服务,断路器在保持开路状态一段时间后(默认5秒),自动切换到半开路状态。这时若是下一次请求成功,断路器切回闭路状态,不然从新切换到开路状态。
服务降级:对于查询操做,能够实现一个fallback方法。当请求服务出现异常时,可使用fallback方法返回的值。
依赖隔离:经过线程池来实现资源隔离,好比一个服务调用另外两个服务,若是这两个服务在同一线程池,那么若是一个服务卡住,后面的请求又来了,就会致使后面的请求都会卡住等待。
请求缓存:缓存上次请求结果,返回给后续请求。
请求合并:把多个请求合并成一个请求,提高效率。
原子性:不可分割的操做单元,要么所有成功,要么回滚。
一致性:若是执行事物以前数据库是一致的,那么执行后仍是一致的。
隔离性:事物操做之间彼此独立和透明,互不影响。
持久性:事物一旦提交,其结果就是永久的。
未提交读:容许脏读,其余事物只要修改了数据,即便未提交,本事物也能看到修改后的数据值。
提交读:只能读取到已提交的数据。
可重复读(innoDB默认):不管其余事物是否修改并提交了数据,这个事物中的数据不受影响。
串行读:彻底串行化的读,每次读都要得到锁,读写相互都会阻塞。
使用更小的整数类型、尽量的定义字段为not null(不然会致使索引复杂)、
只建立须要的索引、分库分表。
使用explain检查复杂SQL语句、LIMIT语句尽可能要跟order by或distinct、
插入多条数据时使用单条INSERT语句。
InnoDB支持事物,MyISAM不支持。
InnoDB支持外键,MyISAM不支持。
InnoDB是汇集索引,MyISAM是非汇集索引。索引和数据文件是分离的。
InnoDB必需要有主键(没有会本身找或建立),MyISAM能够没有。
InnoDB不保存表的行数,MyISAM用了一个变量保存表的行数。
InnoDB支持表、行级锁 默认行级锁,MyISAM只支持表级锁。
like查询使用%开头,用%结尾的可使用索引。
where语句中使用<>或!=。
where语句中使用or,且没有把or中的全部字段加上索引。
where语句中对字段表达式操做。
where语句中使用NOT IN。使用简单的IN会使用索引。
垂直切分:某个表字段过多,能够将不经常使用或字段长度较大的字段拆分出去到扩展表中。 水平切分:分为库内分表和分库分表,是根据表内数据的逻辑关系,按照不一样的条件分散到多个数据库或表中。