Java面试

【Java面试】1.进程和线程的区别
进程是程序运行和分配资源的基本单位,一个程序至少有一个进程,一个进程至少有有个线程。
线程是进程的一个实体,线程是cpu调度和分派的基本单位,是比程序更小的能够独立运行的基本单位。
2.Http求情方式
GET、POST、PUT、DELETE对应着查、改、增、删。
GET一般用于查询或获取资源,POST一般用于更新资源信息。
3.JDK1.8做了那些优化
JDK1.8中对hashmap等map集合数据结构做了优化,原来的hashmap采用的数据结构是数组+链表的,hashmap默认大小16,一个0-15的索引的数组。如何往里面存储数据,首先引用的元首的hashcode方法,计算出哈希值,经过哈希算法计算成数组的索引值,如果对应的索引出没有元素,则直接存放,如果有值则进行比较他们的内容,如果一样后一个value会覆盖前一个value,如果不一样,在1.7的时候,后加的会放在前面,形成一个链表,形成碰撞,在某些情况下,如果链表无限增长,那么效率就会极低,碰撞是避免不了的。在1.8之后,在数组+链表+红黑二叉树来实现hashmap,当碰撞元素超过8个或总容量超过64的时候会引入红黑树。
4.红黑二叉树特征
①根节点是黑的
②节点是黑或红的
③每个叶子的节点都是黑色的空节点
④每个红色节点的两个子节点都是黑色的
⑤从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
5.JVM的组成部分
类加载器、运行时数据区、执行引擎、本地库接口。
运行时数据区:
①程序计数器:就是记录程序进程运行的时间信息等
②java虚拟机栈:存储每个方法从调用直至运行完成的过程,类似于入栈出栈。
异常规定:StackOverFlowError 线程请求的栈深度大于虚拟机锁允许的深度
OutOfMemoryError 扩展时无法申请到足够的内存。
③本地方法栈:存储一些本地的方法
④java堆:存放对象实例
⑤方法区:存储被虚拟机加载的类信息,常量,静态变量,即编译后的代码等数据。
6.垃圾回收算法
①引用计数算法
给每一个对象添加一个引用计数器,当有其它地方引用的时候计数器+1,引用失效的时候-1.当计数器为0的时候判断对象不再引用,此时这个对象就可以被回收了。
②分代收集算法
在新生代选用复制算法,在老年代可选用标记-清理或标记-压缩算法进行回收。
7索引的类型
①普通索引:可以进行普通的增、删、改。
②唯一索引:主键唯一,但允许为空值。
③组合索引:多个字段创建索引时,只有在创建索引时,使用索引的第一个字段,一般在创建表时,创建索引。
④主键索引:一张表只有一个主键,且不能为空。
⑤全文索引:用于查找关键字,在部署时直接与索引中的值想比较。
8.索引的最左匹配原则
最左匹配原则是针对组合索引的,说的是索引以最左的为起点,任何连续的索引都能匹配上,当遇到范围查询的时候就会停止匹配。
9.分页sql
select * from student limit 页数X页面大小,页面大小。
10.SQL优化
①对查询进行优化,应尽量避免全表扫描,首先应该在where及order by 涉及的列上创建索引。
②应尽量避免在where字句中对字段进行null值判断
③应尽量避免在where子句中使用!=或< >操作符。
④应尽量避免在where字句中使用in 或 not in。
⑤应尽量避免在where字句中对字段进行表达式操作。
⑥应尽量避免在where字句中对字段进行函数操作。
⑦不要在where字句中的=左边进行函数、算数运算或其他表达式运算。
11 TCP和UDP的区别
TCP是面向连接的,UDP是无连接的,TCP提供可靠的服务,也就是说TCP传输的数据不会丢失,也不会重复,并且按顺序到达。UDP没有可靠性。
TCP是面向字节流,实际上TCP把数据看成一连串无结构的字节流:UDP是面向报文的。TCP是全双工的可靠快递,UDP是不可靠的。
12.mybatis中#和$的区别
#把传入的数据都当成一个字符串,会自动对传入数据加上一个双引号,很大程度上能防止sql注入。
$将传入的数据直接显示生产在sql中,无法防止sql注入。
13.表锁和行锁的区别
行锁:开销大,加锁慢;会产生死锁,发生锁冲突的效率低,并发度高。
表锁:开销小,加锁快;不会产生死锁,发生锁冲突的效率高,并发度低。
14.byte 1字节 8位 shot 2字节 16位 int 4字节 32位 long 8字节 64位
float 4字节32位 double 8字节 64位 char 2字节 16位 boolean 1位
15 mysql事务隔离级别有哪些
①读取未提交数据:允许事务读取其它事务未提交的数据,会产生脏读、不可重复读、幻读的问题。
②读取已提交数据:只允许事务读取其它事务已经提交的数据,可以避免脏读问题,但不可重复读和幻读的问题还是会出现。
④可重复读:确保事务可以多次从一个字段中读取相同的数据,在这个事务的持续时间内,不允许其它事务对这个字段进行更新,可以避免脏读和不可重复读问题,但幻读的问题仍会出现。
⑤串行化:确保事务可以从一个表中读取相同的行,在这个事务持续的时间内, 不允许其它事务对这个表进行插入、更新和删除操作。所有的问题都可以避免,但性能降低。
16 常用的集合
java中集合分为value,key-value两种。
存储值又分为List和set
List是有序的,可以重复;Set是无需的,不可以重复。
17 Java中new定义的数组,长度不可以修改;因为数组如不指定长度,就不能创建数组实例,编译器会报错。因为数组在内存中是地址相邻的一片内存。
18 ArrayList和LinkedList的区别
ArrayList底层使用数组,LinkedList底层使用链表
数组查询具有所有查询特定元素比较快,而插入和删除比较慢,因为数组在内存中是一块连续的内存,插入和删除操作需要移动内存。
链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找,所以查询效率低。插入和删除不需要移动内存,只需要改变引用指向即可,所以插入或删除效率高。
19 堆栈和队列的区别
堆(heap)一种树结构 后进先出 由程序员分配释放,若忘记释放则程序结束的时候由操作系统释放。
栈 (stack)先进后出 内存由编译器自动分配释放
队列(queue) 先进先出
20 ==和equal的区别
等号比较的是两个对象的引用是否相等
equal比较的是两个对象的内容是否相等
21 List和Map的概念
List(列表)又分为ArrayList和LinkedList
Map(映射)
22 多线程的实现
继承Thread类创建线程 重写run方法
实现Runnable接口创建线程
使用Callable和Future创建线程 重写Call方法
23 常用的设计模型有哪些
单例模式(饱汉、饿汉、双重、静态内部类)
1.构造方法私有化,让出自己类中能创建外其他不能创建的地方
2.在自己的类中创建一个单实例
3.提供一个方法获取该实例对象
工厂模式
Spring IOC 就是使用了工程模式 对象的创建交给工厂创建
代理模式
Spring AOP 就是使用动态代理

    推荐阅读