2019年Java面试必考题
- java中的基本数据类型有哪些?
byte,short,char,int,long,double,float,boolean
- 说说什么是值传递,引用传递,java语言是那种传递方式?
值传递和引用传递都是方法的参数的传递方式,当把参数传递给方法时发生的情况;
值传递:并不是把变量本身传递给方法,而是将变量的值复制一份,将复制出来的值传递给方法,所以在方法体内部,操作的并不是变量本身;也就是说在方法体内部无论如何修改这个值,都不会改变原变量;
引用传递:引用,即保存对象地址的一个变量;引用传递即将该变量(保存对象的地址的那个东西)传递给方法,在方法体内部就可以通过这个地址找到对象,从而对堆中的对象进行操作;也就是说可以通过引用传递来访问对象的方法,操作对象的属性等等;
Java中只有值传递,没有引用传递;就算方法的参数是引用数据类型,java传递给方法的也是引用的副本,而不是引用本身;所以在java中,只能通过引用访问对象的方法和修改对象的属性,而不能在方法体内对引用重新实例化,否则,方法体内和方法体外操作的将是两个不同的对象;
- Java中是如何存储引用数据类型的对象的?
User user1 = new User();
- 执行User user1:在栈空间开辟一块内存,保存User类型的引用,该内存空间为user1,此时该空间内没有保存任何数据;
- 执行new User():在堆空间开辟内存,实例化对象:给对象的属性分配空间,给对象的方法分配空间等等;
- 执行 “=”赋值操作:即将堆中的对象的地址保存到栈空间的引用中;
- equals() 和 “==” 的区别与联系。
(1)equals() 是Object的方法,java中所有的类都是Object的子类,也就是说,所有的引用数据类型都有这个方法;而基本数据类型没有equals()方法,equals()只能用于引用数据类型对象之间的比较;
(2)equals()方法默认比较的就是两个对象的内存地址,即判断两个对象是否是同一个对象,跟”==”的作用是一样的;
(3)String 类重写了equals()方法,String的equals()方法比较的是两个字符串的内容;
- Hashcode() 方法和 equals() 方法的作用是什么?
- 这两个方法都是Object的方法,Hashcode()方法是计算对象的哈希码值,默认情况下,对象的哈希码值是使用哈希算法对对象的内存地址进行计算而得到的一个16进制的数字;用来区分不同的对象;注意不同对象的哈希码值是有可能相同的;而equals()是比较两个对象的内存地址而不是对象地址的哈希码值;
- 在开发中,有的时候会重写实体类的Hashcode()方法和equals()方法;
- 重写equals()方法是修改比较两个对象是否为同一个对象的标准;
例如:在实际应用中,若有两个User类型的对象,保存的数据完全一致,那么就认为这两个对象是同一个对象,而默认的equals方法比较的是对象的原始地址,并不能做到这点,所以需要在User类中重写equals方法,修改判断的标准为比较对象中保存的数据;
如下方代码所示:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (birthday == null) {
if (other.birthday != null)
return false;
} else if (!birthday.equals(other.birthday))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (gender == null) {
if (other.gender != null)
return false;
} else if (!gender.equals(other.gender))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
- Hashcode()方法:
涉及到一部分使用哈希算法的集合,尤其是HashSet集合和HashMap集合,它们是使用对象的哈希码值做为判断标准的一部分的,如果对象的哈希码值不同,它们依然会认为这些是不同的对象,所以重写时,必须同时重写Hashcode和equals两个方法;
- 子类能够继承父类的那些成员,不能继承父类的那些成员?
- 能够继承的:
所有的public、protected 修饰的成员;
如果子类和父类在同一个包中,也可以继承父类中缺省访问权限的成员
- 不能继承的:
所有的private修饰的成员
如果子类和父类不在同一个包下,父类中的缺省访问权限的成员也不能被继承、
构造方法不能被继承
- 如何实现多态?
- 存在继承或实现关系
- 子类要重写父类中的方法,或者实现类实现接口
- 定义方法的时候,形参使用父类或接口类型,
- 调用方法的时候,根据需要将子类对象或实现类对象作为实参传递给方法
在面向对象设计原则中,有一个叫做理氏替换原则:凡是父类出现的地方都可以用子类来替换;
好处:提高程序的扩展性和维护性,当需要对原系统的功能进行扩展或维护时,只需要创建新的子类或实现类即可实现,而不需要修改原来的代码和结构,这正好符合面向对象设计的另一个原则:开闭原则(对扩展开放,对修改关闭)
- ArrayList和LinkedList的区别与联系?
- 联系:都是有序列表,都是List接口的实现类,都实现了可扩容容量的集合;
- 区别:
-
- ArrayList内部是一个数组结构,内部元素的内存地址都是连续的,只要找到了其中一个元素,就能确定其他所有元素的位置,所有遍历的查询的效率更高;但是插入和删除时,需要将后边的元素进行相应的移动,所以插入和删除的效率较低;
- LindedList内部是一个链表结构,每个元素节点都保存了上一个元素和下一个元素的引用,所以它不能像ArrayList一样,通过一个元素确定所有其他元素的位置,所以遍历和查询的效率没有ArrayList高,但是,当进行删除或插入操作时,只需要修改节点对上下元素的引用即可,所以插入和删除的效率比ArrayList高;
-
- List、Map、Set都有什么特点?
- List和Set都是Collection的子接口
- List是有序不唯一列表,Set是无序唯一容器
- Map使用键值对保存数据,key唯一,value不唯一,且key和value都可以为null
- Java中Set的内部就是封装了一个对应的Map,Set内部就是通过Map的key来实现的;
- Java中Set如何实现的唯一性(Map如何实现key的唯一性)?
- HashSet:先判断两个对象的哈希码值,如果哈希码值相同,在用 “==”或equals判断;
- TreeSet 要提供一个比较器,根据自定义的比较器来判断两个对象是否相同
- 抽象类和接口有什么区别?
- 区别:
- 一个是类,一个是接口
- 抽象类有构造方法,接口没有
- 抽象类中的方法可以有方法体的实现,而接口中的方法没有
- 抽象类可以定义自己的成员变量,但是接口中定义的变量默认都是public static final的
- 抽象类中可以定义任意访问权限的成员,而接口中默认都public成员,而不能定义其他访问权限的成员
- 抽象类与类之间是继承关系且为单继承,与接口之间是实现关系,一个抽象类可以同时实现多个接口
- 区别:
接口与接口之间是继承关系,但这里的继承是多继承关系;
-
- 联系:
- 都可以写抽象方法
- 都不能被直接实例化
- 联系:
- 静态变量、成员变量、构造方法优先级?
静态变量 > 成员变量 > 构造方法
- JDBC常用的API(Application Programing Interface)有哪些?
DriverManager:管理驱动
Connection:连接数据库
Statement/PreparedStatement:执行Sql语句并返回结果
ResultSet:接收结果集
ResultSetMateData:结果集的元数据对象,
元数据:就是描述性的数据,ResultSetMateData保存的是ResultSet的相关信息,例如,结果集中有多少个列,每一个列的列名是什么,列的类型等等
StatementMateData:适配器的元数据对象,StatementMateData里封装的就是适配器的描述信息,例如SQL语句中有几个占位符等都可以获取的到;
- JDBC连接数据库的步骤
- 加载驱动
- 连接数据库
- 实例化适配器(Statement或PreparedStatement)
- 发送sql语句
- 接收结果
- 处理结果集
- 释放资源关闭连接
- Statement 和PreparedStatement 的区别与联系?
- 联系:Statement是PreparedStatement的上级接口,Statement能做的事情,PreparedStatement都能做
- 区别:PreparedStatement是预编译,而Statement不是;
-
- PreparedStatement可以提高数据库的综合效率,如果仅仅只是较少次数的执行,Statement快
- Statement是拼接的sql语句,容易发生sql注入的危险,
-
而PreparedStatement可以使用sql占位符,能够有效的防止sql注入,提高程序安全性;
- 遇到过的异常和解决方案?
NullPointerException,PraseException,NumberFormatException,ClassCastException,ClassNotFoundException
IndexOutOfBoundsException,ArrayIndexOutOfBoundsException,PropertyNotFoundException,
NoSuchMethodException,NoSuchFieldException,
SQLException:操作数据库,驱动类错了,没有添加jar驱动,url写错了,用户名密码错了,sql错了,占位符和值类型不匹配,占位符和值的数量不匹配,从结果集中拿数据时出错(列名写错了,数据类型不对),或者是结果达到最后了等等;
IOException:文件找不到,文件类型不对,文件的访问权限不够等等,IO类型不对应;
IllegalStateException:非法状态异常:框架初始化的时候,页面重定向或转发的时候,视具体异常信息判断
IllegalAccessException:非法访问异常,没有响应的访问权限;例如使用反射访问了私有的成员,就会抛出这个异常;
- 反射能否访问类中的私有成员?若不能,为什么?若能,如何访问?
- 能否通过反射访问父类中的成员,若可以,能够访问父类中的那些成员?如何访问?
- Java中的内部类有几种?分别是什么?有什么特点?
- 你接触过那些面向对象设计原则?并谈谈你对他们的理解。
- Java中有几种方式实现线程同步?各自的特点?
- 描述一个线程的生命周期
- 字节流和字符流之间能否进行转换?如何转换?
- UDP和TCP之间的区别?
- 什么是内存溢出,内存泄漏,如何避免?
- 说说什么是重载,重写,覆盖,隐藏
- 实现单例有几种方式?
- String、StringBuffer和StringBuilder之间的区别?
JavaEE部分:
- Servlet和普通javaBean的区别与联系
- Servlet的生命周期
- 自定义一个MVC框架
- Servlet和Filter之间的区别
- Jsp的内置对象有哪些及作用
- EL表达式的内置对象有哪些及作用?
- EL如何访问数组或集合中的元素
- EL能不能调用JavaBean中的方法
- 转发请求和重定向有什么区别(原理级别的)?
- Servlet是否为线程安全的?
数据库部分:
- 常用的索引有哪些?索引有什么优缺点?
主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有
多个主键索引。
普通索引:使用字段关键字建立的索引,主要是提高查询速度
唯一索引:字段数据是唯一的,数据内容里面能否为 null,在一张表里面,是可
以添加多个唯一索引。
全文索引:在比较老的版本中使用。
- 连表查询有几种方式及各自的特点
链接查询主要分为三种:内链接、外链接、交叉连接。
- 内连接:关键字: inner join
- 外连接:关键字:左外链接:left[outer] join 右外连接:right[outer] join 全外连接:full[outer]join
- 交叉链接/笛卡尔积:关键字:cross join
- 数据库事务有哪些特征?
a、原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
b、 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
c、隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
d、持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
- 数据库事务的隔离级别有哪些?
四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
- 什么是视图,如何创建视图,视图有什么好处?
视图:存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色.
好处:如果要这些SQL语句存储为视图,那么查询的时候,就直接查询这个视图就可以了。
- 什么是存储过程,什么是函数,两者有什么区别?
如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数
- 关系型数据库如何实现多对多的关系?
- 什么是游标?有什么作用?
游标:从表中检索出结果集,从中每次指向一条记录进行交互的机制。
关系数据库中的操作是在完整的行集合上执行的。
作用:用来查询多条记录时需要用的。
- Order by 和 Group by 有什么区别?
- order by是排序
- group by是分组
- 在使用Group by 时需要注意什么问题?
1。不能使用别名
2。除了函数字段,SELECT出现的所有字段都必须在GROUP BY中出现
3。别名不要使用保留字
- Oracle如何分页?
Rownum rowid
- Oracle 中 rowId 和rownum有什么区别
rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录.
- Oracle是如何存储数据的?
是由对象数据类型,类型方法,操作子,函数与过程组合而成