经典算法面试题及答案(面试宝典 二)
下面是好好范文网小编收集整理的经典算法面试题及答案(面试宝典 二),仅供参考,欢迎大家阅读!
问题一: 简单介绍下你自己
问题二: String为什么是final的?
问题三: String、StringBuff、StringBuilder的区别
问题四: abstract、final、static关键字的区别?抽象类可以继承实体类?抽象类可以实例化?
问题五: 声明和定义的区别
问题六: HashMap和HashTable的区别
问题七: 解决Hash冲突的方法
问题八: final、finally、finalize的区别
问题九: equals和==的区别
问题十: 重写(override)和重载(overload)的区别
十一总结
问题一: 简单介绍下你自己
解题思路: 要回答好这个问题,首先要了解面试官询问的意图,而不是上来就像记流水账一样回答,这样给面试官的印象分就减少了。
面试官询问这个问题,主要的意图大概有:
观察你是否有为面试提前做准备,如果有提前准备,回答的时候就不会磕磕巴巴的。
观察你的语言表达能力,如果你的回答东一点、西一点,印象分会减少。
为后面的面试问题做铺垫,面试官可能会根据你自我介绍的点进行相应的拓展进行面试,比如你说擅长处理大数据,他可能会问你与大数据相关的知识,如高并发情况下,大数据如何保障效率。
观察你的总结能力,面试官让你自我介绍,绝对不是让你把简历上的东西再说一遍,而是想看你如何通过简短的几分钟,能够将自己的优点以及和面试这份工作的契合度有多少,虽然只是简短的几分钟,但是也是让面试官留下好印象的机会。
知道了面试官询问的意图,那么我们就要有相对应的处理方案:
提前准备
仔细阅读面试岗位的招聘要求,列出自己擅长的技术点,这样自我介绍的时候才能够将自己的优点跟招聘的要求联合起来。
如:招聘上要求掌握XX技术的优先,你在自我介绍的时候可以将这个XX技能联系你之前的工作项目介绍,这样会让面试官对你的印象大大加分,他会认为你是提前有准备,表明你是很重视这个工作的,但是一定要提前了解这个技术,因为面试官可能会通过这个进行深入的场景询问。
格式如下:我知道贵公司招聘这个岗位要求中提到要掌握XX技术,这个技术我自认为自己擅长/我有使用过,因为在之前的XX项目中,处理XX问题时,我独立使用XX技术完成的功能开发。
控制时间
面试官让你简单的介绍自己,不是想在那里听你长篇大论,而是想通过你的表达,快速了解你和工作的契合度。时长最好控制在2-3分钟,所以在面试前一定要将自我介绍的问题摘抄到纸上,平常多多来练习。
此时,你只需要简单介绍个人信息,然后简单介绍自己之前做过的项目和使用的技术。
格式如下:我叫XXX,来自XX,毕业于XX学校XX专业,有XX年工作经验,参与过XX个项目,在XX项目中,我主要负责XX功能开发,使用了XX技术。
保持自信
无论你对面试是否有把握,你都要时刻保持自信,因为面试是双向选择的过程,而不是去乞求,即使这个面试失败了,可以总结原因,下次面试时改进。
而不是,还没有开始面试就感觉低没有了自信,在面试官看来可能会认为你跟简历描述的不一样,在心里给你打了个大大的问号,从而让自己处于弱势方,即使面试成功了,后面谈论薪资的时候你也会处理弱势方,所以,无论如何,面试过程请一定保持自信。
问题二: String为什么是final的?
这个问题主要从安全性和效率两方面进行回答:
安全性:String是最被使用的类之一,类中包含许多对于程序底层代码的调用,定义成为final类,不能被继承,所以不会被修改,从而避免了因为继承而带来的安全隐患。
效率性:定义成final类,保障了线程安全,在多线程时无需加锁,提升了效率。
实现了String创建HashCode的不可变性: 因为String是不可变的,所以在创建String类的时候hashcode就被缓存了,调用时不需要重新计算。这也使得String很适合作为Map的key值,字符串处理的速度要远快于其他的键对象。
为了实现字符串池: 只有字符是不可变时,字符串池才可以实现。
问题三: String、StringBuff、StringBuilder的区别
String是不可变的,而StringBuffer、StringBuilder是可变的。
String、StringBuffer是线程安全的,StringBuilder是线程不安全的。
执行效率: StringBuilder > StringBuff > String
问题四: abstract、final、static关键字的区别?抽象类可以继承实体类?抽象类可以实例化?
abstract表示抽象的,可以用来修饰类、方法,分别表示抽象类,抽象方法,抽象类不可以直接创建对象实例,抽象方法需要被继承的子类重写。
abstract关键字不能与private、final关键字一起公用。
final表示最终的,可以用来修饰属性、方法、类,分别代表了属性不可以变(常量),方法不可被重写,类不能被继承。
final、private修饰的方法不能被覆盖,static修饰的方法可以被覆盖。
static表示静态的,能够修饰类、方法、变量、代码块,被它修饰的方法和变量可以直接通过类名进行访问。
抽象类可以继承实体类,抽象类不能实例化。
问题五: 声明和定义的区别
定义: 为声明的"名字"分配存储空间,如:Integer x= 10;
区别联系: 把不需要建立存储空间的变量成为"声明",把需要存储空间的称为"定义"。
问题六: HashMap和HashTable的区别
作者不一样
产生的时间不一样(HashMap是JDK1.2时产生的,Hashtable是JDK1.0是产生的,且Hashtable不遵循驼峰命名)
HashMap不是线程安全的,Hashtable是线程安全的。
继承的父类不一样,HashMap继承的父类是AbstractMap,Hashtable继承的父类是Dictionary
对外提供的API不一样,HashMao提供的containsKey/containsValue来判断key/value是否存在,Hashtable提供了contains方法来判断key是否存在。
对Null key和Null Value的支持不同: Hashtable不支持存在key和value为null,因为在put元素的时候,它会直接调用key.hashCode(),和判断value是否为空,为空则会抛出空指针异常。HashMap允许存在一个key为null,多个value为null的情况。
HashMap线程不安全,但效率高于Hashtable,Hashtable给每个方法都加上了synchronized,所以线程安全,但是效率比HashMap低。
遍历方式不同,HashMap使用Entry数组方式进行遍历,而Hashtable使用Enumeration方式遍历,JDK1.8后使用fail-fast方式。
初始化容量大小和扩容大小不同: HashMap的默认大小是16,扩容为原来的2倍。Hashtable默认大小是11,扩容为原来的2n+1。
创建大小时如果有给定大小,则HashMap使用直接给定的值,而Hashtable则会将其扩容为2的幂次方。
问题七: 解决Hash冲突的方法
Hash冲突(碰撞): 两个不同的元素,但是Hash函数值一样。
开放定制法
再哈希法
链地址池
建立一个公共溢出区
问题八: final、finally、finalize的区别
final用于修饰属性、方法、类,分别表示属性不能被重新赋值(常量)、方法不可以被重写、类不能被继承。
finally是异常捕获语句的一部分,通常出现的形式是:try…catch…finally。finally表示总是执行。
finalize是Object中的一个方法,它是由垃圾回收器进行调用的,只有当垃圾回收器回收对象的时候,会调用该对象的finalize方法。
问题九: equals和==的区别
针对基础数据类型,没有equals方法,只有==,==比较的是他们的值。
针对引用类型,则分以下的情况:
基础类型对应的包装类型(8种),因为重写了equals方法,所以它们的equals比较的是对象的值
"=="比较的是对象对应的内存地址值是否相等,equals默认比较的也是对象存在内存中地址值。
问题十: 重写(override)和重载(overload)的区别
重写存在于继承关系下,private和final修饰的方法都不能被重写,构造方法也不能被重写。
重写表示子类和父类中有方法名称、方法参数、返回值一样的方法,子类继承父类时可以重写这个方法的逻辑,当创建这个子类对象时,调用到这个方法的时候,就会去执行子类重写后的方法逻辑,相当于把与父类相同的方法的逻辑覆盖了,这是面向对象编程中多态性的一种表现。
重写要遵循"两同两大一小原则","两同"表示:方法名称、参数类型(包括顺序)与父类方法一致,"两大"表示:子类返回值类型、子类抛出的异常类型要小于等于父类的返回值类型和异常,“一大”表示:子类的访问权限要大于等于父类抛出的异常。
重载: 表示在一个类中有多个相同名称,但是参数列表不同的方法。
重载中的参数列表不同包括: 参数个数不同,参数类型不同,和参数顺序不同。
重载和参数的返回值类型无关
十一总结
感谢你阅读本文,如果你觉得文章哪里存在错误,欢迎私信或者在下方留言指出。如果你觉得本文对你有一些帮助,可以给我一个点赞和关注,让我有更多动力给大家带来更多的文章,谢谢。