面试官问题
-
JDK、JRE、JVM 区别
- JDK 是工具
- JRE 是环境
- JVM 是虚拟机
-
封装、继承、多态 解释
- 封装:封装是封好一个抽像的类,隐藏内部的实现,对外部提供接口.来方便外界进行调用.
- 继承:继承是可以使用现有类的所有功能,并且在无需编写原来类的情况下对这些功能进行扩展,子类可以继承父类所有的特征和行为
- 多态:不同的对象以自己的方式响应相同的消息的能力
- 多态举例来讲,定义id类型变量a,假如令a等于字符串,那么a就是string类型,假如令a等于8,那么a就是int类型.
-
==和equals的区别是什么?
- 基本类型:比较的是值是否相同
- 引用类型:比较的是引用是否相同
-
线程、进程 的区别是、解释
- 线程:线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位
- 进程:进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程
- 同一进程中的多个线程之间可以并发执行
-
线程的5种状态
- 创建、就绪、运行、阻塞和死亡
- 创建状态:在生成线程对象,并没有调用该对象的start方法
- 就绪状态:当调用了线程对象的start方法之后
- 运行状态:运行run函数当中的代码
- 阻塞状态:线程正在运行的时候,被暂停 【sleep,suspend,wait等方法都可以导致线程阻塞】
- 死亡状态:如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪
- 创建、就绪、运行、阻塞和死亡
-
- List、Set、Map
- List 有序列表,允许存放重复的元素
- 实现类
- ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
- LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
- Vector:数组实现,重量级 (线程安全、使用少)
- 实现类
- Set 无序集合,不允许存放重复的元素;允许使用null元素
- 对 add()、equals() 和 hashCode() 方法添加了限制
- HashSet和TreeSet是Set的实现
- Map 它提供了一组键值的映射
- 其中存储的每个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。
- 关键字应该是唯一的,每个key 只能映射一个value
- 实现类
- HashMap、TreeMap、LinkedHashMap、Hashtable 等
- HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值;
- Hashtable:线程安全的,不允许null的键或值;
- Properties:key和value都是String类型,用来读配置文件;
- TreeMap:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;
- LinkedHashMap: 此实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的
- HashMap、TreeMap、LinkedHashMap、Hashtable 等
- 实现类
- List 有序列表,允许存放重复的元素
- List、Set、Map
-
HashMap、HashTable 的区别
- Hashtable的
key
和value
必须是非null
的,而HashMap的key
和value
都允许为null
; - Hashtable是线程安全的,而HashMap是非线程安全的;
- hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
- Hashtable的
-
ArrayList、LinkedList 的区别
- 他们在单线程环境下是安全的、多线程环境下不安全
- ArrrayList底层的数据结构是数组,支持随机访问
- LinkedList 的底层数据结构是双向循环链表,不支持随机访问【用下标访问一个元素】
- ArrayList 的时间复杂度是 O(1)
- LinkedList 的时间复杂度是 O(n)
-
MySql 索引、查询前100条记录的关键字、去重、左连接、右连接、内连接、全连接 笛卡尔积
- 索引:索引是为了改善查询性能的
- MySQL 官方对索引的定义为:索引(Index)
- 从本质上来讲,索引是一种以空间换时间的技术。因为索引的建立是需要占用磁盘物理空间的
- 去重:distinct
- 左连接:left join on
- 右连接:right join on
- 内连接:inner join on
- 全连接:union / union all
-
java注入方法有 java注入方法参考文档
- 接口注入(不推荐)
- set注入(比较常用)
- 构造器注入(死的应用)
-
spring注入方式有 依赖注入的三种方式
- 注解注入
- bean注入
-
final关键字修饰类、与修饰变量的区别 final关键字修饰类,方法以及变量参考文档
- 修饰类,类不能被继承
- 修饰变量,变量就变成了常量,只能被赋值一次
- 常量命名规范,如果是一个单词,所有字母大写,如果是多个单词,每个单词都大写,中间用下划线隔开
- final修饰变量叫做常量,一般会与public static共用
- 修饰方法,方法不能被重写
-
Mybatis映射文件Mapper.xml中的 #{}、${} 的区别 Mybatis映射文件Mapper.xml中#和$的区别
-
#{}
:"#"在编译时使用"?"占位符标记,可以有效防止参数注入,相当于我们使用JDBC操作时的PreparedStatement -
${}
:“$”意思是直接把参数拼接到SQL中执行相当于JDBC操作时的Statement
-
-
Spring项目中的pom.xml文件与SSH项目中的pom.xml文件 的区别
- 在spring项目中pom.xml文件中 如果需要改版本,只需要更改
标签中的版本号即可 下边的坐标不用写版本版本号,则ssh中不能这样用
- 在spring项目中pom.xml文件中 如果需要改版本,只需要更改
-
try catch 后 return finally 会执行吗?
- 会执行 try-catch里面加了return后,finally还会执行吗? 参考文档
- 无论是否会产生catch,都会执行finally中的语句。
- 如果产生catch,且catch中含有return,虽然会执行finally的语句,但返回的值依旧是catch的值,除非finally也有return。
- 如果产生catch,且catch中不含有return,return在函数的最后面,那返回的值将是finally中的值。
- finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值,而是finally的值。
- 如果return在try中,虽然会进入finally,但是因为finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的
- 会执行 try-catch里面加了return后,finally还会执行吗? 参考文档
-
java中有那些异常 java中都有哪些异常参考文档 | Java 常见异常种类
- 算术异常类:ArithmeticExecption
- 空指针异常类:NullPointerException
- 类型强制转换异常:ClassCastException
- 数组负下标异常:NegativeArrayException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 违背安全原则异常:SecturityException
- 文件已结束异常:EOFException
- ……
-
什么是事务 数据库中,什么是事务参考文档
- 一荣具荣、一损具损
- 要么成功、要么失败
-
事务的四大特性
- 原子性(Atomicity)
- 事务中的操作要么都不做,要么就全做。
- 一致性(Consistency)
- 事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性(Isolation)
- 一个事务的执行不能被其他事务干扰
- 持久性(Durability)
- 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
- 原子性(Atomicity)
-
IOC、AOP 解释 Spring中的IOC和AOP概念参考文档 | Spring中的IOC和AOP概念参考文档
- IOC:控制反转
- 将控制器反转给用户
- 写了方法,让用户个人控制 【控制器是由用户来调用】
- IOC就是典型的工厂模式,通过sessionfactory去注入实例
- AOP:面向切面编程
- 横切事务
- AOP的好处就是你只需要干你的正事,其它事情别人帮你干
- AOP最大的用途就在于提供了事务管理的能力
- AOP就是典型的代理模式的体现
- IOC:控制反转
-
依赖注入 解释 依赖注入和控制反转参考文档
-
首先 什么叫依赖? 一个对象依赖与其他对象 比如var d=new Date();就是d依赖于Date对象创建
-
第二 依不依赖比较好?no 为了实现程序的低耦合,尽量减少各组件之间的相互依赖和制约比较好,比如一个构造函数,别人已经创建好了,我不用再创建就可以直接调用。
-
第三 什么叫注入?意思我现在用的对象是别人给的,是被动创建的。比如
angular.module('M1',['ng','ngRoute']) .controller('C1',function($scope,$http){ $scope.data = 999; $http.get().success(); }) 这段代码运行时:只需要传入所需要的模块的名称,底层自动创建相关的对象,直接使用
-
-
单例模式、多例模式 单例模式和多例模式参考文档 | 单例模式和多例模式参考文档
- singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
- prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
- Spring bean 默认是单例模式。
- 单例模式的关键有两点:
- 构造方法为私有,这样外界就不能随意调用。
- get的方法为静态,由类直接调用
- 多例模式(Multiton)
- 多例类可以有多个实例
- 多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例。
-
Cookie和Session 解释 cookie和session参考文档 | cookie和session的区别参考文档
- Cookies :是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。
- Session:Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。
- Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑*到安全应当使用session
- session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
- 单个cookie保存的数*据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
- 建议将登录信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
- session保存在服务器,客户端不知道其中的信心;cookie保存在客户端,服务器能够知道其中的信息
- session中保存的是对象,cookie中保存的是字符串
- session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的
-
今天的面试问题到此结束