java面试题总结(1)

面试题总结

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数据库的 左右内外连接

引用某个博客的内容

https://blog.csdn.net/weixin_39220472/article/details/81193617?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161102633416780255282641%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161102633416780255282641&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-81193617.first_rank_v2_pc_rank_v29&utm_term=%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%B7%A6%E8%BF%9E%E6%8E%A5,%E5%8F%B3%E8%BF%9E%E6%8E%A5,%E5%86%85%E8%BF%9E%E6%8E%A5,%E5%A4%96%E8%BF%9E%E6%8E%A5

       left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

  right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

  inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。

  full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。

举个例子:

  1.  A表          

  2.  
  3.   id  name  

  4.  
  5.   1  小王

  6.  
  7.   2  小李

  8.  
  9.   3  小刘

  10.  
  11.   B表

  12.  
  13.   id  A_id  job

  14.  
  15.   1  2    老师

  16.  
  17.   2  4    程序员

内连接:(只有2张表匹配的行才能显示)

 
  1. select a.name,b.job from A a inner join B b on a.id=b.A_id

  2.  
  3.   只能得到一条记录

  4.  
  5.   小李  老师

左连接:(左边的表不加限制)

 
  1. select a.name,b.job from A a left join B b on a.id=b.A_id

  2.  
  3.   三条记录

  4.  
  5.   小王  null

  6.  
  7.   小李  老师

  8.  
  9.   小刘  null

右连接:(右边的表不加限制)

 
  1. select a.name,b.job from A a right join B b on a.id=b.A_id

  2.  
  3.   两条记录

  4.  
  5.   小李  老师

  6.  
  7.   null  程序员

 

全外连接:(左右2张表都不加限制)

 
  1. select a.name,b.job from A a full join B b on a.id=b.A_id

  2.  
  3.   四条数据

  4.  
  5.   小王  null

  6.  
  7.   小李  老师

  8.  
  9.   小刘  null

  10.  
  11.   null  程序员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值