简历是在Boss直聘上投的,可能是没设置消息提醒,公司给我约面试时间,我过了好几天才回复…发现后立马回复HR,HR小姐姐人很好看到消息后,就给我约了今天下午的远程面试嘻嘻嘻~
还在上大二的我,这次难得的机会被我把握住了。准时的开始了面试:
- 自我介绍
- 自我介绍中提到了自己做的一个项目,展开聊了大概20分钟…
(大概问了项目的某一个功能模块具体很多问题后,开始问Java基础) - 在你项目中哪些业务使用了这个Redis?(因为项目中提到了Redis,因此开始了Redis轰炸)
- Redis支持哪几种基本数据类型?
字符串、散列、列表、集合、有序集合
- Redis 和 Memcached 的区别?(答上来了三点)
- 存储方式:Memchched数据是全部放在内存之中,关机断电就会挂掉,数据不能超过内存大小。而Redis部分数据是存放在硬盘上的,这样能保证数据的持久性
- 数据类型支持:Memcached对数据类型的支持很简单,只支持简单的key-value。而Redis支持五种数据类型
- 底层模型不同:他们之间底层实现以及与客户端之间通信的应用协议不一样
- Value的大小:Redis可以达到1GB,而Memcached只有…1MB
- 请说明String是最基本的数据类型吗?(第一次面试也问了)
不是
String是引用数据类型 底层是通过字符数组实现. 简单来说就是 String 类利用了 final 修饰的 char 类型数组存储字符
- 那么Java有哪些基本数据类型?(第一次面试也问了)
byte、short、long、int、char、float、double、boolean
- 基本数据类型int占几个字节?char占几个字节?
Java基本类型占用的字节数:
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits)
- em…我们来谈谈集合吧。ArrayList和LinkedList有什么区别?
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移 动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动 数据。
- 我们知道List是一个接口,那么它有哪些实现类呢?(感觉被为难了,只答了前两种…)
- ArrayList(采用的是数组的方式实现,读取速度快,扩容速度慢,线程不安全)
- LinkedList(双向链表,读效率低,写效率高,操作效率高等特性,适合用于频繁add,remove等操作的List,线程不安全)
- Vector(Vector是一种线程安全的List结构,它的读写效率不如ArrayList,其原因是在该实现类内在方法上加上了同步关键字)
- Stack(继承于Vector,基本特性与Vector一致,线程安全,但效率低,实际就是利用Vector抽象成栈,使之拥有后进先出的特性)
- 接口和抽象类的区别是什么?
- 一个类可以实现多个接口,但一个类只能继承一个抽象类。
- 接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,方法可在抽象类中实现。
- 接口中的变量必须用 public static final 修饰,并且需要给出初始值。所以实现类不能重新定义,也不能改变其值。
…
- 重载和重写的区别?
重载:重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.
重载的特征:
- 方法名必须相同
- 方法的参数列表一定不一样
- 访问修饰符和返回值类型可以相同也可以不同
重写:一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同.
重写的特征:
- 方法名必须相同,返回值类型必须相同
- 参数列表必须相同
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- ==与 equals有什么区别?
- ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
- ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
- ==指引用是否相同, equals()指的是值是否相同
- StringBuffer和StringBuilder 的区别是什么?(没答上来)
就说了这一句…StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类
- StringBuffer 与 StringBuilder 中的方法和功能完全是等价的
- 只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的。
而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。- 在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全。而StringBuffer则每次都需要判断锁,效率相对更低
- Java关键字常用的四种修饰符有哪些?说说它们的作用域?
我答了三种public、private、protected…default这个没怎么有接触过的印象(心里一万个草泥马,这是什么鬼…)
作用域:
- public: 具有最大访问权限。只要在同一项目下,都可以
- protected: 不同包下的类是不能使用的
- private:访问权限类本身
- default:它是针对本包设计的,它所修饰的在本包下的其他类都访问
(怎么还有…这也太多了吧。心态炸了,快顶不住了…)
- 请说明一下Java中都有哪些方式可以启动一个线程?(第一次面试也问了)
- 继承Thread()类,重写run()方法
- 实现Runnable方法,重写run()方法
- 实现Callable方法,重写call()方法
- 线程池
- 启动线程调用什么方法?
(心里想了一下才说,怎么这么简单呢?)
.start()
(我其实准备了很多关于多线程方面的问题…然后就问了这么简单的俩,估计留在了二面吧)
- 能接受加班嘛?
em…当然,我说的两点前都可以…凌晨(他笑了)
好了,今天的面试就到这里,可能会安排二面,等通知吧
(时间差不多刚好一个小时)