面试题总结
1 重写(方法覆盖,Override)和重载(Overloade)
重写:方法名,参数列表,返回类型需要完全一致。访问修饰符(public,protected,默认,private)变大或者不变.抛出的异常变小或者不变
重载:方法名相同,必须有不同的参数列表, 返回类型,访问修饰符,抛出的异常可以不同
2Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序?
记住一句话,静态先与动态,非构造方法先于构造方法,其余看代码顺序
那么一般就是,父类静态方法/静态属性/静态代码块 > 子类静态方法/静态属性/静态代码块 > 父类非构造方法/父类属性/父类代码块 >父类构造方法 >子类非构造方法/子类属性/子类代码块>子类构造方法;
3接口和抽象类的区别
本质上:接口和抽象类的概念不同,接口是对动作的抽象,抽象类是对事物本质的抽象 ,例如阿猫,阿狗可以继承"动物"这个抽象类,可以实现"吃东西","繁衍"等多个接口.接口是"has - a ",抽象类是"is -a "
另外:
1.接口中声明的变量默认都是且只能是final的,抽象类可以包含非final的
2.接口中只有抽象方法,而抽象类中可以用抽象方法和其他方法
3.接口需要用implements实现,抽象类需要用extends来继承
4.接口中定义的成员变量默认修饰符为public static final(静态不能被修改),而且必须给其赋初值。抽象类中的成员变量默认为default(本包可见),也可以用private,protected,public。如果抽象类中的方法前面有abstract修饰,不能用private、static、synchronize、native修饰,同时方法必须以分号结尾,不带花括号。
5.接口中变量都是final修饰的,而 抽象类中的变量可以不是final
4java中关键字
包括8中基本类型(int,short,byte等),但不包括Integer,Short,String类
5进程与线程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。(并行)
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。(并发)
6线程的几种状态
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞(sleep不会释放锁,而wait会释放锁)。 第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
1. sleep是帮助其他线程获得运行机会的最好方法,但是如果当前线程获取到的有锁,sleep不会让出锁。
2. 线程睡眠到期自动苏醒,并返回到可运行状态(就绪),不是运行状态。
3. 优先线程的调用,现在苏醒之后,并不会里面执行,所以sleep()中指定的时间是线程不会运行的最短时间,sleep方法不能作为精确的时间控制。
3、sleep()是静态方法,只能控制当前正在运行的线程(示例就是这样调用的,因为类对象可以调用类的静态方法)。
7数据库的四种隔离级别
事务的四个特性:acid 原子性,一致性,隔离性,持续性
1.Read Uncommitted(读取未提交内容)--------(产生问题)脏读
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
2.Read Committed(读取提交内容)-------不可重复读 (大部分数据库默认)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
3.Repeatable Read(可重读)---------幻读 (mysql默认)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
4.Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
简单说明一下:数据库是一个同一时间会有多方使用的东西,那么在事务与事务之间就会有一些问题,为此数据库设计了4种隔离级别,首先是最低级别:
read uncommitted——可以读取已经提交事务或者未提交事务的数据。a开始事务,对数据user进行修改,还没提交事务时,b开始事务,直接读到了a所作的修改,这样b读到的数据可能是不对的,因为a没有提交,a随时会rollback。针对这个问题,就有了隔离级别
read committed——只能读已经提交数据的内容,但是这样会有新的问题:一个事务读同一个内容可能读到的结果不同。a开始事务,读数据user,b开始事务,修改user,提交事务,a再读数据user,这样a事务两次读取user数据的内容就是不一样的。然后就有了隔离界别
repeatable read——对于已有数据,读取的数据都是开始事务时刻的数据。这样当然就解决了不可重复读的问题:因为已有数据都是读取开始事务时刻的,但是这样会导致新的问题。a开始事务,查询table_a表所有内容,b开始事务,插入table_a表新的内容,提交事务,a再查询table_a表所有内容,发现前后两次查询不一致(后面一次查询的数据更多)
serializable——通过强制事务排序,肯定没有问题了,但是很耗性能
8并行和并发
- 并行(parallelism),是同一时刻,两个线程都在执行。
- 并发(concurrency),是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。
9数据库(存储)引擎
这就是个很复杂的题目啦!
Support属性中:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎 。
InnoDB是mysql默认的引擎:
1比ISAM和 MyISAM引擎慢很多,但是支持事务,支持外键(与其它引擎的主要差别)
2.支持支持崩溃修复能力和并发控制。
总结:如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的增删改操作,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:(读音类似me_some)
1.MYISAM强调了快速读取操作
总结:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
memory:
所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
10常见的运行时异常
空指针异常 NullPointerException
数组越界异常 IndexOutOfBoundsException
类转换异常 ClassCaseException
向数组中存放与声明类型不兼容对象异常 ArrayStoreException
Io操作异常 BufferOverFlowException
ArithmeticException(算术异常)
IllegalArgumentException (非法参数异常)
11数据库的 左右内外连接
引用某个博客的内容
left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。
full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。
举个例子:
-
A表
-
id name
-
1 小王
-
2 小李
-
3 小刘
-
B表
-
id A_id job
-
1 2 老师
-
2 4 程序员
内连接:(只有2张表匹配的行才能显示)
-
select a.name,b.job from A a inner join B b on a.id=b.A_id
-
只能得到一条记录
-
小李 老师
左连接:(左边的表不加限制)
-
select a.name,b.job from A a left join B b on a.id=b.A_id
-
三条记录
-
小王 null
-
小李 老师
-
小刘 null
右连接:(右边的表不加限制)
-
select a.name,b.job from A a right join B b on a.id=b.A_id
-
两条记录
-
小李 老师
-
null 程序员
全外连接:(左右2张表都不加限制)
-
select a.name,b.job from A a full join B b on a.id=b.A_id
-
四条数据
-
小王 null
-
小李 老师
-
小刘 null
-
null 程序员