Java面试题汇总

有可能不全是Java的知识,只是时间一长感觉这些知识会忘了,就把我遇到的和我了解的先列列看吧。其中会出现许多来自百度、知乎、CSDN等处的内容,就不一一列出来了。

Java

面向对象

private、protected、public、default的区别

private 的访问权限仅限于类的内部,是一种封装的体现,大多数成员变量都是private的,使它不能被任何外部的类访问。

不写时默认为default,即同一包内、类内。

封装、继承、多态、抽象

众所周知的面向对象的特征。

封装:把对象的属性、方法结合成一个独立的整体,这也就是模块化的思想

继承:一个类可以继承(extends) 父类,就变成了他的子类,继承了父类所有的非私有的方法与属性,哪些内容会被继承见上面的图,继承的方法一般可以重写,继承与重载的权限如下图所示

多态:不同的对象对同一消息做出不一样的响应,采取不同的方法。最直观的例子就是一个实体类可以有多个构造方法。

抽象:有相同特性的类抽象出共同的部分,用abstract修饰,抽象类的意义可以用三句话来概括:1.为其它子类提供一个公共的类型 2.封装子类中重复定义的内容 3.定义统一抽象方法,

抽象方法没有方法体。

抽象类与接口的区别

抽象和接口通常被放在一起比较

实现方式:抽象类用extends继承,接口用implements,需要提供接口中所有声明的实现。

是否可以被实例化:抽象类不可以,接口则是完全不同的类型,接口不是类,更不能被实例化

构造器:抽象类中可以有构造器,接口不能

修饰符:抽象方法可以有public、protected、default修饰,接口默认为public,不能被其他修饰符修饰

是否可以多继承:抽象类有传递性质,但只能继承一个父类,却可以同时实现多个接口

构造方法:接口没有构造方法

接口的意义在于规范,扩展,回调

Overload和Override的区别

重写Override,子类覆盖父类的方法,将子类传与父类的引用调用的还是子类的方法。
重载Overloading,一个类多个方法,名称相同,参数个数类型不同,返回值的类型也可不同。
两者都是Java多态性的不同表现。

Final有什么作用

修饰的属性为常量
修饰的方法不可以重写
修饰的类不可以继承

其他

this()和super()的意义

什么是不可变对象

Object有哪些公共方法?(equals(),clone(),getClass(),notify(),notifyAll(),wait(),toString())

Java基础

ArrayList和Vector的区别

ArrayList:线程不安全,速度快
Vector:线程安全,速度慢(synchoronized)
两者都实现了List接口,都是有序的集合,允许重复和null

LikedList: 以单链表的方式存储,增、删快,查、改慢

HashMap和Hashtable的区别

HashMap与Hashtable都实现的Map接口,HashTable线程安全,HashMap线程不安全。

Collection 和 Collections的区别

Collection是集合的根接口,其下有set(无序)及list(有序)
Collections是集合的算法。

Map不继承于Collection,是无序的键值对的集合,不允许重复

Enumeration和Iterator接口的区别

Enumeration比Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

Iterator能够删除元素,Enumeration不能。

ArrayList集合加入1万条数据,应该怎么提高效率

ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。因此,现在明确了10万条数据了,我们可以直接在初始化的时候就设置ArrayList的容量!

HashMap的key值要是为类对象则该类需要满足什么条件?

转载自这里

需同时重写该类的hashCode()方法和它的equals()方法。

一般来说,我们会认为:只要两个对象的成员变量的值是相等的,那么我们就认为这两个对象是相等的!因为,Object底层比较的是两个对象的地址,而对我们开发来说这样的意义并不大~这也就为什么我们要重写equals()方法

重写了equals()方法,就要重写hashCode()的方法。因为equals()认定了这两个对象相同,而同一个对象调用hashCode()方法时,是应该返回相同的值的

== 与equals

==:主要用于基本数据类型(byte、int、char、long、float、double、boolean和short)及引用
equals():用于对象及引用,(String一般用equals)

DB

事务

事务的概念

事务是是并发控制单位,要么全部做要么劝都不做。如果你自己不去控制事务,数据库默认一条sql语句就处在自己单独的事务当中。以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

事务的特性

(呃啊这需要理解到位,第一次面试遇到过的题目)
原子性、一致性、隔离性、持久性
链接:什么是事务,事务的四个特性是什么
⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

  以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

1,脏读

  脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

  当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’;

  当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2,不可重复读

  不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

  例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

3,虚读(幻读)

  幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

  幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。