程序员面试题库及答案.docxVIP

  • 1
  • 0
  • 约9.83千字
  • 约 9页
  • 2026-03-14 发布于河北
  • 举报

程序员面试题库及答案

一、基础编程与语法(高频)

1.题目:说说Java中equals和==的区别(或Python中==和is的区别)

答案(Java版):首先==是运算符,equals是Object类的方法。对于基本数据类型(int、char等),==比较的是值;对于引用数据类型,==比较的是对象在内存中的地址(也就是是否是同一个对象)。equals默认实现其实就是==,比如Object类里的equals方法,就是returnthis==obj;但很多类(比如String、Integer)重写了equals方法,改成了值比较。比如Stringstr1=abc;Stringstr2=newString(abc);这里str1==str2是false(地址不同),str1.equals(str2)是true(值相同)。另外要注意,重写equals必须重写hashCode,不然用HashMap这类集合时会出问题,因为集合判断元素是否重复会先比较hashCode再比较equals。

答案(Python版):==比较的是两个对象的值是否相等,is比较的是两个对象的内存地址是否相同(也就是id是否一样)。比如a=[1,2,3];b=a;c=[1,2,3];这里a==b是True,a==c也是True(值都一样);但aisb是True(b指向a的地址),aisc是False(c是新创建的对象,地址不同)。还有小整数池的情况,比如x=10;y=10;xisy是True,因为Python会缓存-5到256之间的整数,直接复用对象;但x=257;y=257,xisy就可能是False(看运行环境,交互模式下会重新创建)。

2.题目:什么是闭包?举个实际应用场景

答案:闭包简单说就是“函数嵌套函数,内部函数引用外部函数的变量,并且外部函数返回内部函数”,而且外部函数执行完后,内部函数依然能访问外部函数的变量(变量不会被销毁)。核心是“保留外部环境的状态”。

实际场景比如:1.装饰器(Python里最常用),比如写一个计算函数执行时间的装饰器,内部函数引用外部函数的start_time变量,即使外部函数执行完,内部函数在调用时依然能拿到这个变量;2.防抖节流,比如页面滚动事件的节流,用闭包保存上一次执行的时间戳,避免每次滚动都触发事件;3.封装私有变量,比如在JavaScript里,不想让变量暴露在全局,就用闭包包裹,只对外暴露方法,方法内部能访问私有变量。

3.题目:说说数组和链表的区别,分别适合什么场景

答案:核心区别在存储结构和操作效率上。数组是连续的内存空间,元素类型相同,通过下标访问;链表是不连续的内存空间,每个节点包含数据和下一个节点的地址(单链表),只能从头节点遍历。

操作效率对比:1.访问元素:数组O(1)(直接下标定位),链表O(n)(必须从头遍历);2.插入/删除:数组O(n)(插入中间位置需要移动后面所有元素),链表O(1)(只需要修改节点的指针,前提是找到插入/删除的位置,找位置还是O(n));3.空间占用:数组初始化时需要指定大小,可能浪费空间(固定长度),或者不够用(动态数组会扩容,比如Java的ArrayList扩容是1.5倍,扩容时会拷贝数据);链表每个节点都要存指针,有额外空间开销,但空间按需分配。

适用场景:数组适合频繁访问元素、少量插入删除(比如查询学生成绩、缓存数据);链表适合频繁插入删除、不需要频繁访问(比如队列、栈的实现,链表的头插尾删效率高;还有LRU缓存的淘汰机制,用双向链表移动节点)。

二、算法与数据结构(必问)

1.题目:用Java/Python实现单链表的反转(迭代法)

答案(Java版):首先定义链表节点类:

java

classListNode{

intval;

ListNodenext;

ListNode(intval){

this.val=val;

this.next=null;

}

}

反转实现(迭代法,时间O(n),空间O(1)):

java

publicListNodereverseList(ListNodehead){

ListNodeprev=null;//前一个节点

ListNodecurr=head;//当前节点

while(curr!=null){

ListNodenextTemp=curr.next;//保存下一个节点(防止断链)

curr.next=prev;//

文档评论(0)

1亿VIP精品文档

相关文档