天天看点

JAVA面试中常见的面试题(三)——异常、对象拷贝和MYSQL数据库

异常

1、throw和throws的区别?

1)throws出现在方法函数头;而throw出现在函数体。

2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。

3)throws是将异常声明但是不处理,调用方法必须捕获该异常或者异常往上传,谁调用我就交给谁处理如果最上层调用不处理就抛给JVM处理,而throw抛出的异常后,调用者可以不去捕获和处理该异常,throws一般处理可检测异常,throw一般处理运行时异常。

2、final、finally和finalize的区别?

1)final可以用来修饰类,方法和变量(成员变量或局部变量),标识修饰类不被继承,方法不被重写,变量表示常量,只能被赋值一次,赋值后其值不再改变。

(误解:String被设计成final类可以被改变如String a="A"; a="B",而是当a=“B”执行时,并不是原本String对象("A")发生改变,而是创建一个新的对象("B"),令a引用它)

2)finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

3)finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。

3、try-cacth-finally中的那个部分可以省略?

catch和finally其中可有任意一个可以省略,但try是不能省略的。

当catch检查型异常时不可省略。

4、try-catch-finally中如果catch中return了finally中的代码会执行吗?

finally的代码依然会执行,所以无论异常是否发生都会执行finally代码块。

5、常见的异常类型有哪些?

Exception 有三大类分别是ERROR、RuntimeException和No_RuntimeException。

  • 第一类ERROR

是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。如JVM内存泄漏 OutOfMemoryError和方法栈超过JVM允许的栈的深度StackOverflowError等都是集成的ava虚拟机运行错误(VirtualMachineError)。

常见的系统ERROR:

VirtualMachineError 虚拟机错误

OutOfMemoryError JVM内存泄漏

StackOverflowError 放发栈越界

NoClassDefFoundError 类定义错误

InstantiationError 实例化错误

InternalError 虚拟机内部错误

UnknownError 未知错误

  • 第二类是RuntimeException是运行时异常

就是在程序运行过程中有可能都发生的异常。

运行时异常:

ArithmeticException 算术异常

NullPointerException 空指针异常

ArrayIndexOutOfBoundsException  数组下标越界异常

SecturityException 违背安全原则异常

NumberFormatException 字符串转换为数字异常

ClassCastException 类造型异常

UnsupportedOperationException 不支持的方法异常

  • 第三类为非运行时异常

又称为可检查类异常,编译器利用分析方法或构造方法中可能产生的结果来检测Java程序中是否含有检测异常的处理程序,对于每个可能的可检测异常,方法或构造方法的throws子句必须列出该异常对应的类。

可检查异常:

IOException 输入输出异常

SQLException 操作数据库异常

FileNotFoundException 文件未找到异常

EOFException 文件已结束异常

ClassNotFoundException 找不到类异常

NoSuchFieldException 属性不存在异常

InterruptedException 被中止异常

InstantiationException 实例化异常

对象克隆

1、为什么要使用对象克隆?

从一个对象实例复制一个对象时,需要让原对象实现JAVA的cloneable接口,重写Clone方法,clone方法是在复制一个对象,赋值的对象是单独独立的,有独自的内存空间,而不是newObj=oldObj,因为如果用对象赋值获取的新对象其实时旧对象的引用,他们指向的其实时一块内存,所以对象对数据的操作就不是安全的操作。

2、如何实现对象克隆?

必须要在被克隆类上实现Cloneable接口,并重写clone方法且clone方法的权限修饰符为public。

3、深拷贝和浅拷贝的区别?

浅克隆,在clone对象时,只会把基本数据类型的数据进行复制过去;如果是引用类型,只会把引用复制过去,也就是被克隆对象和原始对象信息,共同引用一个引用类型的属性。

深克隆:在克隆时,会把基本数据类型的数据和引用类型的数据,同时复制。克隆对象和原始对象不共同引用一个引用类型

MYSQL

1、数据库三范式是什么?

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

2、mysql自增主键,mysql重启后对主键id的影响?

如果表引擎为 MyISAM,重启mysql服务,对之间id没有影响。

如果是引擎为InnoDB,id会从现有的数据的最大id开始,因为InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。

3、如何获取当前数据库据版本?

 select version() 获取当前 MySQL 数据库版本。

4、数据库ACID是什么?

Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

5、char和varchar的区别?

char的长度是不可变的,char[10]存入'csdn',则char的长度是10,其中后六位存储的六个空格字符。

varchar是可变长度的,varchar[10]存入'csdn',则varchar的长度变为4。

char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。

6、mysql的内链接、左连接和右连接有什么区别?

内连接关键字inner join:内连接是把匹配的关联数据显示出来。

左连接left join:左连接是左边的表全部显示出来。

右连接right join:右边的表显示出符合条件的数据。

7、mysql怎么验证索引是否满足需求?

使用 explain 查看 SQL 是如何执行查询语句的,查看type和key列查询结果。

type列:显示sql执行的类型,从最好到最差的类型为system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,type至少要达到range级别,最好达到ref级别,低于range级别的sql必须进行优化

key列:显示sql执行过程中实际使用的键或索引,如果为null则表示未使用任何索引,必须进行优化。

Extra列:表示附加信息,详情点击 https://blog.csdn.net/poxiaonie/article/details/77757471

8、说一下事务的隔离级别?

事务的四种隔离级别:读未提交(read-uncommitted)、读已提交(read-committed)、可重复度(repeatable-read)、串行化(serializable)。

脏读:A读取了B更新未提交的数据,当B回滚更新后,A读到的数据就是脏数据。

不可重复度:A多次读取数据不一样,在多次读取过程中读取了B提交修改数据的事务。

幻读:A删除不及格的数据后,查询存在一条不及格数据,A再删除不及格的过程中,B插入了不及格的数据,A产生了幻读。

读未提交会产生脏读、不可重复度和幻读。

读已提交解决了脏读,会产生不可重复度和幻读。

可重复度解决了脏读和不可重复读,会产生幻读。

串行化解决了脏读、不可重复度和幻读。

9、说一下事务的传播属性?

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED--新起一个事务并关联父事务。

10、说一下mysql数据库常用的引擎?

InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

11、说一下mysql的行锁和表锁?

表锁:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行锁:偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

12、说一下悲观锁和乐观锁?

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

13、怎么做mysql的性能优化?

从几个方面:

1)存储引擎优

2)优化表索引

3)EXPLAIN命令优化查询(优化SQL)

4)垂直分割分表

作者相关文章:

JAVA面试中常见的面试题(一)JAVA基础&&集合容器

JAVA面试中常见的面试题(二)多线程&&反射

继续阅读