前言
今早看到首页蹦出来的一篇标题是一篇文章,内容还没仔细看,这个表我吓了一大跳。回想当年拿着4000块实习的苦日子,现在的大学毕业生实在幸福了。BAT爸爸们不是一般的土豪啊。但要进BAT也不是那么容易的,少不了过五关斩六将的各种面试。
想起大学时当家教的经历,突然又教一下学生,过过当老师的瘾了。于是找了一份BAT等大公司的面试题汇总,逐一加上答案和参考资料,跟同学们分享交流。希望各位应届的同学看了都能当上大厂的码农,不用当小厂的码畜。
ps:
- 面试题的量很大,我会分批持续更新,做成一个系列
- 每题下面除了答案之外,我还会附上参考资料,想更深入了解与答案相关的知识,可以查阅这些资料
- 答案加上了我自身的理解,如有错漏或者看不懂的地方,可以通过qq跟我交流,我的企鹅号是244095135
- 如果要转载的请先与我联系并注明出处,尊重别人的劳动成果是一个人的基本素质
JAVA面试题(1)
1.java中==和equals和hashCode的区别
== | 对两个变量进行值的比较 |
equals | 对两个变量进行内存地址的比较 |
hashcode | 获取变量在集合中所存储的区域 |
参考资料
https://blog.csdn.net/tiantiandjava/article/details/46988461
http://wiki.jikexueyuan.com/project/java-enhancement/java-twentysix.html
2.int、char、long各占多少字节数
类型 | 存储需求 | bit 数 | 取值范围 | 备注 |
---|---|---|---|---|
int | 4字节 | 4*8 | -2147483648~2147483647 | 即 (-2)的31次方 ~ (2的31次方) - 1 |
short | 2字节 | 2*8 | -32768~32767 | 即 (-2)的15次方 ~ (2的15次方) - 1 |
long | 8字节 | 8*8 | 即 (-2)的63次方 ~ (2的63次方) - 1 | |
byte | 1字节 | 1*8 | -128~127 | 即 (-2)的7次方 ~ (2的7次方) - 1 |
float | 4字节 | 4*8 | float 类型的数值有一个后缀 F(例如:3.14F) | |
double | 8字节 | 8*8 | 没有后缀 F 的浮点数值(例如:3.14)默认为 double | |
boolean | 1字节 | 1*8 | true、false | |
char | 2字节 | 2*8 | Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。(因为java使用的是unicode编码) |
参考资料
https://www.jianshu.com/p/fd560bc39adb
3.int与integer的区别
- Integer是int的包装类;int是基本数据类型;
- Integer变量必须实例化后才能使用;int变量不需要;
- Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
- Integer的默认值是null;int的默认值是0。
参考资料
https://blog.csdn.net/chenliguan/article/details/53888018
4.谈谈你对java多态的理解
- 多态的定义:相同类项的变量执行同一个方法时,呈现出不同的行为特征这就是多态。
- 多态的实现方法:
- 子类继承父类
- 子类重写父类的方法
- 父类引用指向子类对象
- 通过父类引用调用子类重写后的方法,执行具有子类特征的行为
参考资料
https://blog.csdn.net/woshiermingerming/article/details/52324861?utm_source=blogxgwz6
5.String、StringBuffer、StringBuilder区别
String | 字符串常量,实际是一个不可变的对象,每个对其内容进行变更都相当于重新生成这个对象。在字符串需要频繁更改时,很耗性能,不推荐使用 |
StringBuffer | 字符串变量,线程安全。推荐在需要频繁更改字符串的场景中使用,可通过toString()转换成String对象 |
StringBuilder | 字符串变量,非线程安全。性能比StringBuffer高出10%-15%,但由于其线程不安全的特性,多数场景下不推荐使用 |
参考资料
https://blog.csdn.net/kingzone_2008/article/details/9220691
6.什么是内部类?内部类的作用
- 内部类的定义:定义在一个类内部的类
- 内部类的作用:
- 可通过private和protected限制类的访问权限
- 内部类拥有外围类的所有元素的访问权限
- 可实现多重继承
- 可以避免修改接口而实现同一个类中两种同名方法的调用。
参考资料
https://blog.csdn.net/mid120/article/details/53644539
7.抽象类和接口区别
抽象类(abstract class):不能实例化的类,内部可包含抽象方法,可通过extend被其他类继承
接口的定义(interface):抽象方法的集合,可通过implements被其他类实现
区别:
抽象类 | 接口 |
抽象类可包含一般方法,抽象方法 | 接口只包含抽象方法 |
继承抽象类的子类如果是抽象类可以不实现父类的抽象方法,否则必须实现所有的抽象方法 | 实现接口的类需要实现接口中的所有方法 |
抽象类可以有构造器 |
接口不能有构造器 |
抽象方法可以有public、protected和default等修饰符 |
接口方法默认修饰符是public。不可以使用其它修饰符 |
一个子类只能存在一个父类,所以不能继承多于一个抽象类 |
一个类可以实现多个接口 |
抽象类添加新方法时,可以提供默认的实现,不需要改动先有的代码 | 接口添加新方法时,所有实现了该接口的类都要添加对新方法的实现 |
参考资料
https://www.jianshu.com/p/038f0b356e9a
8.抽象类的意义
- 为子类提供一个公共的类型;
- 封装子类中重复内容(成员变量和方法);
- 定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
参考资料:
https://www.jianshu.com/p/4ed470d0cf38
9.接口的意义
- 功能性:一个类可以实现多个接口,接口作为抽象类不能被多继承这一缺陷的补充,完善了java的面向对象能力
- 规范性:在多人协作的项目中,可以由架构师先行编写主要的接口,确定要实现的主要功能,同时也规范了这些功能的方法命名
- 扩展性:用接口来引用实现了该接口的类,如果接口对应的功能需要大面积改动,只需要替换实现它的类就可以了,原理类似C++中父类指针指向子类对象的多态调用
- 安全性:系统提供对外服务时,只提供接口,这样可以防止泄露方法实现细节
参考资料
https://blog.csdn.net/Caide3/article/details/68490883
10.抽象类与接口的应用场景
- 需要一些有默认实现的方法时,用抽象类
- 基础功能会平凡增删的情况,用抽象类
- Java不支持多继承,可以用实现多个接口的形式来解决
- 没有特殊需要时,推荐使用接口,保留扩展性
参考资料