给想当程序员的你:程序员面试宝典与进阶秘笈.pdf
http://www.100md.com
2020年4月18日
![]() |
| 第1页 |
![]() |
| 第7页 |
![]() |
| 第17页 |
![]() |
| 第27页 |
![]() |
| 第40页 |
![]() |
| 第715页 |
参见附件(38036KB,732页)。
给想当程序员的你是郑萌写的而关于程序员就业的书籍,包含了程序员面试企业的招聘试题,面试技巧,为你提供就业指导,帮助准备做程序员的你更好的规划职业生涯。

给想当程序员的你内容
本书致力于为年轻程序员做全面且精准的就业指导,从技术干货、企业招聘试题、一线企业高级工程师的指导意见等角度提供实用的就业指南;就怎样才能进入心仪的企业,掌握哪些技术知识点会为自己加分,职业生涯该如何发展规划等问题进行逐一解答,从而为广大年轻程序员提供有效的帮助。
本书依据编程语言及技术种类划分为5章,分别是C/C++、Java、PHP、Android和iOS,每章分为初级、中级、高级所对应的工程师标准,与各个知识点相关的企业招聘试题,专家团队介绍以及专家的访谈内容和对年轻程序员未来发展的建议。
知己知彼,方能百战不殆。要想进入理想的企业,就需要了解企业到底需要什么样的人才,然后有针对性地训练自己的技能,这样才能拿到梦寐以求的offer。
作者资料
郑萌,猿圈创始人。
任北京交通大学、北京航空航天大学等名校的客座教授。Google Android学术合作计划特邀讲师,北京谷歌技术用户组特邀讲师。
前言
为什么要写这本书
对于IT行业的人来说,一个程序员能否很好地成长,离不开就职环境的影响。所以能否进入一个好的就职环境,确立满意的职业生涯,是十分重要的。本书希望为求职路上的程序员们提供更多、更好、更有效的帮助,使他们最终获得自己心仪的职位。
本书通过百余个面试题目对C/C++、Java、PHP、Android、iOS进行总结,其中包含了面试中各种编程语言的相关考察点,涉及这些语言或技术的互联网公司的招聘流程以及常见问题等。面试题目多取材于各大互联网公司的面试真题,并且问答部分均来自知名互联网公司的高级程序员,可以帮助开发者们把握当前主流IT企业的面试、笔试特点,提高入职成功的概率。
本书有何特色
(1)内容涵盖广泛。本书对于目前主流的开发语言均进行了总结,帮助读者全面了解面试过程的特点和应对技巧;每种语言的相关知识点均有若干题目,能够使读者更加全面地掌握各种重点技术和技术难点。
(2)提供真题实例解析。全书百余道题目大多取自各大知名互联网公司的笔试面试真题,让读者直观地感受题目。并且每章都提供了编程实例,帮助读者深入学习。
(3)与大牛们面对面交流。书中的面试流程、面试中常见的问题均摘自对各大互联网公司大牛们采访的内容,让读者能够更进一步地了解主流的互联网公司招聘,解决读者在应聘和职业规划中的各种疑问。
书籍章节目录
第1章 C/C++
1.1 C/C++工程师标准
1.1.1 初级要求
1.1.2 中级要求
1.1.3 高级要求
1.2 专家介绍
1.3 专家意见
1.4 Q&A专访
第2章 Java
2.1 Java工程师标准
2.1.1 初级要求
2.1.2 中级要求
2.1.3 高级要求
2.2 专家介绍
2.3 专家意见
2.4 Q&A专访
第3章 PHP
3.1 PHP工程师标准
3.1.1 初级标准
3.1.2 中级标准
3.1.3 高级要求
3.2 专家意见
3.3 专家意见
3.4 Q&A专访
第4章 Android
4.1 Android工程师标准
4.1.1 初级要求
4.1.2 中级要求
4.1.3 高级要求
4.2 专家介绍
4.3 专家意见
4.4 Q&A专访
第5章 iOS
5.1 iOS工程师标准
5.1.1 初级要求
5.1.2 中级要求
5.1.3 高级要求
5.2 专家介绍
5.3 专家意见
5.4 Q&A专访
给想当程序员的你:程序员面试宝典与进阶秘笈截图


目录
内容简介
前言
第1章 CC++
1.1 CC++工程师标准
1.2 专家介绍
1.3 专家意见
1.4 QA专访
第2章 Java
2.1 Java工程师标准
2.2 专家介绍
2.3 专家意见
2.4 QA专访
第3章 PHP
3.1 PHP工程师标准
3.2 专家意见
3.3 专家意见
3.4 QA专访第4章 Android
4.1 Android工程师标准
4.2 专家介绍
4.3 专家意见
4.4 QA专访
第5章 iOS
5.1 iOS工程师标准
5.2 专家介绍
5.3 专家意见
5.4 QA专访
附录 各种语言和技术的工程师标准
本书有何特色
业的面试、笔试特点,提高入职成功的概率。
答部分均来自知名互联网公司的高级程序员,可以帮助开发者们把握当前主流IT企
招聘流程以及常见问题等。面试题目多取材于各大互联网公司的面试真题,并且问
中包含了面试中各种编程语言的相关考察点,涉及这些语言或技术的互联网公司的
本书通过百余个面试题目对CC++、Java、PHP、Android、iOS进行总结,其
的职位。
为求职路上的程序员们提供更多、更好、更有效的帮助,使他们最终获得自己心仪
所以能否进入一个好的就职环境,确立满意的职业生涯,是十分重要的。本书希望
对于IT行业的人来说,一个程序员能否很好地成长,离不开就职环境的影响。
为什么要写这本书
前言
么样的人才,然后有针对性地训练自己的技能,这样才能拿到梦寐以求的offer。
知己知彼,方能百战不殆。要想进入理想的企业,就需要了解企业到底需要什
建议。
关的企业招聘试题,专家团队介绍以及专家的访谈内容和对年轻程序员未来发展的
Android和iOS,每章分为初级、中级、高级所对应的工程师标准,与各个知识点相
本书依据编程语言及技术种类划分为5章,分别是CC++、Java、PHP、进行逐一解答,从而为广大年轻程序员提供有效的帮助。
心仪的企业,掌握哪些技术知识点会为自己加分,职业生涯该如何发展规划等问题
题、一线企业高级工程师的指导意见等角度提供实用的就业指南;就怎样才能进入
本书致力于为年轻程序员做全面且精准的就业指导,从技术干货、企业招聘试
内容简介
第5章iOS
专访。
包含Android的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA
第4章Android
访。
包含PHP的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第3章PHP
访。
包含Java的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第2章Java
访。
包含CC++的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第1章CC++
本书内容与知识体系
聘,解决读者在应聘和职业规划中的各种疑问。
互联网公司大牛们采访的内容,让读者能够更进一步地了解主流的互联网公司招
(3)与大牛们面对面交流。书中的面试流程、面试中常见的问题均摘自对各大
习。
面试真题,让读者直观地感受题目。并且每章都提供了编程实例,帮助读者深入学
(2)提供真题实例解析。全书百余道题目大多取自各大知名互联网公司的笔试
读者更加全面地掌握各种重点技术和技术难点。
面了解面试过程的特点和应对技巧;每种语言的相关知识点均有若干题目,能够使
(1)内容涵盖广泛。本书对于目前主流的开发语言均进行了总结,帮助读者全
高峰、亚康科技首席运营官韦红军、游戏多副总裁汪洋(排名不分先后)。
李湛、盛大G云负责人陈桂新、英雄互娱首席运营官刘志刚、泰康在线首席技术官潘
人星云负责人胡远星、慧聪副总裁李韬、爱摄汇首席执行官赵亮、游族首席技术官
军、 CNTV总工程师宋维君、跟谁学首席技术官李钢江、玩多多首席执行官罗剑、巨
华、芒果TV首席技术官黄冬、仟寻时代首席执行官黄晶、海尔电商首席技术官盛国
毅、一下科技首席执行官韩坤、映客首席执行官奉佑生、UCloud首席执行官季昕
建春、金山云首席执行官王育林、凤凰网技术副总裁金明岩、亿采网首席技术官陈
1024学院院长戴华、iTechClub执行理事倪鸣、腾讯社交网络运营部助理总经理赵
姚键、美团云总经理李爽、小米首席架构师崔宝秋、iTech Club理事长吴华鹏、官邢宏宇、搜狗首席运营官茹立云、陌陌技术副总裁王春来、优酷土豆首席技术官
指导专家:阿里巴巴技术副总裁 刘拴林、联想副总裁 陈宇、58同城首席技术
李、李文东、任龙、姚清亮。
参编专家:林飞、刘怀军、李国松、欧阳辰、何伟、罗丁、宋坤、郭振耀、陈
本书主编:郑萌。
本书作者及编委会成员
-想要了解互联网行业面试的相关人员
-技术部门的HR
-应聘软件行业职位的相关就业人员
-计算机相关专业的应届毕业生
适合阅读本书的读者
包含工程师对于各语言和技术的初级、中级、高级知识掌握的标准。
附录各种语言和技术的工程师标准
访。
包含iOS的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专编者
第1章 CC++
C语言是一种结构化语言,它层次清晰,便于按模块化方式组织程序,易于调试
和维护。C语言的表现能力和处理能力极强,它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,还可以直接访问内存的物理地址,进行位一级的操
作。而在C语言的基础上,1983年又由贝尔实验室的Bjarne Strou-strup推出了
C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++提
出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地
映射到程序空间,为程序员提供了一种与传统的结构化程序设计不同的思维方式和
编程方法,因而也增加了整个语言的复杂性,掌握起来有一定的难度。
1.1 CC++工程师标准
1.1.1 初级要求
标准C基础:一般应包括对于数据类型、变量常量、数组、函数、指针和字
符串、结构、联合和枚举的理解和运用。
作为一个合格的软件工程师,具备扎实的编程基础是十分必要的,这也是各大
互联网公司面试中一定会考察的知识点。例如下面的题目摘自某知名互联网公司的
招聘考试试题。
题1-1:请看下面的代码。程序运行的结果是( )。A.3,2,1
B.1,3,2
C.1,3,3
D.1,2,3
正确答案:C
【解析】
题1-2:下列代码中,prim函数的功能是分解质因数。请填写括号中的内容。正确答案:①m%n ②m=n
【解析】n从2开始,第一处为m%n,代表取余。当余数是0的时候表示除尽,跳
出while循环,即找出一个质因数。此时一个质因数即为n,然后m=n,即让m除以
这个质因数,然后再进入求新m质因数的递归。
题1-3:若有以下类型说明语句:char w; int x; float y; double z;则表
达式w-xyz的结果为double类型,表达式(int)(x+y-zw)的结果为( )类型。
A.float
B.char
C.int
D.double
正确答案:C
【解析】当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类
型转换,将操作数转化为所需要的类型。显式强制类型转换需要使用强制类型转换
运算符,格式如下:type()或(type)。其中,type
为类型描述符,如int、float等。为表达式。经强制类型转换运算
符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数
本身,运算后操作数本身未改变。
题1-4:C语言中运算对象必须为整型的运算符是( )。
A.%=
B.C.=
D.<=
正确答案:A
【解析】%=是取模运算,也就是求余数的运算,只有整数才能取模。
题1-5:在C语言程序中,表达式85的结果是( )。
A.1.6
B.1
C.3
D.0
正确答案:B
【解析】C语言中整数的运算结果仍然为整数。
题1-6:设x为int型变量,且x=10,则执行语句x+=x后,x的值为( )。
A.10
B.20
C.40
D.30
正确答案:B
【解析】例如式子a+=b,即把a+b的值再赋值给a。对于本题来说,x+=x即把
x+x的值赋给x,x最后为20。
题1-7:在C语言程序中,表达式5%2的结果是( )。A.2.5
B.2
C.1
D.3
正确答案:C
【解析】%指的是取余数,5除以2的余数为1。
题1-8:如果int a=3,b=4;则条件表达式a
A.3
B.4
C.0
D.1
正确答案:A
【解析】a
为b。本题中a
题1-9:C语言中,关系表达式和逻辑表达式的值是( )。
A.0
B.0或1
C.1
D.T或F
正确答案:B【解析】逻辑表达式是指运算符为或(||)、与、非(!)的表达式。返
回值为0或1,0表示false,非0表示true.关系表达式是指运算符为<、<=、>、>=、==、!=的表达式,返回值同样为0或1.
题1-10:设a、b和c都是int型变量,且a=3,b=4,c=5,则下面的表达式中,值为0的表达式是( )。
A.'a''b'
B.a<=b
C. a||b+cb-c
D.!((a
正确答案:D
【解析】||和的优先级高于+和-,||和的优先级相等,且是左结合的,就
是从左边开始结合到右边。
题1-11:下面( )表达式的值为4。
A.113
B.11.03
C.(float)113
D.(int)(11.03+0.5)
正确答案:D
【解析】A.整数的运算结果仍然为整数,结果为3;B.由于11.0是float型,因
此计算结果也为float型,值为3.0;C.结果强制类型转换为float类型,值为
3.0;D.11.03+0.5=4.1,强制类型转换为整型,结果为4。
题1-12:已知int x=5,y=5,z=5;执行语句x%=y+z;后,x的值是( )。A.0
B.1
C.5
D.6
正确答案:C
【解析】x=x%(y+z),x=5%(5+5)=5,结果为5。
题1-13:已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句
c2='A'+'6'-'3';后,c2中的值为( )。
A.68
B.'D'
C.错误
D.'d'
正确答案:B
【解析】c2的ASCII码为十进制数68,因为c2是字符型的,所以应该是字母D。
题1-14:下列关于C语言的叙述错误的是( )。
A.大写字母和小写字母的意义相同
B.不同类型的变量可以在一个表达式中
C.在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型
D.同一个运算符号在不同的场合可以有不同的含义
正确答案:A【解析】C语言中,大小写代表不同的两个标识符。A错误。
题1-15:有:int w=11,x=12,y=3,m;执行语句m=(w
m:y;后,m的结果是( )。
A.1
B.2
C.3
D.以上结果都不对
正确答案:C
【解析】m=(w
和y中的较小值赋给m,即m=3。
题1-16:设整型变量a=2,则执行下列语句后,浮点型变量b的值不为0.5的是
( )。
A.b=1.0a;
B.b=(float)(1a);
C.b=1(float)a;
D.b=1(a1.0);
正确答案:B
【解析】B中整数与整数的运算结果仍然为整数,所以1a的值为0,强制转化为
float型后结果为0.0。
题1-17:若int n; float f=13.8;则执行n=(int)f%3后,n的值是( )。
A.1B.4
C.4.333333
D.4.6
正确答案:A
【解析】13.8取整之后等于13,13对3求余结果是1,选A。
题1-18:在C语言的库函数中,可以输出char型变量x值的语句是( )。
A.getchar(x)
B.fputc(x)
C.putchar(x)
D.puts(x)
正确答案:C
【解析】输出函数是putchar和printf,putchar只能输出字符常量和字符型
变量。getchar和putchar是一对函数,针对字符及字符变量进行操作。getchar可
以接受各种字符,包括空格和回车,相应的putchar可以输出一个字符。
题1-19:以下说法正确的是( )。
A.'x'+5是一个错误的表达式
B.C语言不允许类型的混合运算
C.强制类型转换时,类型说明符必须加括号
D.(int)x+y和(int)(x+y)是完全等价的表达式
正确答案:C【解析】A表达式正确;B中C语言允许类型混合运算;C正确;D中(int)x+y先
将x转换为整型,再与y进行加法运算,(int)(x+y)先将x与y相加,结果再转换为整
型,两个式子是不同的。
题1-20:在C语言中,认为( )为逻辑“真”。
A.true
B.大于0的值
C.非0整数
D.所有非0的值
正确答案:D
【解析】C语言中,0是假值,其他的都是真值。
题1-21:表示关系x<=y<=z的C语言表达式为( )。
A.(x<=y)(y<=z)
B.(x<=y)AND(y<=z)
C.(x<=y<=z)
D.(x<=y)(y<=z)
正确答案:A
【解析】题中x<=y<=z的意思为x<=y并且y<=z。在C语言中,要表示“且”的关
系,应用“与”逻辑运算符,即“”,故选择A选项。
题1-22:能正确表示逻辑关系a>=10或a<=0的C语言表达式是( )。
A.a>=10 or a<=0
B.a>=0||a<=10C.a>=10a<=0
D.a>=10||a<=0
正确答案:D
【解析】逻辑运算符“||”表示或的意思。
题1-23:判断char型变量c1是否为大写字母的表达式为( )。
A.'A'<=c1<='Z'
B.(c1>='A') (c1<='Z')
C. ('A'<=c1)AND ('Z'>=c1)
D.c1>='A' c1<='Z'
正确答案:D
【解析】C语言规定,字符常量在程序中要用单引号括起来。判断c1是否为大写
字母的充要条件为c1>='A'和c1='Z',用逻辑与来表示。所以选项D正确。
题1-24:若int i=10;执行下列程序后,变量i的正确结果是( )。
A.13
B.12
C.11
D.10正确答案:A
【解析】由于case中缺少break语句,在case 10之后程序会一直执行下去,因
此结果为13。
题1-25:在下面的条件语句中(其中s1和s2表示C语言语句),只有一个在功
能上与其他三个语句不等价,它是( )。
A.if (a) s1; else s2;
B.if (a==0) s2; else s1;
C.if (a!=0) s1; else s2;
D.if (a==0) s1; else s2;
正确答案:D
【解析】答案A中if(a) s1; else s2;,假设a==0,那么if语句条件为假,执
行s2,假设a!=0,执行s1;答案B中 if(a==0); s2; else s1;,假设a==0,那么
if语句条件为真,执行s2,假设a!=0,执行s1;答案C中 if(a!=0) s1; else
s2;,假设a==0,那么if语句条件为假,执行s2,假设a!=0,执行s1;答案D中
if(a==0) s1; else s2;,假设a==0,那么if语句条件为真,执行s1,假设
a!=0,执行s2。
题1-26:假定所有变量均已正确定义,则下列程序段运行后y的值是( )。
A.20
B.11C.9
D.0
正确答案:A
【解析】if(a=0)y--;其中a=0是先给a赋值为0再判断,这里的a为0了,if(a)就是假的,不成立;else if(a>0)继续判断a>0。上面已经把a赋值为0,所
以这里也不成立;y++不执行,然后执行else y+=y;做到这一步了,y=y+y=20,所以a的值是0,y的值是20。
题1-27:假定所有变量均已正确定义,则下列程序段运行后x的值是( )。
A.34
B.4
C.35
D.3
正确答案:B
【解析】程序是一步一步往下执行的,对于if语句,只有为真的时候才会执行
其后面的语句。if(!a)会执行后面的语句,因为非零即为真,执行到这步后,x=34,但是程序继续往下,if(c)后面的语句不执行,就执行了else后的语句,所
以x=4。题1-28:若k是int型变量,且有下面的程序段:
上面程序段的输出结果是( )。
A.
B.
C.
D.有语法错误,无输出结果
正确答案:A
【解析】k的值为-3,满足if语句中的条件k<=0,因此输出结果为A。
题1-29:执行如下程序:
该程序的输出结果是( )。
A.a=2,b=1B.a=1,b=1
C.a=1,b=0
D.a=2,b=2
正确答案:D
【解析】case后面跟的必须是整型常量表达式。进入case后,如果没有遇到
break语句,就会一直往下执行,后面其他case或default分支的语句也会被执行
到,直到遇到break,或者执行到整个switch语句块的末尾。题目中给出了三个
case语句:case 0、case 1、case 2。当x为0时,从case 0语句开始执行,因为
没有break语句,将一直执行到函数末尾结束,即继续执行case 1、case 2两条语
句。执行完case 1时,a=1,b=1;执行完case 2时,a=2,b=2。
题1-30:以下程序的输出结果是( )。
A.0
B.1
C.2
D.3
正确答案:C
【解析】x值为-10,y值为1,在第一个if判断中满足条件,进入第二层if判
断,由于y>0,执行else语句,z=z+1=2,所以结果为C。题1-31:以下程序段的输出结果是( )。
A.a=10 b=50 c=10
B.a=10 b=30 c=10
C.a=50 b=30 c=10
D.a=50 b=30 c=50
正确答案:B
【解析】if(a>b) a=b;条件不成立,此语句不执行;b=c;直接赋值,b直接等
于c=30;c=a;语句让c直接等于a。
题1-32:执行语句for(j=0; j<=3; j++) a=1;后变量j的值是( )。
A.0
B.3
C.4
D.1
正确答案:C
【解析】在j=3时仍然满足循环条件,因此j仍然会执行一次j++的操作,此时
j=4,不满足j<=3的条件,退出循环。
题1-33:下列循环语句中有语法错误的是( )。
A.while(x=y) 5;B.while(0);
C.do 2; while(x==b)
D.do x++ while(x==10);
正确答案:D
【解析】D选项中x++是一条语句,后面要加(;)。
题1-34:语句while(!y);中的表达式!y等价于( )。
A.y==0
B.y!=1
C.y!=0
D.y==1
正确答案:A
【解析】y==0则!y就是非0,即为真;y!=1则y可以等于2、3,结果!y是假;
y!=0则y是1时y!=0是真,而!y是假;y==1则y是1时是真,!y却是假。
题1-35:若有int a=1,x=1;则循环语句while(a<10) x++; a++;的循环将执
行( )。
A.无限次
B.不确定次
C.10次
D.9次
正确答案:A【解析】while(a<10) x++; a++;语句中while是不包含a++的,只循环执行
x++。
题1-36:以下程序段( )。
A.是死循环
B.循环执行一次
C.循环执行两次
D.有语法错误
正确答案:A
【解析】进入do循环后,x的值变为1,满足while(x>0)的条件,因此会一直执
行do while,造成死循环。
题1-37:循环for(i=0,x=1; i=10x>0; i++);将执行( )。
A.无限次
B.不确定次
C.10次
D.9次
正确答案:A
【解析】i被赋值为10与x>0是永真的。一开始i=0,x=1只是给i和x赋了初值。
所以程序会执行无数次。
题1-38:有如下程序:该程序的执行结果是( )。
A.6
B.3
C.死循环
D.4
正确答案:A
【解析】首先,i=1,进入for循环,执行sum+=i后sum的值为3;执行i+=2,i
的值变为3,此时仍然满足i<=3的循环条件,继续执行for循环,sum的值变为6;再
次执行i+=2后i的值变为5,不满足循环条件,退出循环,因此sum的值为6。
题1-39:执行下列语句后,变量i的值为( )。
A.2
B.3
C.4
D.5
正确答案:C
【解析】当i=3时不满足条件退出循环,但i++会使i再加1,就变成了4。题1-40:以下对一维数组a的正确声明是( )。
A.char a(10);
B.int a[ ];
C.int k=5,a[k];
D.char a[3]={'a','b','c'}
正确答案:D
【解析】A应使用方括号[ ];B中没有定义数组大小;C方括号内必须是常量;
D正确。
常量的概念:CC++中的常量和变量是经常使用的两种类型,其中常量是存
放固定且不可变值的,一旦确定初始值,则在程序其他地方不可改变。常量一
般使用define或者const关键字来修饰,用define一般是为了程序代码可以做
统一的修改,而const多是为了保护数据不被修改。
对于常量概念的理解和使用是基础中的基础,但却容易被忽略,例如下面这道
题摘自迅雷的面试题。
题1-41:下列选项中不能作为合法常量的是( )。
A.1.234e+4
B.1.234e0.4
C.1.234e04
D.1.234e0
正确答案: B
【解析】实型字面值常量有两种表示方式:小数形式和指数形式。小数形式:由最前面的正负号,数字0~9和小数点组成,不允许有其他符号。
指数形式:包括指数和尾数两个不可缺少的部分,用符号E(e)分隔;E(e)左边
是尾数,为十进制整数或小数形式的实数,右边为指数,必须为十进制整数,表示
乘以10的多少次方,故选项B不正确。
宏定义:CC++中的宏定义是进行符号常量定义,该定义规定一种符号信
息,用来表示一些特殊的内容,使源代码更具有可读性,同时,也可以提高系
统的可移植性。宏定义是在编译时进行解释与替换的,实际运行中的代码是没
有宏定义符号的。而一般变量或常量定义在系统运行中,是有自己的内存空
间、访问权限和生存周期的。
在CC++中,宏定义的使用频率是很高的,对于宏定义的理解也是十分重要的。
例如下面这道题目摘自某知名互联网公司的考试内容。
题1-42:下列关于CC++宏定义的说法中,不正确的是( )。
A.宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用
const常量
B.宏的嵌套定义过多会影响程序的可读性,而且很容易出错
C.相对于函数调用,宏定义可以提高程序的运行效率
D.宏定义不检查参数正确性,会有安全隐患
正确答案:A
【解析】宏定义由预编译器来处理,当你定义一个记号,如define RATIO
1.652时,RATIO可能从未被编译器看到,而直接被预处理器移走了;如果你的定义
是define RATIO,在预处理进行一个宏替换的时候,由于调用地方的特殊性,会
出现一个莫名其妙的错误;但如果你使用的是const double RATIO = 1.652,若
你没有初始化这个变量,则在这个变量出错的地方,编译器将给出错误信息,可以
方便程序设计者很快地找出错误所在。这就是《Effective C++》作者所说的“尽
量以const enum inline替换define”的条款。内存分配:一个由CC++编译的程序占用的内存分为以下几个部分。
1.栈区(stack):由编译器自动分配和释放存放函数的参数值、局部变
量的值等。其操作方式类似于数据结构中的栈。
2.堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束
时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3.全局区(静态区)(static):全局变量和静态变量的存储是放在一块
的,初始化的全局变量和静态变量在一块区域中,未初始化的全局变量和未初
始化的静态变量在相邻的另一块区域中。
4.文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
5.程序代码区:存放函数体的二进制代码。
对于内存分配的理解,是CC++编程中的难点也是重点,所以更是笔试中被考察
的重点知识。例如下面摘取了奇虎360软件测试工程师的笔试题。
题1-43:在CC++中,能将分配的空间初始化为0的是哪种分配方法?( )
A.calloc( )
B.malloc( )
C.realloc( )
D.new[ ]
正确答案: A
【解析】
①calloc函数:void calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个num size连续的空
间。calloc申请内存空间后,会自动初始化内存空间为0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
②malloc函数:void malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则
返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
③realloc函数:void realloc(void ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把
ptr内存空间调整为size。申请的内存空间不会进行初始化。
④new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内
存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工
作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的
变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
题1-44:下面有关C++内存分配堆栈说法错误的是( )。
A.一般来讲,在32位系统下,堆内存可以达到4GB的空间,但是对于栈来讲,一般都是有一定的空间大小的
B.对于栈来讲,是由编译器自动管理,无须我们手工控制;对于堆来说,释放
工作由程序员控制
C.对于栈来讲,生长方向是向上的,也就是向着内存地址减小的方向;对于堆
来讲,它的生长方向是向下的,是向着内存地址增加的方向增长
D.对于堆来讲,频繁地进行newdelete操作势必会造成内存空间的不连续,从而产生大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题
正确答案:C
【解析】对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。CC++指针:指针是CC++编程中的重要概念之一,也是最容易产生困惑并
导致程序出错的问题之一。利用指针编程可以表示各种数据结构,通过指针可
使主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通信;指
针能够灵活、合理地操作内存,能够使程序更高效。从本质上讲,指针也是一
种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块
地址,这块地址指向某个变量或者函数,指针就是地址。指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。
指针的理解和应用是重中之重,也是大部分互联网公司CC++工程师笔试考察的
重点,例如下面摘自阿里巴巴搜索研发C++工程师笔试题的题目。
题1-45:声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数
指针,该函数的返回值是int,参数是int,正确的是( )。
A.int [10]p(int )
B.(int p[10])(int)
C.int ((p)[10])(int )
D.int ((int )[10])p
E.以上选项都不正确
正确答案: C
【解析】先看未定义标识符p,p的左边是,p表示一个指针,跳出括号,由于
[ ]的结合性大于,所以p指向一个大小为10的数组,即(p)[10]。左边又有一
个号,修饰数组的元素,(p)[10]表示p指向一个大小为10的数组,且每个数组
的元素为一个指针。跳出括号,根据右边的(int )可以判断((p)[10])是一
个函数指针,该函数的参数是int,返回值是int.所以选C.
下面这道题目摘自微软的笔试题。
题1-46:运行下面这段代码,输出结果是( )。A.12
B.11
C.Compile error
D.Garbage value
E.None of above
正确答案: D
【解析】const在的左侧,指针所指向的内容不可变,即p不可变;本题改变
的是指针p本身,但p++后不知道指针指向了哪里。所以p是没有用的值。
下面这道题目摘自小米的笔试题。
题1-47:int p = n;,那么p的值是( )。
A.n的地址
B.p的地址
C.n的值
D.p的值
正确答案: C
【解析】p指向n,p表示n的地址;p表示n的内容。拷贝原理:深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这
个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反
之,没有重新分配资源,就是浅拷贝。
拷贝原理是CC++中的基础知识,会作为基础考察点进行考察。例如下面这道摘
自奇虎360软件测试工程师笔试题的题目。
题1-48:关于“深拷贝”,下列说法正确的是( )。
A.会拷贝静态分配的成员对象
B.会拷贝动态分配的成员对象
C.会拷贝成员数据的值
D.A和C都对
正确答案: B
【解析】深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都
不会对另外一个对象造成影响。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不
同)。对其中任何一个对象的改动都会影响另外一个对象。
A和C都错在了同一个地方,即没有考虑静态成员。类的静态成员是所有类的实
例共有的,存储在全局(静态)区,只此一份,不管继承、实例化还是拷贝都是同
一份。
A中,静态成员属于成员数据,而C中,静态成员和局部成员都是静态分配的
(与动态分配对应),因此A和C中都包含了静态成员,所以不正确。
因此,D也不正确。
排序算法:C++中常见的排序算法有冒泡排序、选择排序、插入排序、快速
排序等。排序算法在很多领域中是十分重要的,尤其是大数据处理方面。一个优秀的算
法可以节省大量的资源,所以掌握各种排序算法的原理以及应用是十分重要的。下
面是摘自淘宝面试的题目。
题1-49:以下选项中,哪个选项的时间复杂度与记录的初始排列无关?( )
A.堆排序
B.插入排序
C.冒泡排序
D.快速排序
正确答案: A
【解析】由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最
坏还是平均时间复杂度均为O(nlog2n)。
空间复杂度上,它只有一个用来交换的暂存单元,也非常不错。不过由于记录
的比较与交换是跳跃式进行的,因此,堆排序也是一种不稳定的排序方法。
另外,由于初始构建堆所需的比较次数较多,因此,它并不适合待排序序列个
数较少的情况。
题1-50:下面程序的功能是输出数组的全排列。请将程序填写完整。正确答案:①k==m ②perm(list,k+1,m);
【解析】for循环的作用是先把index值为k的元素后面的元素依次与index为k
的元素交换,相当于得到index为k的元素可能的取值情况,然后使用递归得到
index为k+1的元素位置可能的所有取值。然而对index为k的位置元素进行取值的时
候,操作过后需要还原,避免取下一个值的时候出错,因此就有了第二个swap操
作。由上述分析可知,第一个空格应该为k==m,当index值到了m的时候输出即可,因为index为m时,后面已经没有元素与其进行对调。
函数重载:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一
范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数
的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算
功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不
同的问题。
函数重载在CC++的编程中也是广泛使用的一门基础技术,应该了解和掌握。例
如下面摘取了迅雷的笔试题目。
题1-51:为什么要使用函数重载?( )
A.为了提高速度
B.为了实现共享C.使用方便,提高可靠性
D.为了节约空间
正确答案: C
【解析】C++函数重载的作用如下。
①多个函数共用一个名字,减少对用户而言的复杂性。
②函数重载是指在同一作用域内,可以有一组具有相同函数名、不同参数列表
的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的
好处。
③类的构造函数跟类名相同,也就是说,构造函数都同名。如果没有函数重载
机制,要想实例化不同的对象,会特别麻烦。
面向对象编程(OOP):对象和类是面向对象编程里最为核心的概念。而面
向对象又具有三大特性:封装、继承、多态,除此之外还有众多的设计模式。
对于类和对象的理解是面向对象编程的核心,需要重点掌握,下面这道题是摘
自迅雷笔试题的题目。
题1-52:子类能够访问的成员属性是public、protected、private中的。
A.protected和private
B.public和protected
C.public和private
D.都能访问
正确答案: B【解析】private只能由该类中的函数或其友元函数访问。
1.1.2 中级要求
STL容器:STL(Standard Template Library,标准模板库)是惠普实验
室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和
David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在
C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码
从广义上讲分为三类:algorithm(算法)、container(容器)和
iterator(迭代器)。几乎所有的代码都采用了模板类和模板函数的方式,这
相比于传统的由函数和类组成的库来说,提供了更好的代码重用机会。
中高级CC++工程师应该了解STL容器、模板、模板类和模板函数等概念,并且
能够熟练使用,这也是技术公司面试的重点之一,例如下面这道迅雷面试的题目。
题1-53:针对下面选项中的几种STL结构,哪一种会在增加成员时可能使得原
有成员的存储位置发生变化?( )
A.list
B.map
C.set
D.vector
正确答案:D
【解析】vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。
vector是一块连续分配的内存,从数据安排的角度来讲,与数组极其相似,不同的
地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而
vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充
自身的容量。
vector的扩充机制是按照容器现在容量的一倍进行增长。vector容器分配的是
一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过
去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作
容器时,迭代器要及时更新。
UnixLinux核心编程:主要涉及UnixLinux内存管理、系统调用、进程
管理、进程通信以及多线程开发等技术。
UnixLinux系统的应用十分广泛,作为一名中高级的CC++开发人员,对于
UnixLinux的核心编程要有充分的了解并且要熟练掌握基础操作,这也是大部分互
联网公司考察的重点,例如下面摘自人人网研发笔试的题目。
题1-54:下列操作中,哪些会导致用户进程从用户态切换到内核态?( )
I.整数除以零
II. sin( )函数调用
III. read系统调用
A.仅I、II
B.仅I、III
C.仅II 、III
D.II和III
正确答案: B
【解析】用户态切换到内核态的三种方式如下。
①系统调用。
②异常。
③外围设备的中断。I是异常,III是系统调用。
下面这道题摘自奇虎360软件测试工程师笔试题。
题1-55:Linux系统下运行程序时,程序中未初始化的全局变量会被加载到以
下哪个内存段中?( )
A.BSS
B.STACK
C.DATA
D.TEXT
正确答案: A
【解析】BSS(Block Started by Symbol)通常是指用来存放程序中未初始化
的全局变量和静态变量的一块内存区域。特点是可读写,在程序执行之前BSS段会自
动清0。所以,未初始化的全局变量在程序执行之前已经为0了。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变
量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segmenttext segment)通常是指用来存放程序执行
代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域
通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也
有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):堆用于存放进程运行中被动态分配的内存段,它的大小并不固
定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被
动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆
中被剔除(堆被缩减)。
栈(stack):栈又称堆栈,用于存放程序中临时创建的局部变量,也就是说,我们在函数括弧{ }中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的
进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进
后出特点,所以栈特别方便用来保存恢复调用现场。从这个意义上讲,我们可以把
堆栈看成一个寄存、交换临时数据的内存区。
题1-56:可以用于线程之间同步的选项有( )。
A.事件
B.临界区
C.互斥量
D.信号量
正确答案: ABCD
【解析】
①进程间的通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件
槽、剪切板、动态数据交换、对象连接与嵌入、动态链接库、远程过程调用等。
②事件、临界区、互斥量、信号量可以实现线程同步。
MySQL:MySQL是一个关系型数据库管理系统,关联数据库将数据保存在不
同的表中,而不是将所有数据放在一个大仓库内,这样就提高了速度并增强了
灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。由于
其体积小、速度快、总体拥有成本低,尤其是开放源码的特点,一般中小型网
站的开发都选择MySQL作为数据库。
MySQL是在互联网应用中十分流行的数据库,无论是CC++还是使用其他语言的
编程人员都会接触,对于数据库的基础操作以及SQL语句都应熟练掌握。下面摘取了
阿里巴巴研发工程师的笔试题。
题1-57:在MySQL主从结构的主数据库中,以下哪种日志不会出现?( )A.中继日志
B.Redo log
C.错误日志
D.事务日志
正确答案: A
【解析】中继日志(relay-log)是MySQL备库从主库bin-log读取的日志。
题1-58:关系数据库中,( )用来表示实体间的联系。
A.树状结构
B.网状结构
C.二维表
D.属性
正确答案: C
【解析】关系模型实体间的敏感词采用二维表来表示,简称表。选项B为网状模
型实体间的敏感词,选项A为层次模型实体间的敏感词,选项D属性刻画了实体。
1.1.3 高级要求
MFC:微软基础类库(英语:Microsoft Foundation Classes,简称
MFC)是一个微软公司提供的类库(class library),以C++类的形式封装了
Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作
量。其中包含了大量的Windows句柄封装类和很多Windows的内建控件和组件的
封装类。
MFC是一个十分庞大而复杂的类库,对于MFC的理解和应用应该是高级C++工程
师所掌握的,例如下面这道摘自奇虎360工程师笔试题的题目。题1-59:MFC通过哪个类将一个界面分成两个部分?( )
A.COlePFrameWnd
B.CMiniFrameWnd
C.CMDIFrameWnd
D.CSplitterWnd
正确答案:D
【解析】CSplitterWnd类提供分离窗口的功能,使一个窗口包含多个方格。
Win32核心编程:Win32是指Microsoft Windows操作系统的32位环境,与Win64都为Windows的常见环境。学习Win32多线程不仅对理解Win32本身有
重要意义,而且对学习和领会其他操作系统也有触类旁通的作用。
对于高级C++工程师来说,Win32核心编程是需要掌握的,也是面试时会考察的
难点,例如下面这道摘自阿里巴巴校招研发试题的题目。
题1-60:32位操作系统中,下列类型占8个字节的为( )。
A.unsigned int
B.short int
C.int C long
D.long long
E.int
F. char
正确答案:D
【解析】可以用sizeof(int)、sizeof(float)等来测试字节数。在32位系统中,short占2字节,int、float、long都占4字节,double和long long占8字
节。
题1-61:给出如下代码:
在32位系统中的输出是( )。
A.0
B.4
C.23
D.24
正确答案:B
【解析】此题的正确答案应该对32位系统是4,对64位系统是8。数组作为函数
的参数是会退化为函数指针的,想想看,数组作为函数参数的时候经常是需要传递
数组大小的。
下面这道题目来自迅雷C++笔试题。
题1-62:编程实现在一亿个数中找最大的1000个数,要求效率高、占用内存
少。函数原型为find max data(int source data,int max data),其中,source data是存放一亿个数的数组,max data用于存放其中最大的1000个数。
【参考答案】题1-63:下面的代码,在32位小端机器上的输出是什么?( )
A.0x201, 0x605, 0x4030201, 0x8070605
B.0x201, 0x605, 0x807060504030201, 0x0C.0x201, 0x403, 0x807060504030201, 0x0
D.0x102, 0x506, 0x102030405060708, 0x0
正确答案:B
【解析】小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构
为小端模式。
pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为
0x0201。
pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进
制为0x05 0x06,对应的16进制数为0x0605。
pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制
形式为0x807060504030201。
pint + 2占用4个字节,指向的array数组的下标为8的元素,而下标为8~11的
元素没有指定数组的初始化值,默认为0,因此(pint + 2)对应的16进制为0。
架构设计:架构设计是一系列相关的抽象模式,用于指导大型软件系统各
个方面的设计。
对于高级软件工程师,架构能力是各大公司招聘时着重考察的点,能够对一个
项目进行有效的架构设计是十分重要的,例如下面摘取了某知名互联网公司的笔试
题目。
题1-64:关于BS架构软件与CS架构,下列选项中错误的是( )。
A.CS可以使用任何通信协议,而BS这个特殊的CS架构规定必须实现HTTP协
议
B.BS属于CS,浏览器只是特殊的客户端
C.CS架构维护和升级方式简单D.CS架构的劣势还有高昂的维护成本且投资大
正确答案:C
【解析】
①BS只能用HTTP协议。
②CS成本高,维护困难。
软件测试:软件测试(Software Testing)是一种用来促进鉴定软件的正
确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与
预期输出间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对
程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求
进行评估的过程。
软件测试对于C++工程师来说是应该掌握的知识点,对于任何项目都需要足够的
测试来保证软件的质量。例如下面摘取了某知名互联网公司的笔试题目。
题1-65:设计系统测试计划需要参考的项目文档有哪些?( )
A.软件测试计划
B.可行性研究报告
C.软件需求规范
D.迭代计划
正确答案:ACD
【解析】软件需求是软件开发之前做好的,软件开发是根据软件需求做的,那
么软件测试自然也需要参考该文件。迭代计划是软件的某个周期的计划,自然也需
要参考。可行性是软件开发前做好,用于证明该计划可行的,没有必要参考。
编程实例题1-66:将1~2(2n+1)2(2n+1)的数填到2n+1阶的数独中,使得每行、每列和
每条对角线上的数字和都相等。
程序代码如下:题1-67:输入三个字符串,请输出三个字符串的最长公共前缀。
程序代码如下:
题1-68:给定一个数组,该数组含有n+1个元素,该数组中的元素值范围为
1~n,请找出数组中的重复元素。
程序代码如下:题1-69:写一个程序,该程序可按标准输出2015年的日历,并且星期和日期是
一一对应的。
程序代码如下:题1-70:在插入排序中,假设序列是给定的,那么最少需要移动的次数是多
少?请编写一个程序来求出这个次数。
程序代码如下:题1-71:输入1000000个无序的自然数(可能重复),输出第一个没有出现的
自然数。
程序代码如下:1.2 专家介绍
李国松
腾讯百度
高级C++工程师
李国松专注于互联网移动互联网方向,拥有八年互联网相关的技术开发和项目
管理经验。
先后在腾讯、百度等知名互联网企业供职,主要从事互联网领域基础服务和产
品的技术研发、运营工作,具有丰富的高并发大容量互联网应用的架构设计和开发
经验。
大学毕业后,接触Windows平台上的嵌入式开发(WinCE)和PC端休闲游戏。之
后工作重心转移,进入腾讯后从事后台开发.2013年转战就职于百度.2015年开始尝
试在物联网平台(IoT)方面创业,现在处于自主创业阶段。
在技术方面,从Windows客户端开发转至Linux后台开发,有过运维、QA团队的
丰富工作经历。开发语言以C++为主,也有过PHP、Python的开发经验,现在使用
Golang较多,目前正在涉猎前端技术和产品设计。
林 飞
搜狗 高级经理
林飞毕业于北京大学,现在搜狗公司担任高级经理。拥有10年的互联网从业经
验,完成了搜狗某部门测试开发团队的搭建与管理,以及各类自动化测试框架和平
台开发,并且面向业界开源了Cynthia缺陷管理系统,免费开放项目协作平台
(www.effevo.com)。
大学毕业后的第一份工作是在事业单位,职责为开发与产品配套的自动化测试
框架。这也对林飞后来选择测试开发的职业道路起到了决定性影响。这一阶段的技
术提升主要集中在代码架构、开发文化以及编程风格等方面。后来,他进入了搜狐研发中心(现搜狗)工作,在搜狗的工作经历使他在技术
的专业性和深度上,以及从系统化思想到实战的演练上有了较大的成长。他先后开
发了几个比较重要的自动化测试框架,使用了C++、VBScript、Python、C、PHP、JavaScript等多种语言和技术。林飞对语言无任何偏向性,认为选择合适的
语言完成应该完成的工作最重要。
所在团队进行结构调整后,开始担任团队负责人,招聘成为工作中非常重要的
一个职责,为此,他研究了多种面试题目,也会在闲暇时间编写各种类型的算法程
序。
刘怀军
美团
高级技术专家
刘怀军毕业于西安交通大学,并且获得了计算机专业和数学专业双学位;之后
于2007年毕业于哈尔滨工业大学信息检索研究室,获得了硕士学位。
其在研究生毕业后就职于腾讯,负责过多个大数据算法项目和团队,其中包
括:知识社区反垃圾反作弊、知识推荐;搜索个性化推荐;搜索查询分析和排序;
微信搜索和语义智能等项目。
2015年他加入美团,担任高级技术专家,负责大数据方向的项目研发和团队管
理。在大数据算法领域有9年的工作经验,发明专利20余项,并且担任中文信息学会
社会媒体处理专委。刘怀军擅长大数据算法、机器学习、数据挖掘、NLP等,在工作
中主要使用C++编程语言。
1.3 专家意见
关于技术招聘
Q:在招聘时,您会看重哪些技术能力?
【搜狗 林飞】对于应届生来说,基本功的扎实与否是一个很重要的衡量因素。这里的基
本功主要指两方面:一是对语言的深刻理解以及熟练应用,譬如了解内存对齐的
机制对类对象大小的影响,多重继承会对代码的可维护性带来哪些影响等;二
是能够灵活应用各种常见的数据结构和算法解决实际项目中遇到的各种难题。
【美团 刘怀军】
作为一名高级编程人员,首先要有能够灵活快速地切换不同语言进行开发
的基础编码能力,而对于编程语言应有着更深刻的理解,例如语言的底层原
理、库函数STL内部原理等,并且对于编程思想应该有着更深层次的掌握,比
如面向对象的编程思想、常用的设计模式原理等。而对于特定的技术岗位,更
要熟练掌握相应的技能,比如数据岗位,需要大数据开发技术,像是Hadoop、Spark等。
【腾讯百度 李国松】
招聘人才时,我们不光要考察基础理论知识的掌握,更看重实践能力。编
码能力的扎实与否至关重要,例如在实际编码中对于错误的编码能否快速修
正,能否对众多的设计模式运用自如等。而在编写算法的过程中,是否拥有一
个清晰明确的思路,以及面对不熟悉、不了解的问题时应如何去应对,这些都
是我们所看重的。
Q:那么我们当前职位所对应的需掌握的技术范畴有哪些呢?
【搜狗 林飞】
对于大部分C++相关的职位来说,C++语言基础、算法、数据结构都是必备
的能力。不同的平台对人才也会有差异化的需求,例如PC端职位会着重考察人
才对Windows消息机制的理解,Windows编程经验是否丰富;测试开发职位会关
注应聘者是否编写过自动化测试框架,该框架的复杂性、架构合理性以及带来
的收益,或者是否具备各类测试框架的使用能力。
【美团 刘怀军】
对于数据岗位,我们需要面试者掌握大数据方向的相关技术,像是数据库、数据仓库、数据挖掘、数据开发技术、系统架构技术等。而对于更高级的
数据方面工程师,我们还会考察其对数据的敏感度,以及数据分析能力(通过
数据,发现业务、项目相关的核心结论及问题)等。
Q:现在公司正急需哪方面的人才呢?需要掌握哪些技术?
【腾讯百度 李国松】
腾讯主要以C++为主,其余部分部门使用Java。而百度以PHP为主,基础架
构部分以C++为主。
对于后台开发部门,主要还是以业务开发及架构设计为主。这需要对面试
者的基础语言掌握能力、编程能力、新技术、新框架的学习吸收能力,以及架
构设计或者对于设计模式的理解等方面有较高的要求。而且目前随着智能手机
的广泛应用,手机APP的普及以及前端技术的快速发展,对于客户端和前端开发
的技术人员需求也越来越大。
Q:公司招聘技术人才的流程是怎样的?主要有哪些形式?
【搜狗】
搜狗主要通过校招和社招来进行人才招聘。
校招时会到全国各大城市搞宣讲会和笔试面试。搜狗的笔试题主要由选择题和
编程题构成。选择题包含C++、Java、Windows、数据结构、Web、测试等各种类
别,每个分类大概有10~12道;编程题通常有两道,绝大部分职位都必做编程题。选
择题方面,不同的职位会选择不同的类别组合,如Windows开发工程师会选择C++、Windows这两类;测试开发工程师会考察C++、数据结构。搜狗公司这几年已开始启
用线上笔试,直接让面试者上机作答。笔试通过后,会根据各地的笔试整体成绩安
排面试官到各城市进行面试,面试通常有2~4轮。
社招除了从公司HR渠道获取简历以外,各用人部门也会在多个招聘网站和论坛
社区里发JD(Job Description)获得更多简历。面试过程中偶尔也会让面试者上机
编程,考察实际动手能力。【腾讯百度】
一般流程是HR收集、初次筛选过简历后,会把简历递交给研发团队,由技术人
员审查合格后通过电话联系候选人,会有一个电话面试,初步了解候选人的技术基
础后,邀请其到公司进行面试。
技术人员的面试一般先由中级工程师进行初面,测试一些基础题目,然后会让
高级工程师面试,了解面试者在算法、架构等方面的掌握程度,然后会由负责管理
的经理或总监进一步面试,进行一些性格和沟通能力上的了解。具体的流程因公司
和部门不同会有差异,每位负责面试的工程师的风格差异也比较大。
【美团】
公司的招聘形式分为社招、校招和实习生招聘。社招主要是对有工作经验的人才进行招聘;校招主要面向在校即将毕业的大学
生进行招聘;而实习生招聘,主要为在校学生提供在企业进行锻炼的机会。
主要流程如下。
(1)简历筛选(通过简历初判是否符合岗位的需求)。
(2)技能面试:技术面试(考察专业能力、工程能力、架构能力),软素质面试
(考察沟通、规划、管理等方面的能力)。
(3)综合面试:考察全局、宏观思考问题的能力。
(4)HR面试:考察文化、价值观的认可度,跳槽意图等。
1.4 QA专访
搜狗 林飞篇
Q:怎样去定义一个好程序员?能够加入搜狗的程序员需要具备什么样的条
件?
首先要有扎实的基本功,这是谈任何其他能力的基础。其次就是要有较强
的学习能力和逻辑思维能力,对于自己不了解的问题,如果能够在他人的引导
和提示下启动思维,举一反三,那么这个人的能力一定是值得肯定的。还有一
点就是抗压能力。目前互联网行业正在飞速发展,新技术、新知识正不断地涌
入技术领域,在这样的大环境下,要能够抵抗住信息的冲击,并且不断地吸收
新的技术为己所用,而不是被压力击垮,这样的人才才能得以任用。Q:找到合适的人才后,如何培养人才才能让具备潜力的人才快速成长?
通常来说,除了人才自身的因素外,环境因素和社交因素也能够影响到人
才的成长。为此,我们实行一些事后看来还算是有些效果的制度,能够较好地
营造积极向上的学习环境。在通过管理手段保证制度实行的过程中,一些员工
逐渐脱颖而出,并促进了其他员工的积极性。其中专家制度、知识库制度、技
术分享制度使得员工能力得到了快速的提升。专家制度促使人才深入了解特定
的知识领域,锻炼一个人思维的系统性和深度;知识库制度是对日常工作中的
一些技术点的总结,是对技术网的细节完善;技术分享制度锻炼的是总结能
力、表达能力和沟通能力,鼓励员工之间不同思考方式的碰撞和交流。
Q:那您在工作中都有哪些印象深刻的经历,之后这些问题都是如何解决的
呢?
在承担平台测试开发任务的过程中,通常面临的考验是短时间内完成比较
复杂的任务。让我印象比较深的是刚来搜狗时的第一个任务。之所以印象比较
深,原因有如下两点:第一点是当时刚从事业单位出来,需要适应快节奏的工
作方式,压力会比较大;第二点是该任务比较复杂,逻辑复杂,技术上也有一
定的难度。这个任务是要开发一个测试搜狗浏览器稳定性的专项工具,该工具
有如下几个基本功能。
(1)解析脚本,转化成对浏览器的各种操作。
(2)持续对搜狗浏览器进行各种操作,例如浏览网页、刷新页面、前进、后退、新建和关闭等。
(3)实时监控浏览器的资源占用情况和崩溃情况,在测试完毕后能够展示
资源占用情况,计算出浏览器崩溃和异常的时间点。
(4)能够回放上一次测试对浏览器的所有操作。
实现该工具时,采用C开发了自动化测试框架,完成用户界面和脚本解
析、记录和显示资源占用等功能,使用C++实现COM服务器和BHO,COM服务器用
于连接测试框架和BHO,BHO在浏览器进程空间负责对浏览器进行各种操作。具
体编程时,还应用到了Hook、线程注入、GDI+、COM套间、多线程同步、XML、资源管理等多种技术,其中,不少技术都是现学现用。另外,工具要对目标程
序进行长时间测试,开发时使用的COM、WinForm都是产生资源泄漏的温床,在
这方面也要花费一定的精力。
后来也同样接受过几个比较复杂且时间比较紧急的任务,大体上都采用了
类似的解决办法,下面分享给大家几条比较通用的技巧。
(1)制定详细的开发计划。最好细分到1天为单位,建议设定几个里程
碑。按照计划进行开发,无论如何都要确保每天完成计划中的任务。
(2)自信心很重要。即使面对复杂的任务,也要相信自己肯定能完成。
(3)一些逻辑复杂的代码可以采用测试驱动的方式来开发。这样,即使对
代码进行了改动,也会心里有底。
Q:在技术团队中,作为高级经理的角色职责是什么?
作为团队负责人,最重要的也是容易忽略的一点,就是要持续思考团队的
发展战略并推进实施。我们团队的发展战略其核心思想是开放与协作。具体实
践如下。
开放工作职责。以公司利益为出发点,以提高团队工作效率为中心,发掘
更多工作内容。从实际结果来看,我们不拘泥于已有的自动化测试职责,扩展
后的工作内容涵盖了自动化、单元测试、框架和平台开发、OA、协助其他团队
开发产品代码、开发公司新产品等多个方面。
尽量使用当前比较流行、确实有价值的技术,也尝试将我们自己的工作成
果分享给业界。两年前我们团队开源了小有名气的缺陷管理系统Cynthia,最
近也推出了免费使用的项目协作平台effevo。
在确定团队发展战略后,需要找到合适的人才来执行。因此,招聘就成了
团队负责人的一个非常重要的职责。每个团队都要定义“合适人才”的标准。
由于工作内容多样化,我们比较看重的是人才的潜力,项目经验反而求其次。
对人才潜力的考察,我们采用了算法题和逻辑题来进行。应试者能独立完成题
目解答最好,如果不能独立完成,则在面试官的提示下能够顺利解决问题也算OK。
作为团队负责人,要持续地在这些重要职责方面进行思考和总结,提升自
己这几个方面的专业素质,保证团队的良性运转和长远发展。
腾讯百度 李国松篇
Q:在工作中您都经历了哪些印象深刻的事情?
我主要从事后台开发和运维相关的工作,所以以开发为例,选取一个例子
与大家分享下一般大公司处理问题的基本思路,事件如下(对当时的问题做了
一些简化,主要介绍一下思路)。
我曾经参与优化一款知名APP的后台收藏功能。当时遇到一个问题,有用户
反馈在收藏夹中收藏失败,需要后台开发同事跟进处理。那么,我们一般是如
何分析和解决类似问题的呢?
首先,我们会先找到收藏功能的编号或API,在日志中使用grep找到所有
该请求失败的日志(系统会保留所有后台应用的日志并备份到一个统一的服务
器或集群中,方便后续开发和运维人员查询并追踪问题),如果客服能联系到
用户,可以直接拿到用户id进行查询,就更加方便了。
然后,我们对比失败的日志和用户反馈的时间节点,进一步检查请求失败
的原因(第一级服务获取请求失败,可能会对应后台多个其他服务)。经分
析,发现请求失败的原因是由于早期开发的版本对用户使用行为的考量不够严
谨,导致服务上线一段时间后出现部分用户有超过5000甚至更多收藏的情况,而超出该阈值后,该用户的收藏列表拉取速度会急剧下降,甚至会经常出现拉
取列表失败的情况。
其实这个问题简单来说就是一个数据量大了之后需要增加缓存的问题,即
使是对于小站而言,都是相对常见的问题,简单地说,解决思路就是增加缓
存。那么是不是我们直接添加一个缓存就可以了呢?大公司一般都是如何来处
理类似问题的呢?
我们需要先确认一下需要缓存的数量(包括单条缓存大小和预计缓存总量),根据缓存的总量和单条数据量来对缓存进行选型(如常见的开源缓存
memcache、redis、mongodb,以及自研缓存等),那么我们需要考查的指标
包括单机缓存的读取写入速度、单机缓存容量及内存利用率、缓存是否支持分
布式部署、是否支持水平扩展、运维难度(运维人员对该系统的熟悉程度,如
是否有大规模大容量运维经验、是否有完备的社区或内部团队支持)等多个考
查维度。
当我们完成缓存的初步选型后,会进行系统改造的详细设计(可能以文档
或邮件形式),组织开发团队的高工进行设计评审,敲定方案。
方案确定后,就可以开始编码了。编码完成后,需要编写单元测试并进行
初步的自测,之后交给测试人员来进行更加系统的测试;测试通过后,就可以
交付运维人员上线了(上线过程也需要考虑如何进行处理负载均衡,以保证服
务在上线过程中一直处于可用状态)。
如果上线正常,后台开发人员一般会在一周内持续观察线上日志的情况,确保线上的功能正常。
Q:对于技术出身的创业者,他们有哪些优势和劣势?
技术出身的创业者,一般逻辑思维能力会比较强,思维也会比较缜密。他
们对于技术方面的重视程度也会较高,对于新技术的接受程度可能也会更高一
些,有利于提高公司整体服务的质量,能够为日后的产品推广做好充足的准
备。
不过技术人员普遍比较内向,不太擅长沟通和推广,这可能会成为企业发
展的短板。另外在创业方向的选择方面,可能会更多地做技术方面的考虑,而
在一定程度上忽视用户的真实需求。
Q:可以成功入职的程序员需要具备什么样的条件?
应该从硬件和软件两个方面来考量。
硬性条件当然是要有过硬的技术基础,头脑灵活,可以独立分析并解决难
度相对较大的问题。如果先前的项目经验与公司现有的项目匹配度较高,会更好。
软性条件主要是指沟通能力、理解能力,以及个人的积极主动性,与公司
的风格是否匹配(所谓公司认同感)等。创业公司甚至会要求应聘者与所有团
队成员见一面,聊聊,以判别能否良好地融入团队。
对于后台开发人员来讲,要求对后台服务系统的整个运作过程有深入的理
解,对影响性能的地方能做到“一切尽在掌握”,如计算机的各个部分是如何
协作完成的,哪些地方会是瓶颈,预计能达到什么样的负载水平,了解各个组
件的性能。对于自己日常工作负责的服务,要求在系统架构设计阶段就能够根
据系统架构和硬件性能大致预测出系统的负载能力。
在日常工作中,要求能够根据遇到的问题,主动思考本部门的运营机制,理解服务需要达到的可用性要求。在进行技术选型时,能与相关同事积极沟
通,并具备及时重构的能力。
Q:怎么培养一个年轻的程序员呢?
对于计算机相关专业的同学,上课听讲,把操作系统、编译原理、计算机
网络、计算机体系结构等重要的基础课程学好,会对日后进入公司并开展工作
有很大的帮助。
对于非计算机相关专业或毕业后想转行做程序员的同学,建议从实际项目
开始学习,先了解基本操作和使用方法,之后有时间的话,努力学习计算机原
理知识会有很大的帮助。多向公司老员工请教,多看公司先前的项目代码,在
实际项目中学习。
对年轻人来讲,主要还是看个人的资质、工作目标、理想、态度,而技术
方向则是相对次要的。
美团 刘怀军篇
Q:怎么才可以加入美团?
能够成功入职的程序员,需要具备几项条件。(1)专业技能过硬。对于程序员,必须具备开发技能,精通相应岗位的开
发语言,如C++Java等。此外,还须有岗位需要的专业技能,比如大数据算法
岗位,需要精通各项算法,精通大数据并行开发。
(2)软素质优异。做事要主动积极,沟通要顺畅,更要团结协作。
(3)高度认可公司文化和价值观。
(4)未来有很好的成长潜力。自己对未来有好的成长规划,并付诸实施。
Q:怎么培养一个年轻程序员比较好呢?
对于一个程序员的培养,分为两方面:企业培养、自我培养。
(1)企业培养:人才是企业最重要的资源。每个企业都会投入大量的人
力、财力进行人才培养。对于程序员岗位,企业的培养分为如下几个方面。
①培训体系。公司内会有完善的培养制度,从内部专家到外部聘请,开展
各个方向的技术培训课程。
②导师制。对于新入职的员工,不论校招还是社招,都会由经验丰富的导
师带领和指导。
③培养计划。Leader和导师定期会跟员工制定成长计划,并监督执行,回
顾执行效果,进一步完善和改进。
(2)自我培养:个人的成长主要靠自我培养。俗话说:师傅领进门,修行
在个人。首先,个人要有明确的兴趣和未来规划,并主动学习相关技能。其
次,一定要通过多做项目,做深项目,反复思考和总结,来提升个人能力。另
外,一定要多向大牛请教和学习,站在巨人的肩膀上才能看得更远。
Q:您怎么看程序员这个行业?对年轻程序员有哪些建议?
程序员是互联网大潮中一支浩浩荡荡的队伍,支撑着整个互联网行业的高
速发展。这是一个十分辛苦的行业,但也是一个幸福的行业。辛苦之处在于加
班比较多,私生活比较少。幸福之处在于,你们是互联网的花朵,是互联网的希望和未来。选择程序员这个行业,未来就在你自己手上,可以充分发挥自己
的聪明才智,成就一番事业。
作为一个老程序员,对年轻程序员们,有几个衷心的建议。
(1)不要怕苦怕累,要趁着年轻,多做项目,锻炼自己的能力。
(2)一定要不断学习。对技术的执着追求,是一个程序员的基本素养。一
定要不断学习新技术,通过各种有效方法进行学习,不断追赶行业发展的潮
流。
(3)形成个人能力矩阵。技术这个领域其实是需要向深度和广度全面发展
的。深度是指自己有专长的技术和技能,要有深入的理论和实战积累,才能形
成自己的方法论。另一个是广度,对上下游的其他技能岗位,也需要熟悉和掌
握基本能力,这样才能很好地实现跨团队协作。
(4)培养自己的职业素养。企业以利润为目标,每个职员都要将企业目标
作为个人工作目标,保持最好的状态,完成上级给予的任务。
第2章 Java
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了
C++里难以理解的多继承、指针等概念,因此,Java语言具有功能强大和简单易用
两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理
论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植
性、多线程、动态性等特点。使用Java语言,可以编写桌面应用程序、Web应用程
序、分布式系统和嵌入式系统应用程序等。
2.1 Java工程师标准
2.1.1 初级要求Java基础:包括Java编程基础及规范、面向对象的特性(继承、封装、多
态等)、核心API等。
作为一名合格的Java工程师,对于Java的基础知识是一定要牢牢掌握的,大部
分互联网公司都会考察基础知识中一些易被忽略的知识点。下面这道题摘自腾讯春
招的题目。
题2-1:下列说法错误的有( )。
A.在类方法中绝对不能调用实例方法
B.在类方法中可用this来调用本类的类方法
C.在类方法中只能调用本类中的类方法
D.在类方法中调用本类的类方法时可直接调用
正确答案:A B C
【解析】
A:可以在类方法中生成实例对象再调用实例方法。B:类方法是指类中被
static修饰的方法,无this指针。C:类方法是可以调用其他类的static方法的。
题2-2:下面这道题摘自腾讯Java工程师笔试卷。
下列语句中正确的是( )。
A.Java程序经编译后会产生DLL
B.Java程序经编译后会产生machine code
C.Java程序经编译后会产生byte code
D.以上都不正确
正确答案:C【解析】
Java字节码是Java源文件编译产生的中间文件,Java虚拟机是可运行Java字节
码的假想计算机,Java的跨平台性也是相对于其他编程语言而言的。Java的编译过
程是,先是编写好Java源程序,即扩展名为Java的文件,然后由Java编译程序将源
程序编译为Java字节码文件,就是class文件,然后在Java虚拟机中执行。机器码
是由CPU来执行的。Java编译后是字节码,电脑只能运行机器码。Java在运行的时
候把字节码变成机器码。
题2-3:下面这道题摘自腾讯Java工程师笔试卷。
Java是从( )语言改进并重新设计的。
A.Pascal
B.C++
C.BASIC
D.Ada
正确答案:B
【解析】Java是类C语言,从C++改进而来,去掉了指针和多继承,采用自动垃
圾回收等。
题2-4:有关Java final的基本规则,下列描述中错误的是( )。
A.final修饰的局部变量即为常量,只能赋值一次
B.final修饰的成员变量只允许赋值一次,且只能在类方法中赋值
C.final修饰的方法不允许被子类覆盖
D.final修饰的类不能被继承
正确答案:B【解析】final修饰的方法,不允许被子类覆盖。final修饰的类,不能被继
承。final修饰的变量,不能改变值。final修饰的引用类型,不能再指向别的东
西,但可以改变其中的内容。
题2-5:关于Java抽象类的说法中,哪个是正确的?( )
A.某个抽象类的父类是抽象类,则这个子类必须重载父类的所有抽象方法
B.可以用抽象类直接去实例化创建对象
C.接口和抽象类是同一回事
D.一个类只能继承一个抽象类
正确答案:D
【解析】
A:非抽象类继承抽象类,必须将抽象类中的方法重写,否则需将方法再次声明
为抽象。所以这个方法还可再次声明为抽象,而不用重写。而用重载也错了,重载
是在同一个类中,重写、覆盖才是在父子类中。
B:抽象类无法实例化,无法创建对象。现实生活中也有抽象类的例子,比如说
人类是一个抽象类,无法创建一个叫人类的对象,人继承人类来创建对象。况且抽
象类中的抽象方法只有声明,没有主体,如果实例化了,又如何去实现调用呢?
C:抽象类可以没有抽象方法,接口是完全的抽象,只能出现抽象方法。
D:因为类是单继承的,类继承了一个抽象类以后,就不能再继承其他类了。
题2-6:执行test函数后,屏幕显示的结果为?( )A.127 127
B.128 127
C.129 128
D.以上都不对
正确答案:D
【解析】 public void add(Byte b){ b=b++; }这里涉及Java的自动装包
自动拆包(AutoBoxing UnBoxing)。 Byte的首字母为大写,是类,看似是引用
传递,但是在add函数内实现++操作,会自动拆包成byte值传递类型,所以add函数
还是不能实现自增功能。也就是说add函数只是个摆设,没有任何作用。 Byte类型
值大小为128~127之间。对于add(++a);这里++a会越界,a的值变为-128。对于
add(b);前面说了,add不起任何作用,b还是127。
题2-7:关于以下程序代码的说明,正确的是( )。A.5行不能通过编译,因为引用了私有静态变量
B.10行不能通过编译,因为x是私有静态变量
C.程序通过编译,输出结果为:x=103
D.程序通过编译,输出结果为:x=102
正确答案:D
【解析】不写在方法里面的变量叫作成员变量,也叫全局变量。定义了成员变
量后,在同一个类里的每个方法都可以使用,而不局限在单个方法里,而这里的成
员变量是用static修饰的,所以它是一个类变量,类变量资源共享,所以在第一次
实例化后,x+1后x=101,第二次实例化hs2.x++就是101+1=102,之后的hs1又实
例化一次,做++操作x=103,最后做--操作,最终结果为102。
题2-8:以下选项中,循环结构合法的是( )。
A.B.
C.
D.
正确答案:C
【解析】
A中i没有初始化。
B是死循环,j为非零,while循环的条件一直满足,就会一直循环下去。
D中当j增加到3的时候就执行continue loop,而代码中没有标明loop标志。
题2-9:类Test1、Test2定义如下:
将以下哪种方法插入行6是不合法的?( )A.float aMethod(float a,float b){ }
B.public int aMethod(int a,int b)throws Exception{ }
C.public float aMethod(float p,float q){ }
D.public int aMethod(int a,int b)throws IOException{ }
正确答案:A
【解析】子类重写了父类的方法。父类中定义的方法为public。也就是说,子
类重写这个方法的时候必须也为public。当子类重写父类的方法时,访问权限不能
变小,但可以变大。例如父类的方法为default的时候,子类重写后为public则是
正确的。
题2-10:关于以下程序段,正确的说法是( )。
A.行4与行6都将执行
B.行4执行,行6不执行
C.行6执行,行4不执行
D.行4、行6都不执行
正确答案:C
【解析】String重写了Object的equals方法,重写的这个方法就是比较字符
串的内容。而==比较的是内存地址,对于字符串来说,都要用equals来比较,因为
比较一个String的地址是否相同没有意义。s2是新创建的对象,与s1的内存地址是
不同的,因此执行行6。题2-11:以下哪个关键字可以用来为对象加互斥锁?( )
A.transient
B.static
C.serialize
D.synchronized
正确答案:D
【解析】synchronized是Java语言的关键字,当它用来修饰一个方法或者一个
代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。①当两个并
发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个
时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块
以后才能执行该代码块。②然而,当一个线程访问object的一个
synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非
synchronized(this)同步代码块。③尤其关键的是,当一个线程访问object的一
个synchronized(this)同步代码块时,其他线程对object中所有其他
synchronized(this)同步代码块的访问将被阻塞。④上个例子同样适用其他同步
代码块,也就是说,当一个线程访问object的一个synchronized(this)同步代码
块时,它就获得了这个object的对象锁,结果,其他线程对该object对象所有同步
代码部分的访问都被暂时阻塞。⑤以上规则对其他对象锁同样适用。
题2-12:以下关于构造函数的描述错误的是( )。
A.构造函数的返回类型只能是void型
B.构造函数是类的一种特殊函数,它的方法名必须与类名相同
C.构造函数的主要作用是完成对类的对象的初始化工作
D.一般在创建新对象时,系统会自动调用构造函数
正确答案:A【解析】构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没
有返回值,也不能用void来修饰。
题2-13:下列哪些语句关于Java内存回收的说明是正确的?( )
A.程序员必须创建一个线程来释放内存
B.内存回收程序负责释放无用内存
C.内存回收程序允许程序员直接释放内存
D.内存回收程序可以在指定的时间释放内存对象
正确答案:B
【解析】
A:程序员不需要创建线程来释放内存。
C:不允许程序员直接释放内存。
D:不一定在什么时刻执行垃圾回收。
题2-14:若需要定义一个类域或类方法,应使用哪种修饰符?( )
A.static
B.package
C.private
D.public
正确答案:A
【解析】类域即静态成员,类方法即静态方法。
题2-15:有以下程序片段,下列哪个选项不能插入到行1?( )A.import java.awt.;
B.package mypackage;
C.class OtherClass{ }
D.public class MyClass{ }
正确答案:D
【解析】public修饰的类名必须与Java文件名一致,所以一个.java文件中不
能出现两个或两个以上的公有类。
题2-16:以下哪项是接口的正确定义?( )
A.
B.
C.D.
正确答案:D
【解析】接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口
体由常量定义和方法定义两部分组成。修饰符可选,用于指定接口的访问权限,可
选值为public。如果省略则使用默认的访问权限。接口名为必选项,用于指定接口
的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends父接口名列表:可选项,用于指定要定义的接口继承于哪个父接口。当使
用extends关键字时,父接口名为必选参数。方法:接口中的方法只有定义而没有
被实现。
题2-17:下面哪个函数是public void aMethod{ ... }的重载函数?
A.void aMethod( ){...}
B.public int aMethod{...}
C.public void aMethod ( ){...}
D.public int aMethod ( int m){...}
正确答案:D
【解析】重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称
相同而参数形式不同。重载的规则如下。
①在使用重载时只能通过相同的方法名、不同的参数形式来实现。不同的参数
形式可以是不同的参数类型、不同的参数个数、不同的参数顺序(参数类型必须不
一样)。②不能通过访问权限、返回类型、抛出的异常进行重载。
③方法的异常类型和数目不会对重载造成影响。
题2-18:A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明:
以下哪个说法是正确的?( )
A.只有第1行能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行、第2行和第3行的声明都是正确的
正确答案:D
【解析】子类继承父类的所有属性和方法,B为A的子类,用A可以实例化B;C为
B的子类,用B可以实例化C;间接地,C也是A的子类,故有A a2 = new C( );。
题2-19:有如下代码段:
其中,方法unsafe将抛出IOException,可将以下哪项填入第1行?( )
A.public IOException methodName
B.public void methodName
C.public void methodName throw IOExceptionD.public void methodName throws IOException
正确答案:D
【解析】为了明确指出一个方法不捕获某类异常,而让调用该方法的其他方法
捕获该异常,可以在定义方法的时候,使用throws可选项,用以抛出该类异常。
语法格式:
题2-20:Java的字符类型采用的是Unicode编码方案,每个Unicode码占用个比特位。
A.8
B.16
C.32
D.64
正确答案:B
【解析】一个Unicode字符占两字节,一字节是8位,所以,每个Unicode码占
用16个比特位。
题2-21:给出下面的代码,关于该程序,以下哪个说法是正确的?( )
A.编译时将产生错误B.编译时正确,运行时将产生错误
C.输出零
D.输出空
正确答案:C
【解析】int类型的数组在没有初始化时默认值为0。
题2-22:在使用interface声明一个接口时,只可以使用( )修饰符来修饰该
接口。
A.private
B.protected
C.private protected
D.public
正确答案:D
【解析】接口是为了让别的类去实现,因此不能使用private和protected。
题2-23:编译并运行以下程序,以下描述哪个选项是正确的?( )
A.编译通过,运行无异常
B.编译通过,但运行时出错
C.行2出错,不能成功编译D.不能成功编译,行3出错
正确答案:D
【解析】Object类没有equals( )方法,只有equals(Object obj)方法。
题2-24:有语句String s = hello world; ,以下操作哪个是不合法的?
( )
A.int i = s.length;
B.s>>>=3;
C.String ts = s.trim;
D.String t = s+!;
正确答案:B
【解析】String不能按位运算。
题2-25:下列关于Java语言的特点,描述错误的是( )。
A.Java是跨平台的编程语言
B.Java支持分布式计算
C.Java是面向过程的编程语言
D.Java支持多线程
正确答案:C
【解析】Java是面向对象的编程语言。
题2-26:下述概念中不属于面向对象方法的是( )。
A.对象、消息B.继承、多态
C.类、封装
D.过程调用
正确答案:D
【解析】对象、消息、继承、多态、类、封装都是面向对象方法中的概念。过
程调用属于面向过程方法,通过调用函数来实现。
题2-27:结构化程序设计所规定的三种基本控制结构是( )。
A.输入、处理、输出
B.树形、网形、环形
C.顺序、选择、循环
D.主程序、子程序、函数
正确答案:C
【解析】结构化程序设计所规定的三种基本控制结构是顺序结构、选择结构
(分支结构)、循环结构。
题2-28:下面的程序中类ClassDemo定义了一个静态变量sum,分析程序的输出
结果( )。A.0
B.6
C.11
D.2
正确答案:C
【解析】sum是静态变量,是属于类的。虽然生成了两个对象,其实都是对一个
变量进行操作。在操作的过程中,加了两次5,所以等于11。
题2-29:下面这些类型的应用,哪个不使用Java语言来编写?( )
A.JavaScript
B.Applet
C.Servlet
D.Java Swing
正确答案:A
【解析】JavaScript是Netscape公司的产品,是为了扩展Netscape
Navigator功能而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言,它的前身是Live Script。一般认为,当时Netscape之所以将LiveScript命
名为 JavaScript,是因为Java是当时最流行的编程语言,带有“Java”的名字有
助于这门新生语言的传播。
题2-30:声明成员变量时,如果不使用任何访问控制符(public、protected、private),则以下哪种类型的类不能对该成员进行直接访问?( )
A.同一类
B.同一包中的子类
C.同一包中的非子类
D.不同包中的子类
正确答案:D
【解析】默认访问控制符:如果一个类没有访问控制符,说明它具有默认的访
问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又
称为包访问性。
题2-31:下面哪个流类属于面向字符的输入流?( )
A.BufferedWriter
B.FileInputStream
C.ObjectInputStream
D.InputStreamReader
正确答案:D
【解析】InputStreamReader是字节流通向字符流的桥梁:它使用指定的
charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给
定,或者可以接受平台默认的字符集。字符流的源或目标通常是文本文件。题2-32:下面关于数组声明和初始化的语句哪个有语法错误?( )
A.int a1[ ] = {3,4,5};
B.String a2[ ] = {string1,string1,string1};
C.String a3[ ] = new String(3);
D.int[ ][ ] a4 = new int[3][3];
正确答案:C
【解析】应为String a3[ ] = new String[3];。
题2-33:下面的方法,当输入为2的时候返回值是多少?( )
A.0
B.2
C.4
D.10
正确答案:D
【解析】由于case中没有break语句,因此程序继续向下执行。在执行case 2后,result的值为4,继续执行case 3后,result的值为10。
题2-34:下列描述中正确的一项是( )。
A.标识符首字符的后面可以跟数字
B.标识符不区分大小写
C.复合数据类型变量包括布尔型、字符型、浮点型
D.数组属于基本数据类型
正确答案:A
【解析】Java语言的标识符是以字母、下划线(__)和符号为首字符的字符
串,在首字符后面可以跟字母、下划线、和数字,且标识符是区分大小写的,标识
符的字符数没有限制,所以A选项是正确的。B选项是错误的。选项C错误,复合数据
类型应该包括数组、类和接口。数组属于复合数据类型,故D选项是错误的。
题2-35:下列哪一项不属于变量的组成部分?( )
A.变量名
B.变量属性
C.变量初值
D.变量大小
正确答案:D
【解析】选项A、B和C均属于变量的组成部分;选项D不是,因为Java的数据类
型长度都固定,变量的大小并不是组成变量的一部分,而应该是变量的类型,有了
变量的类型,变量的大小就能确定了。
题2-36:下列选项中,哪一项不属于Java语言的简单数据类型?( )A.整数型
B.数组
C.字符型
D.浮点型
正确答案:B
【解析】Java简单数据类型有float、double、byte、short、int、long、char、boolean。
题2-37:下列关于变量作用域的描述中,不正确的一项是( )。
A.变量属性是用来描述变量作用域的
B.局部变量作用域只能是它所在方法的代码段
C.类变量能在类的方法中声明
D.类变量的作用域是整个类
正确答案:C
【解析】类变量在类中声明,作用域是整个类,它不能在类的方法中声明。局
部变量在类的方法中声明,作用域只能是它所在的方法中。
题2-38:下列关于char类型的数据说法中,正确的一项是( )。
A.'\r'表示换行符
B.'\n'表示回车符
C.char类型在内存中占16位
D.凡是在Unicode中的字符都可以用单引号括起来作为char类型常量正确答案:C
【解析】'\r'表示回车符,'\n'表示换行符。不是所有的Unicode字符都可以
直接用作char类型常量的,比如选项A、B中的字符,需要用反斜杠做转义才可以。
题2-39:下列关于Java语言简单数据类型的说法中,哪个是正确的?( )
A.以0开头的整数代表八进制常量
B.以0x或者0X开头的整数代表八进制整型常量
C.boolean类型的数据作为类成员变量的时候,系统默认值初始为true
D.double类型的数据占计算机存储的32位
正确答案:A
【解析】选项B中,以0x或者0X开头的整数应该是16进制的整型常量;选项C
中,对于boolean类型的数据,作为类成员变量的时候,系统默认的初始值应该是
false;选项D中,double类型的数据应该占用64位的存储空间;选项A正确。
题2-40:下列不可作为Java语言修饰符的是( )。
A.a1
B.1
C._1
D.11
正确答案:D
【解析】Java命名规则是由数字、字母、下划线、组成,但是只能以字母、下
划线、开头,约定俗成的是首字母小写,后面的首字母大写,即采用驼峰标识,尽
量做到见名知意。题2-41:有一段Java应用程序,它的主类名是a1,那么保存它的源文件名可以
是( )。
A.a1.java
B.a1.class
C.a1
D.都对
正确答案:A
【解析】Java是plain text文件,是可以人工编辑的文件。.class是编译后
产生的字节码文件,这是JVM(Java虚拟机)解释执行的文件。
题2-42:整型数据类型中,需要内存空间最少的是( )。
A.short
B.long
C.int
D.byte
正确答案:D
【解析】
byte:8位,最大存储数据量是255,存放的数据范围是-128~127。
short:16位,最大数据存储量是65536,数据范围是-32768~32767。
int:32位,最大数据存储容量是232
-1,数据范围是-231
~231
-1。
long:64位,最大数据存储容量是264
-1,数据范围为-263
~263
-1。题2-43:有以下方法的定义,请选择该方法的返回类型( )。
A.byte
B.short
C.int
D.double
正确答案:D
【解析】short型除以double型,会强制类型转换成double型。
题2-44:在调用方法时,若要使方法改变实参的值,可以( )。
A.用基本数据类型作为参数
B.用对象作为参数
C.A和B都对
D.A和B都不对
正确答案:B
【解析】在调用函数时,会给参数赋一个临时名称,用于函数内部,这个名称
(参数名)叫作形参,而实际传入方法的参数,叫实参。实参的作用域在方法外,形参的作用域在方法内。基本类型和对象在参数传递的过程中,有不同的形式。
对于基本类型,传递的时候,将实参值复制,方法内获得的形参与实参没有关
系,只是值相同,称为值传递,在方法中修改形参不影响实参。
对于对象,传递的时候,将实参引用复制,形参与实参引用相同,指向的是同一个对象,称为引用传递,在方法中修改形参会影响实参。
题2-45:Java语言具有许多优点和特点,哪个反映了Java程序并行机制的特
点?( )
A.安全性
B.多线程
C.跨平台
D.可移植
正确答案:B
【解析】安全性是指Java执行多层安全机制,以提供足够的安全保障的特点;
跨平台和可移植是指Java一次编写到处运行;多线程反映了Java程序可同时执行多
个任务的并行机制特点。
题2-46:Character流与Byte流的区别是( )。
A.每次读入的字节数不同
B.前者带有缓冲,后者没有
C.前者是字符读写,后者是字节读写
D.二者没有区别,可以互换使用
正确答案:C
【解析】字节流是最基本的,所有的InputStream和OutputStream的子类都
是,主要用于处理二进制数据,它是按字节来处理的。但实际中很多的数据是文
本,又提出了字符流的概念,它是按虚拟机的encode来处理的,也就是要进行字符
集的转化。
题2-47:在Java中,由Java编译器自动导入而无须在程序中用import导入的包是( )。
A.java.Applet
B.java.awt
C.java.Util
D.java.lang
正确答案:D
【解析】本题考查Java中包的概念。Java中用import语句来导入包,但须注意
的是, Java语言中的java.lang包是由编译器直接自动导入的,因此,编程中使用
该包中的类时,可省去import导入。而使用其他包中的类时,则必须用import导
入,选项D为正确答案。
题2-48:下列关于构造方法的叙述中,错误的是( )。
A.Java语言规定构造方法名与类名必须相同
B.Java语言规定构造方法没有返回值,但不用void声明
C.Java语言规定构造方法不可以重载
D.Java语言规定构造方法只能通过new自动调用
正确答案:C
【解析】构造方法可以重载,但不可以重写。
题2-49:下列哪个类的声明是正确的?( )
A.abstract final class HI{ }
B.abstract private move( ){ }
C.protected private number;D.public abstract class Car{ }
正确答案:D
【解析】类声明格式为[public][abstract][final]class className
[extends superclassName] [implements interfaceNameList]{...类
体...},而abstract和final不能共存,因为abstract是要被继承的,而被final
修饰的类不可被继承。
题2-50:关于被私有访问控制符private修饰的成员变量,以下说法正确的是
( )。
A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中
的该类的子类
B.可以被两种类访问和引用:该类本身、该类的所有子类
C.只能被该类自身所访问和修改
D.只能被同一个包中的类访问
正确答案:C
【解析】对于private修饰的成员变量来说,只允许同一个类访问和修改,同
一个包、不同包中的子类、不同包中的非子类都是不允许访问和修改的。
题2-51:阅读以下代码:
输出结果应该是( )。A.代码得到编译,并输出“s=”
B.代码得到编译,并输出“s=null”
C.由于String s没有初始化,代码不能编译通过
D.代码得到编译,但捕获到NullPointException异常
正确答案:C
【解析】Java中所有定义的基本类型或对象都必须初始化才能输出值。
题2-52:编译运行以下程序后,关于输出结果的说明正确的是( )。
A.输出结果为:value is 99.9
B.输出结果为:value is 9
C.输出结果为:value is 9.0
D.编译错误
正确答案:C
【解析】99.9是浮点型,9是整型,在9和99.9做运算时,自动转化为浮点型,因此输出结果为9.0。
题2-53:执行完代码int [ ] x = new int[10];后,以下哪项说明是正确
的?( )
A.x[9]为0B.x[9]未定义
C.x[10]为0
D.x[0]为空
正确答案:A
【解析】int类型的数组未初始化时默认值为0。大小为10的数组范围为
x[0]~x[9]。
题2-54:以下程序的运行结果是( )。
A.2 2 2
B.2 3 3
C.2 2 3
D.3 4 4
正确答案:C
【解析】c初始化的值为2,第二个输出中执行了自增操作,然而顺序为先输
出,再自增。此时c的值变为3,因此输出结果依次为2 2 3。
题2-55:下列哪一个关键字用于实现从接口来定义类?( )
A.extendsB.implements
C.abstract
D.interface
正确答案:B
【解析】implements是一个类实现一个接口用的关键字。
题2-56:若a的值为3时,下列程序段被执行后,c的值是多少?( )
A.1
B.2
C.3
D.4
正确答案:C
【解析】a的值为3,符合a>0的情况,进入第二层判断;而a不大于3,执行
else操作,c的值为3。
题2-57:下面哪一个操作符的优先级最高?( )
A.
B.||
C.!
D.正确答案:D
【解析】指针最优,单目运算优于双目运算,如正负号。先乘除(模),后加
减。先算术运算,后移位运算,最后位运算。逻辑运算最后计算。A、B、C都属于逻
辑运算,D选项优先级最高。
题2-58:下列方法头中,哪一个不与其他方法形成重载(overload)关系?
A.void mmm
B.void mmm(int i)
C.void mmm(String s)
D.int mm
正确答案:D
【解析】重载要求方法名相同。
题2-59:编译Java程序的命令是( )。
A.appletviewer
B.javac
C.java
D.javadoc
正确答案:B
【解析】javac是Java语言程序的编译器。javac工具读由Java语言编写的类
和接口的定义,将它们编译成字节码的class文件。javac可以隐式编译一些未在命
令行中提及的源文件。题2-60:编译Java源程序文件将产生相应的字节码文件,这些字节码文件的扩
展名为( )。
A..byte
B..class
C..html
D..exe
正确答案:B
【解析】Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件
在不同的操作系统中运行时,操作系统再将字节码文件编译成机器码文件。这就是
Java跨平台。
题2-61:执行语句int i = 1,j = ++i;后i与j的值分别为( )。
A.1与1
B.2与1
C.1与2
D.2与2
正确答案:D
【解析】++i是先计算i的值,然后再使用这个值,而i++是先使用i,然后再计
算i++。这里是先++i得到i=2,然后将2赋给j,所以i和j都是2。
题2-62:下面哪一个循环会导致死循环?( )
A.for (int k = 0; k < 0; k++)
B.for (int k = 10; k > 0; k--)C.for (int k = 0; k < 10; k--)
D.for (int k = 0; k > 0; k++)
正确答案:C
【解析】C中k的初始值为0,k不断做自减操作,永远满足k<10的循环条件,因
此会造成死循环。
题2-63:有如下程序段:
则表达式a == b与s2 == s1的结果分别是( )。
A.true与true
B.false与true
C.true与false
D.false与false正确答案:A
【解析】==是比较操作符,它的主要作用是比较两个对象之间是否为同一个,也就是说比较操作符两端的对象在内存中是否为同一个地址。s2与s1指向的是同一
个对象,因此在进行==比较时,a与b、s1与s2分别指向相同的地址,所以比较结果
为true。
题2-64:在Java中用什么关键字修饰的方法可以直接通过类名来调用?( )
A.static
B.final
C.privateD.void
正确答案:A
【解析】静态方法是使用公共内存空间的,就是说,所有对象都可以直接引
用,不需要创建对象再使用该方法。
题2-65:若在某一个类定义中定义有如下的方法:abstract void
performDial( );则该方法属于( )。
A.接口方法
B.最终方法
C.抽象方法
D.空方法
正确答案:C
【解析】abstract修饰符可以用于类、方法、属性、事件和索引指示器
(indexer),表示其为抽象成员,抽象方法是没有方法体的方法。
题2-66:有如下程序段:
则执行完该程序段后,total的值为( )。
A.0
B.1
C.3D.6
正确答案:A
【解析】break是结束整个循环体,continue是结束单次循环。
题2-67:System.out.println(5 + 2);的输出结果应该是( )。
A.52
B.7
C.2
D.5
正确答案:A
【解析】任何与字符串进行“+”运算的结果都相当于字符串的连接。
题2-68:为AB类的一个无形式参数、无返回值的方法method书写方法头,使得
使用类名AB作为前缀就可以调用它,该方法头的形式为( )。
A.static void method( )
B.public void method( )
C.final void method( )
D.abstract void method( )
正确答案:A
【解析】静态方法是使用公共内存空间的,就是说,所有对象都可以直接引
用,不需要创建对象再使用该方法。
题2-69:欲构造ArrayList类的一个实例,此类继承List接口,下列哪个方法
正确?( )A.ArrayList myList = new Object;
B.List myList = new ArrayList;
C.ArrayList myList = new List;
D.List myList = new List;
正确答案:B
【解析】ArrayList继承了List,而List是一个接口,不能实例化。
题2-70:指出正确的表达式( )。
A.byte = 128;
B.Boolean = null;
C.long l = 0xfffL;
D.double = 0.9239d;
正确答案:C
【解析】A只有变量类型没有变量名,并且把int的128转byte需要显式强制转
换,应改为:byte b = (byte)128;。B只有变量类型没有变量名,应改为:
Boolean bo = null;。D同样没有变量名,应改为:double d = 0.9239d;。
题2-71:指出下列程序运行的结果( )。A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
正确答案:B
【解析】Java是传值,不是传引用。str=test ok只是修改的局部变量
str,不是类的成员变量。类的成员变量并没有被修改。char是原始类型,也就是
本身不是对象,是直接放在栈里的,也就是说,传递的就是本身的地址。所以结果
里是被修改的。
题2-72:运行下列程序,会产生什么结果?( )A.第1行会产生编译错误
B.第6行会产生编译错误
C.第6行会产生运行错误
D.程序会运行和启动
正确答案:D
【解析】方法start用来启动一个线程,方法run称为线程体,它包含了要
执行的这个线程的内容,程序运行结果为输出“this is run”。
题2-73:Java编程所必需的默认引用包为( )。
A.java.sys包
B.java.lang包
C.java.util包
D.以上都不是
正确答案:B
【解析】Java编程必需的默认引用包为java.lang包。
题2-74:下面哪一个是合法的数组声明和构造语句?( )
A.int[ ] ages = [100];
B.int ages = new int[100];
C.int[ ] ages = new int[100];
D.int( ) ages = new int(100);
正确答案:C【解析】定义数组的同时给出长度,初始化为默认值(由元素数据类型决
定)。
格式:
type[ ]变量名=new type[数组长度]
等价于:
type变量名[ ] = new type[数组长度]
题2-75:下面说法不正确的是( )。
A.一个子类的对象可以接收父类对象能接收的消息
B.当子类对象和父类对象能接收同样的消息时,它们针对消息产生的行为可能
不同
C.父类比它的子类的方法更多
D.子类在构造函数中可以使用super( )来调用父类的构造函数
正确答案:C
【解析】继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性
和行为,并能扩展新的能力。因此子类的方法不少于父类。
题2-76:对于下面的代码段,哪行将引起一个编译时错误?( )A.行1
B.行4
C.行6
D.行9
正确答案:D
【解析】构造方法Test中需要参数,行9中,实例化t1时没有传递参数。
题2-77:在JDK目录中,Java程序运行环境的根目录是( )。
A.bin
B.demo
C.lib
D.jre
正确答案:D
【解析】本题考查JDK目录结构。JDK包含如下目录。
①bin目录,包含编译器、解释器和许多工具。②demo目录,包含各种演示例子。
③include目录,包含Win子目录,都是本地方法文件。
④jre目录,是Java程序运行环境的根目录。
⑤lib目录,包含Java库文件。
经过上述分析可知,本题的正确答案是选项D。
题2-78:Java语言中所有的简单数据类型都被包含在( )中。
A.java.sql
B.java.awt
C.java.lang
D.java.math
正确答案:C
【解析】Java语言中,所有的简单数据类型都被包含在java.lang包中。
题2-79:在Java Applet程序中,当需要对发生的事件做出响应和处理的时
候,应该使用下面的( )语句。
A.import java.awt.event.;
B.import java.io.;
C.import java.awt.;
D.import java.applet.;
正确答案:A
【解析】本题考查对Java常用的各种包所包含的一些类的基本功能的理解.java.awt包是抽象窗口工具包,里面包括各种容器、组件、窗口布局管理器以
及一些常用的类(如Color、Font等),选项C满足题意。而java.applet包里面包
括了小程序执行时必须重载的一个类Applet,也就只有这一个类,所以选项D错
误.java.io包主要是提供一些输入输出类的,选项B不满足题意。
java.awt.event包就包含了一些能够对事件做出响应和处理的标准类。选项C不满
足题意。
题2-80:下列叙述中,错误的是( )。
A.Java中,方法的重载是指多个方法可以共享同一个名字
B.Java中,用abstract装饰的类称为抽象类,它不能实例化
C.Java中,接口是不包含成员变量和方法实现的抽象类
D.Java中,构造方法可以有返回值
正确答案:D
【解析】构造方法是一种特殊的方法,是为对象初始化操作编写的方法,用它
来定义对象的初始状态。Java中的每个类都有构造方法,它也是由方法名、参数和
方法体组成的。构造方法的名字必须与类名相同,并且构造方法不返回任何数据。
题2-81:下面不属于Java核心包的是( )。
A.java.lang包
B.java.awt包
C.javax.sound包
D.java.util包
正确答案:C
【解析】选项C属于扩展包,它提供多媒体声音要求的MIDI输入输出以及合成
操作的基本类。Java核心包包括Java.lang包、java.awt包、java.applet包、java.io包、java.net包、java. rm包、java.math包、java.util包、java.sql包、java.security包、java.text包和java.bean包。
题2-82:下列关于Java程序结构的描述中,不正确的一项是( )。
A.一个Java源文件中可以包括一个package语句
B.一个Java源文件中可以包括多个类定义,但是只能有一个public类
C.一个Java源文件中可以有多个public类
D.源文件名与程序类名必须一致
正确答案:C
【解析】一个完整的Java源程序应该包括下列5个部分:①package语句将源文
件存入指定的包中,该部分至多只有一句,必须放在源程序的第一句,如果没有该
语句,则源文件存入当前目录下。②import语句导入需要的包或类,该部分可以有
若干import语句或者没有,必须放在所有的类定义前。③公共类定义。公共类定义
部分至多只有一个公共类的定义,Java语言规定该Java源程序的文件名必须与该公
共类名完全一致。④类定义。类定义部分可以有0个或多个类定义。⑤接口定义。接
口定义部分可以有0个或多个接口定义。
题2-83:下列关于Java变量作用域的说法中,不正确的是( )。
A.在Java程序中要使用一个变量,必须先对其进行声明
B.变量声明语句可以放在程序的任何地方,只要位于变量使用之前即可
C.变量不可以在其作用域之外使用
D.局部变量在使用之前可以不初始化,系统使用默认的初始值
正确答案:D
【解析】局部变量在使用之前必须初始化,否则编译错误,类的成员变量则不
一定要在使用之前初始化,系统会赋予其默认的初始值。题2-84:下列有关Java语言的叙述中,正确的是( )。
A.Java是不区分大小写的
B.源文件名与public类型的类名必须相同
C.源文件的扩展名为.jar
D.源文件中public类的数目不限
正确答案:B
【解析】本题考查考生对Java语言概念的理解。这是考试重点内容,注意理解
这些基本概念。Java语言和C语言不同,它是区分大小写的; Java程序的源文件扩
展名为.class,.jar文件是由归档工具JAR生成的JAR文件。源文件中public类的
数目只能有0个或1个,用来指定应用程序类名,也是源文件名,所以选项B正确。
题2-85:Java中对Applet设置了严格的安全限制。下列关于Applet在Java 2
中的安全限制叙述正确的是( )。
A.根本无法解除
B.只有部分限制可以解除,而其他限制无法解除
C.可以在安全策略的控制下解除
D.已经默认地全部解除
正确答案:C
【解析】本题考查Applet的安全限制。Java 2中的安全机制建立一个策略文件
给Applet授予所需的权限,并使用这个安全策略实施安全控制,选项C说法正确。
要注意分析题目,本题通过仔细分析题目,也可以正确回答。
题2-86:在没有为类定义任何构造方法时,Java编译器会自动建立一个( )
的构造方法。A.不带参数
B.带一个参数
C.带多个参数
D.默认参数
正确答案:A
【解析】本题考查对默认构造方法的理解。要熟记构造方法的几个特点:①构
造方法用来初始化类的一个对象。②构造方法具有和类一样的名称,并且没有返回
类型还可以重载。③只能用运算符new调用构造方法。④如果没有定义构造方法,在
Java运行时,系统会自动提供默认的构造方法,它没有任何参数。
题2-87:Java程序的执行过程中用到一套JDK工具,其中javadoc.exe是指。
A.Java编译器
B.Java解释器
C.Java文档生成器
D.Java调试器
正确答案:C
【解析】javadoc用于生成API文档。根据Java源码及说明语句生成HTML文
档。所以本题选C。
题2-88:在Java中,用package语句说明一个包时,该包的层次结构必须是。
A.与文件的结构相同
B.与文件所在文件夹的层次相同C.与文件类型相同
D.与文件大小相同
正确答案:B
【解析】本题考查Java包的概念。Java采用包来管理类名空间,为编程提供一
种命名机制,也是一种可见性限制机制。定义一个包要用package关键字,用
package语句说明一个包时,该包的层次结构必须与文件所在文件夹的层次相同。
否则,在编译时可能出现查找不到的问题,所以选项B正确。
题2-89:在Java中,能实现多重继承效果的方式是( )。
A.内部类
B.适配器
C.接口
D.同步
正确答案:C
【解析】本题考查Java中多重继承的概念。首先要区分选项中的各个概念。内
部类是在一个类的内部嵌套定义的类,主要用来生成事件适配器。适配器定义一个
包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Adapter),它
包装的对象就是适配者(Adaptee),适配器提供客户类需要的接口。接口是一种只
含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现,所以与存储
空间没有任何关系,将多个接口合并,即多重继承,就可以很容易实现,选项C正
确。同步主要用在多线程程序设计中。
题2-90:下列说法中错误的是( )。
A.捕获异常在调用方法时用throw子句捕获并处理
B.异常对象用new来创建C.Java语言的类库中已定义有许多异常类可利用
D.Throwable类分为Error和Exception两个子类
正确答案:A
【解析】一个方法中为某种类型的异常对象提供对应的处理时,调用该方法就
可捕获这种异常,也就是说,当异常已被定义时,必须通过try-catch-finally语
句处理它。
题2-91:下列关于Java的说法正确的是( )。
A.Java中的类可以有多个直接父类
B.抽象类不能有子类
C.最终类可以作为其他类的父类
D.Java中的接口支持多继承
正确答案:D
【解析】Java中,接口支持多继承,所以选项D正确。Java语言只允许类间有
单继承关系,所以选项A错。抽象类是专门为别的类继承它而定义的,所以选项D
错。final声明一个类后,这个类不能被其他类继承,它是最终类,所以选项C错。
题2-92:下列变量名的定义中,符合Java命名约定的是( )。
A.fieldname
B.super
C.Intnum
D.number
正确答案:A【解析】Java命名约定全部小写,不得使用关键字,只有A符合。
题2-93:下列哪个选项的Java源文件代码片段是不正确的?( )
A.package testpackage; public class Test{ }
B.import java.io. ; package testpackage; public class Test{ }
C.import java.io.; class Person{ } public class Test{ }
D.import java.io.; import java.awt.; public class Test{ }
正确答案:B
【解析】Java中的package语句必须是源文件中除说明以外的第一条语句。导
入包语句可以有几个,但是必须位于package语句之后,其他类定义之前。一个源
文件中可以有几个类,但最多只能有一个是public的,如果有,则源文件的文件名
必须与该类的类名相同。
题2-94:下面所列类型中,不是复合数据类型的是( )。
A.类
B.数组
C.整型
D.接口
正确答案:C
【解析】复合数据类型包括数组、类和接口。
题2-95:下面说法中正确的是( )。
A.Java程序不需编译也可直接执行
B.Java程序经过编译后的字节代码仍然是ASCII文件C.Java程序经过编译后的字节代码是二进制文件,可以在操作系统上直接执行
D.Java程序经过编译后的字节代码是二进制文件,可以在Java虚拟机上执行
正确答案:D
【解析】Java语言的执行模式是半编译和半解释型,未经编译的Java程序不能
直接执行。Java程序经过编译后的字节代码是二进制文件,但不能直接在操作系统
上执行,它可看作虚拟机的机器码,由Java虚拟机解释执行。
题2-96:编译Java Applet源程序文件产生的字节码文件的扩展名为( )。
A..java
B..class
C..html
D..exe
正确答案:B
【解析】该题考查对Applet运行中所需要的几种文件的理解。Applet源程序与
任何Java源程序一样,其文件扩展名都为.java,编译之后生成的目标文件的扩展
名为.class,但要执行该小程序,必须有相应的HTML文件;而.exe文件根本就与
Java Applet不沾边。
题2-97:以下各项中不属于Java语言流程控制结构的是( )。
A.分支语句
B.跳转语句
C.循环语句
D.赋值语句正确答案:D
【解析】Java语言的流程控制结构包括分支语句、跳转语句、循环语句等,但
赋值语句是由赋值表达式构成的,不能用于流程控制。
题2-98:Java语言与C++语言相比,最突出的特点是( )。
A.面向对象
B.高性能
C.跨平台
D.有类库
正确答案:C
【解析】本题考查Java语言的特性.Java语言与C++语言都是面向对象的语言。
因此,选项A是错误的.Java语言与C++语言都是高性能的编程语言.Java字节码的设
计使之能很容易直接转换成对应于特定CPU的机器码,从而得到较高的性能.C++由
于具有极高的灵活性、强大的功能和非常高的效率,常常用于专业应用程序的开
发,C++非常适合于编写各种编程环境下的高性能代码。因此,选项B是错误
的.Java作为平台无关的语言,是指用Java写的应用程序不用修改就可在不同的软
硬件平台上运行。平台无关有两种:源代码级和目标代码级.C和C++具有一定程度的
源代码级平台无关性,C++语言支持程序员编写一些非常低级的程序,从而能够访问
机器硬件,并操纵实际内存地址。但这些是以牺牲可移植性为代价的,因为这时每
个程序都是针对某种具体硬件环境的。而Java主要靠Java虚拟机(JVM)在目标码
级实现平台无关性.Java编程人员在编写完软件后,通过Java编译器将Java源程序
编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程
序,而不管这种字节码是在何种平台上生成的。显然,Java语言与C++语言相比,最突出的特点是跨平台。因此,选项C是正确的.Java语言和C++语言中都包含有类
库,提供了大量的类以满足用户的多方面需要。因此,选项D是错误的。
题2-99:Java中,数值类型值中不可能出现的符号是( )。A.f
B.d
C.
D.e
正确答案:C
【解析】Java中,e用于科学计数法形式中,表示实常数,如123e3或123E3,其中e或E之前必须有数字,e或E后面的指数必须为整数。d表示double型的值,如
1.23d或者1.23D。对于float型的值,则在数字后加f或F,如12.3F或者12.3f,它在机器中占32位,且表示精度较double型要低。
题2-100:下列哪个是非法的Java标识符?( )
A.Tree Glasses
B.FirstJavaApplet
C.theLastOne
D.Two273.5
正确答案:D
【解析】本题主要考查Java语言的标识符这个知识点.Java语言的标识符必须
以字母、下划线(__)、美元符号(¥)开始,其余字符可以是上述3种符号或数字
(0~9).Java语言使用Unicode字符集,所以标识符中使用的字母包括下面几种:
①A~Z;②a~z;③Unicode字符集中序号大于0xC0的所有符号。选项A是正确的,下划线是可以在标识符里面出现的;选项B是正确的;选项C是正确的,符号¥也是
可以在标识符里面出现的;选项D是错误的,符号“.”不能在标识符里面出现。故
本题答案是D.
题2-101:在Java中,字符串由java.lang.String和( )定义。A.java.io.StringChar
B.java.io.StringBuffer
C.java.lang.StringChar
D.java.lang.StringBuffer
正确答案:D
【解析】在Java中,字符串是作为对象出现的,由java.lang.String和
java.lang.StringBuffer定义,分别用来处理长度不变和长度可变字符串,这两
类都被定义为final。
题2-102:能够支持javadoc命令的注释语句是( )。
A....
B....
C.
D....
正确答案:D
【解析】以“”开始的是单行注释语句,以“”开始、“”结束的是C
语言风格的注释语句,在“...”内的文档注释是自由形式的文本,支持
javadoc命令,被javadoc处理,可以建立类的一个外部说明性文件。
题2-103:下列关于Java对import语句规定的叙述中,错误的是( )。
A.在Java程序中import语句可以有多个
B.在Java程序中import语句可以没有
C.在Java程序中import语句必须有一个D.在Java程序中import语句必须引入在所有类定义之前
正确答案:C
【解析】Java程序中使用import关键字导入一个包中的类。在一个Java源程序
中,可以有0个或多个import语句,但是必须在所有类定义之前引入标准类。因
此,本题中选项C的说法是错误的。
题2-104:下列不属于Java语言健壮性特点的是( )。
A.Java能检查程序在编译和运行时的错误
B.Java能运行虚拟机,实现跨平台
C.Java自己操纵内存,减少了内存出错的可能性
D.Java还实现了真数组,避免了覆盖数据的可能
正确答案:B
【解析】Java健壮性的特点如下:Java在编译和运行程序时都要对可能出现的
问题进行检查,以防止错误的产生。Java编译器可以查出许多其他语言运行时才能
发现的错误。Java不支持指针操作,大大减少了错误发生的可能性。Java具有异常
处理的功能,当程序异常时,它能捕获并响应意外情况,以保证程序能稳妥地结
束,计算机系统不会崩溃。而Java能运行虚拟机实现跨平台是Java的与平台无关性
的特点。所以本题选B。
题2-105:下列有关Java布尔类型的描述中,正确的是( )。
A.一种基本的数据类型,它的类型名称为boolean
B.用int表示类型
C.其值可以赋给int类型的变量
D.有两个值,1代表真,0代表假正确答案:A
【解析】布尔型数据只有两个值,true和false,不对应任何数字,不与数字
转换,一般用于逻辑判别。
题2-106:下列说法不正确的是( )。
A.Java语言不支持分布式计算
B.Java是跨平台的语言
C.Java是面向对象语言
D.Java是具有多线程并发机制的语言
正确答案:A
【解析】本题考查Java语言的特点。Java语言是一种高级语言,具有简单、面
向对象、分布式、解释型、健壮性、安全、结构中立、可移植、高效率、多线程、动态等特点。
题2-107:在Java语言中,不允许使用指针体现出的Java特性是( )。
A.可移植
B.解释执行
C.健壮性
D.安全性
正确答案:D
【解析】选项A,Java语言跨平台的特点,保证了软件的可移植性。此外,Java本身的编译器也用Java语言编写,运行系统的虚拟机用C语言实现,这样,Java系统本身也具有可移植性。选项B,Java语言用字节码进行解释执行,字节本
身带有许多编译时产生的信息。选项C,健壮性也称为鲁棒性。Java语言在编译和运行时都有比较严格的检查。选项D,Java语言在运行程序时,有严格的访问权限检
查。对字节代码执行前要检查,不允许使用指针,可防止对内存的非法入侵。
题2-108:getSize( ).width指的是什么?( )
A.界面组件的窗口宽度
B.在Java中任何图形用户界面的宽度
C.框架的窗口宽度
D.用户显示器的宽度
正确答案:B
【解析】可以对Java的任何组件调用getSize.width和
getSize.height,来改变用户界面的宽度和高度。
题2-109:下面有关Java Object默认的基本方法,说法错误的是( )。
A.equals(Object obj)指示某个其他对象是否与此对象“相等”
B.copy创建并返回此对象的一个副本
C.wait导致当前的线程等待,直到其他线程调用此对象的notify方法或
notifyAll方法
D.toString返回该对象的字符串表示
正确答案:B
【解析】Object类中没有copy方法,只有clone方法,创建并返回此对象
的副本。
题2-110:在如下所示的Test类中,共有( )个构造方法。A.0
B.1
C.2
D.3
正确答案:D
【解析】构造方法的形式为:
类名([形式参数表])
构造方法没有返回值,不能添加void,构造方法可以被重载。
题2-111:检查程序是否存在问题。如果不存在,说明输出结果( )。A.test okandabc
B.test okandgbc
C.goodandabc
D.goodandgbc
正确答案:D
【解析】String类型和数组属于引用传递,但执行change方法后,数组改变的
是ch[0],也就是ch数组引用未改变,但其所指向内容的值被改变。
题2-112:下列说法中不正确的有( )。
A.call by value不会改变实际参数的数值
B.call by reference能改变实际参数的参考地址
C.call by reference不能改变实际参数的参考地址
D.call by reference能改变实际参数的内容
正确答案:B【解析】
①基本类型和基本类型变量被当作参数传递给方法时,是值传递。
在方法实体中,无法给原变量重新赋值,也无法改变它的值。
②对象和引用型变量被当作参数传递给方法时,是引用传递。
在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。
题2-113:明朝时期张居正改革的“一条鞭法”的主要思想是( )。
A.面向过程
B.万物皆数
C.统一接口
D.泛型编程
正确答案:C
【解析】一条鞭法的主要思想是“税以银征收”,取消了原来的田赋、力役和
其他杂税,促进自然经济的瓦解和商品经济的发展。面向过程是指以过程为中心的
编程思想,形成模块化特点。万物皆数是毕达哥拉斯学派的数学哲学理念(特指有
理数),属于世界观的一种。泛型编程是一种语言机制,能够帮助实现一个通用的
标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所
有可能类型的对象这样的事;泛型编程让我们可以编写完全一般化并可重复使用的
算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数
据类型上皆可操作的含意,与模板有些相似。一条鞭法的主要思想并不是以征税过
程为中心的思想,同时也不是在多种类型上的操作。
题2-114:What will be printed when you execute the following
code?( )A.BB
B.CBB
C.BAB
D.None of the above
正确答案:B
【解析】初始化过程是这样的。
首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序
初始化。
然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序
初始化。其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法。
最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法。
①初始化父类的普通成员变量和代码块,执行C c = new C( );输出C。
② super(B);表示调用父类的构造方法,不调用父类的无参构造函数,输出
B。
③System.out.print(B);输出B。
所以输出CBB。
题2-115:以下Java程序代码执行后的结果是( )。
A.Fred
B.true
C.编译错误
D.运行时抛出异常
正确答案:B
【解析】创建Object对象时,重写了equals方法。
题2-116:假设有以下代码:下列选项中返回false的是( )。
A.s.equals(t)
B.t.equals(c)
C.s==t
D.t.equals(new String (hello))
正确答案:B
【解析】String类重写了equlas方法,类型不同返回false,所以答案是B。
题2-117:Given the following class:
Which expression returns true?( )
A.c1==c2
B.c2==c3C.m==c1
D.c1.equals(m)
正确答案:B
【解析】
c1 = new Cat(10L);
c2 = new Cat(10L);
A:c1和c2是两个参数相同的不同对象,c1!=c2,所以返回false。
B:c2和c3指向同一个引用,所以c2==c3,返回true。
C:m与c1是不同类型,不相等,返回false。
D:c1没有定义equals方法,默认调用Object类的equals方法,返回false。
题2-118:Consider the following code:
Which code fragments cause an object of type
NullPointerException to be thrown?( )
A.if((s!=null)(s.length>0))
B.if((s!=null)(s.length>0))
C.if((s==null)|(s.length==0))
D.if(s==null)||(s.length==0))
正确答案:A C
【解析】s为null,因此只要调用了s.length都会抛出空指针异常。因此这个题目就是考察if语句的后半部分会不会执行。
A:单个与操作的符号用在整数上是按位与,用在布尔型变量上跟功能类
似,但是区别是无论前面是否为真,后面必定执行,因此抛出异常。
B:与操作,前半部分判断为假,后面不再执行。
C:这里跟和的区别类似,后面必定执行,因此抛出异常。
D:或语句,前面为真,整个结果必定为真,后面不执行。
题2-119:下面哪些情况下不需要使用抽象类?( )
A.当一个类的一个或多个方法是抽象方法时
B.当类是一个抽象类的子类,并且不能为任何抽象方法提供任何实现细节或方
法体时
C.当一个类实现多个接口时
D.当一个类实现一个接口,并且不能为任何抽象方法提供实现细节或方法体时
正确答案:C
【解析】当一个类中有一个方法是抽象类时,则类必须为抽象类。
抽象类中可以有非抽象方法。
抽象类给出方法的声明,但没有具体的实现。
题2-120:Given the following class:Please write the output result( )。
A.1234
B.welcome
C.空
D.不确定
正确答案:A
【解析】局部变量的作用域只在方法内部有效,在方法外无效。
题2-121:下列程序的运行结果是( )。
A.IOException!B.IOException!Exception!
C.FileNotFoundException!IOException!
D.FileNotFoundException!IOException!Exception!
正确答案:A
【解析】题目说抛出一个异常,但没说具体是什么异常,那么就要分情况了。
①如果抛出一个FileNotFoundException(或其子类),则最终结果就打印
FileNotFoundException!。
②如果抛出一个IOException,或者IOException的子类(不包含
FileNotFoundException及其子类),那么最终结果就打印IOException!。
③如果抛出一个Exception(不包含IOException及其子类),那么最终结果就
打印Exception!。
所以以上3个皆有可能。但是,不管是哪一种情况,只会输出其中之一。
从答案上来看,B、C、D的输出情况是不存在的。因此选A。
题2-122:以下方法中,哪个不是对add方法的重载?( )
A.pubilc int add(int x, int y, float z){return 0;}
B.pubilc int add(int x, int y, int z){return 0;}
C.pubilc void add(int x, int y){}
D.以上都不是
正确答案:B【解析】方法重载是指在 ......
内容简介
前言
第1章 CC++
1.1 CC++工程师标准
1.2 专家介绍
1.3 专家意见
1.4 QA专访
第2章 Java
2.1 Java工程师标准
2.2 专家介绍
2.3 专家意见
2.4 QA专访
第3章 PHP
3.1 PHP工程师标准
3.2 专家意见
3.3 专家意见
3.4 QA专访第4章 Android
4.1 Android工程师标准
4.2 专家介绍
4.3 专家意见
4.4 QA专访
第5章 iOS
5.1 iOS工程师标准
5.2 专家介绍
5.3 专家意见
5.4 QA专访
附录 各种语言和技术的工程师标准
本书有何特色
业的面试、笔试特点,提高入职成功的概率。
答部分均来自知名互联网公司的高级程序员,可以帮助开发者们把握当前主流IT企
招聘流程以及常见问题等。面试题目多取材于各大互联网公司的面试真题,并且问
中包含了面试中各种编程语言的相关考察点,涉及这些语言或技术的互联网公司的
本书通过百余个面试题目对CC++、Java、PHP、Android、iOS进行总结,其
的职位。
为求职路上的程序员们提供更多、更好、更有效的帮助,使他们最终获得自己心仪
所以能否进入一个好的就职环境,确立满意的职业生涯,是十分重要的。本书希望
对于IT行业的人来说,一个程序员能否很好地成长,离不开就职环境的影响。
为什么要写这本书
前言
么样的人才,然后有针对性地训练自己的技能,这样才能拿到梦寐以求的offer。
知己知彼,方能百战不殆。要想进入理想的企业,就需要了解企业到底需要什
建议。
关的企业招聘试题,专家团队介绍以及专家的访谈内容和对年轻程序员未来发展的
Android和iOS,每章分为初级、中级、高级所对应的工程师标准,与各个知识点相
本书依据编程语言及技术种类划分为5章,分别是CC++、Java、PHP、进行逐一解答,从而为广大年轻程序员提供有效的帮助。
心仪的企业,掌握哪些技术知识点会为自己加分,职业生涯该如何发展规划等问题
题、一线企业高级工程师的指导意见等角度提供实用的就业指南;就怎样才能进入
本书致力于为年轻程序员做全面且精准的就业指导,从技术干货、企业招聘试
内容简介
第5章iOS
专访。
包含Android的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA
第4章Android
访。
包含PHP的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第3章PHP
访。
包含Java的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第2章Java
访。
包含CC++的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专
第1章CC++
本书内容与知识体系
聘,解决读者在应聘和职业规划中的各种疑问。
互联网公司大牛们采访的内容,让读者能够更进一步地了解主流的互联网公司招
(3)与大牛们面对面交流。书中的面试流程、面试中常见的问题均摘自对各大
习。
面试真题,让读者直观地感受题目。并且每章都提供了编程实例,帮助读者深入学
(2)提供真题实例解析。全书百余道题目大多取自各大知名互联网公司的笔试
读者更加全面地掌握各种重点技术和技术难点。
面了解面试过程的特点和应对技巧;每种语言的相关知识点均有若干题目,能够使
(1)内容涵盖广泛。本书对于目前主流的开发语言均进行了总结,帮助读者全
高峰、亚康科技首席运营官韦红军、游戏多副总裁汪洋(排名不分先后)。
李湛、盛大G云负责人陈桂新、英雄互娱首席运营官刘志刚、泰康在线首席技术官潘
人星云负责人胡远星、慧聪副总裁李韬、爱摄汇首席执行官赵亮、游族首席技术官
军、 CNTV总工程师宋维君、跟谁学首席技术官李钢江、玩多多首席执行官罗剑、巨
华、芒果TV首席技术官黄冬、仟寻时代首席执行官黄晶、海尔电商首席技术官盛国
毅、一下科技首席执行官韩坤、映客首席执行官奉佑生、UCloud首席执行官季昕
建春、金山云首席执行官王育林、凤凰网技术副总裁金明岩、亿采网首席技术官陈
1024学院院长戴华、iTechClub执行理事倪鸣、腾讯社交网络运营部助理总经理赵
姚键、美团云总经理李爽、小米首席架构师崔宝秋、iTech Club理事长吴华鹏、官邢宏宇、搜狗首席运营官茹立云、陌陌技术副总裁王春来、优酷土豆首席技术官
指导专家:阿里巴巴技术副总裁 刘拴林、联想副总裁 陈宇、58同城首席技术
李、李文东、任龙、姚清亮。
参编专家:林飞、刘怀军、李国松、欧阳辰、何伟、罗丁、宋坤、郭振耀、陈
本书主编:郑萌。
本书作者及编委会成员
-想要了解互联网行业面试的相关人员
-技术部门的HR
-应聘软件行业职位的相关就业人员
-计算机相关专业的应届毕业生
适合阅读本书的读者
包含工程师对于各语言和技术的初级、中级、高级知识掌握的标准。
附录各种语言和技术的工程师标准
访。
包含iOS的初级、中级、高级知识及相关知识点的题目,专家介绍以及QA专编者
第1章 CC++
C语言是一种结构化语言,它层次清晰,便于按模块化方式组织程序,易于调试
和维护。C语言的表现能力和处理能力极强,它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,还可以直接访问内存的物理地址,进行位一级的操
作。而在C语言的基础上,1983年又由贝尔实验室的Bjarne Strou-strup推出了
C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++提
出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地
映射到程序空间,为程序员提供了一种与传统的结构化程序设计不同的思维方式和
编程方法,因而也增加了整个语言的复杂性,掌握起来有一定的难度。
1.1 CC++工程师标准
1.1.1 初级要求
标准C基础:一般应包括对于数据类型、变量常量、数组、函数、指针和字
符串、结构、联合和枚举的理解和运用。
作为一个合格的软件工程师,具备扎实的编程基础是十分必要的,这也是各大
互联网公司面试中一定会考察的知识点。例如下面的题目摘自某知名互联网公司的
招聘考试试题。
题1-1:请看下面的代码。程序运行的结果是( )。A.3,2,1
B.1,3,2
C.1,3,3
D.1,2,3
正确答案:C
【解析】
题1-2:下列代码中,prim函数的功能是分解质因数。请填写括号中的内容。正确答案:①m%n ②m=n
【解析】n从2开始,第一处为m%n,代表取余。当余数是0的时候表示除尽,跳
出while循环,即找出一个质因数。此时一个质因数即为n,然后m=n,即让m除以
这个质因数,然后再进入求新m质因数的递归。
题1-3:若有以下类型说明语句:char w; int x; float y; double z;则表
达式w-xyz的结果为double类型,表达式(int)(x+y-zw)的结果为( )类型。
A.float
B.char
C.int
D.double
正确答案:C
【解析】当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类
型转换,将操作数转化为所需要的类型。显式强制类型转换需要使用强制类型转换
运算符,格式如下:type(
为类型描述符,如int、float等。
符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数
本身,运算后操作数本身未改变。
题1-4:C语言中运算对象必须为整型的运算符是( )。
A.%=
B.C.=
D.<=
正确答案:A
【解析】%=是取模运算,也就是求余数的运算,只有整数才能取模。
题1-5:在C语言程序中,表达式85的结果是( )。
A.1.6
B.1
C.3
D.0
正确答案:B
【解析】C语言中整数的运算结果仍然为整数。
题1-6:设x为int型变量,且x=10,则执行语句x+=x后,x的值为( )。
A.10
B.20
C.40
D.30
正确答案:B
【解析】例如式子a+=b,即把a+b的值再赋值给a。对于本题来说,x+=x即把
x+x的值赋给x,x最后为20。
题1-7:在C语言程序中,表达式5%2的结果是( )。A.2.5
B.2
C.1
D.3
正确答案:C
【解析】%指的是取余数,5除以2的余数为1。
题1-8:如果int a=3,b=4;则条件表达式a
A.3
B.4
C.0
D.1
正确答案:A
【解析】a
为b。本题中a
题1-9:C语言中,关系表达式和逻辑表达式的值是( )。
A.0
B.0或1
C.1
D.T或F
正确答案:B【解析】逻辑表达式是指运算符为或(||)、与、非(!)的表达式。返
回值为0或1,0表示false,非0表示true.关系表达式是指运算符为<、<=、>、>=、==、!=的表达式,返回值同样为0或1.
题1-10:设a、b和c都是int型变量,且a=3,b=4,c=5,则下面的表达式中,值为0的表达式是( )。
A.'a''b'
B.a<=b
C. a||b+cb-c
D.!((a
正确答案:D
【解析】||和的优先级高于+和-,||和的优先级相等,且是左结合的,就
是从左边开始结合到右边。
题1-11:下面( )表达式的值为4。
A.113
B.11.03
C.(float)113
D.(int)(11.03+0.5)
正确答案:D
【解析】A.整数的运算结果仍然为整数,结果为3;B.由于11.0是float型,因
此计算结果也为float型,值为3.0;C.结果强制类型转换为float类型,值为
3.0;D.11.03+0.5=4.1,强制类型转换为整型,结果为4。
题1-12:已知int x=5,y=5,z=5;执行语句x%=y+z;后,x的值是( )。A.0
B.1
C.5
D.6
正确答案:C
【解析】x=x%(y+z),x=5%(5+5)=5,结果为5。
题1-13:已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句
c2='A'+'6'-'3';后,c2中的值为( )。
A.68
B.'D'
C.错误
D.'d'
正确答案:B
【解析】c2的ASCII码为十进制数68,因为c2是字符型的,所以应该是字母D。
题1-14:下列关于C语言的叙述错误的是( )。
A.大写字母和小写字母的意义相同
B.不同类型的变量可以在一个表达式中
C.在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型
D.同一个运算符号在不同的场合可以有不同的含义
正确答案:A【解析】C语言中,大小写代表不同的两个标识符。A错误。
题1-15:有:int w=11,x=12,y=3,m;执行语句m=(w
m:y;后,m的结果是( )。
A.1
B.2
C.3
D.以上结果都不对
正确答案:C
【解析】m=(w
和y中的较小值赋给m,即m=3。
题1-16:设整型变量a=2,则执行下列语句后,浮点型变量b的值不为0.5的是
( )。
A.b=1.0a;
B.b=(float)(1a);
C.b=1(float)a;
D.b=1(a1.0);
正确答案:B
【解析】B中整数与整数的运算结果仍然为整数,所以1a的值为0,强制转化为
float型后结果为0.0。
题1-17:若int n; float f=13.8;则执行n=(int)f%3后,n的值是( )。
A.1B.4
C.4.333333
D.4.6
正确答案:A
【解析】13.8取整之后等于13,13对3求余结果是1,选A。
题1-18:在C语言的库函数中,可以输出char型变量x值的语句是( )。
A.getchar(x)
B.fputc(x)
C.putchar(x)
D.puts(x)
正确答案:C
【解析】输出函数是putchar和printf,putchar只能输出字符常量和字符型
变量。getchar和putchar是一对函数,针对字符及字符变量进行操作。getchar可
以接受各种字符,包括空格和回车,相应的putchar可以输出一个字符。
题1-19:以下说法正确的是( )。
A.'x'+5是一个错误的表达式
B.C语言不允许类型的混合运算
C.强制类型转换时,类型说明符必须加括号
D.(int)x+y和(int)(x+y)是完全等价的表达式
正确答案:C【解析】A表达式正确;B中C语言允许类型混合运算;C正确;D中(int)x+y先
将x转换为整型,再与y进行加法运算,(int)(x+y)先将x与y相加,结果再转换为整
型,两个式子是不同的。
题1-20:在C语言中,认为( )为逻辑“真”。
A.true
B.大于0的值
C.非0整数
D.所有非0的值
正确答案:D
【解析】C语言中,0是假值,其他的都是真值。
题1-21:表示关系x<=y<=z的C语言表达式为( )。
A.(x<=y)(y<=z)
B.(x<=y)AND(y<=z)
C.(x<=y<=z)
D.(x<=y)(y<=z)
正确答案:A
【解析】题中x<=y<=z的意思为x<=y并且y<=z。在C语言中,要表示“且”的关
系,应用“与”逻辑运算符,即“”,故选择A选项。
题1-22:能正确表示逻辑关系a>=10或a<=0的C语言表达式是( )。
A.a>=10 or a<=0
B.a>=0||a<=10C.a>=10a<=0
D.a>=10||a<=0
正确答案:D
【解析】逻辑运算符“||”表示或的意思。
题1-23:判断char型变量c1是否为大写字母的表达式为( )。
A.'A'<=c1<='Z'
B.(c1>='A') (c1<='Z')
C. ('A'<=c1)AND ('Z'>=c1)
D.c1>='A' c1<='Z'
正确答案:D
【解析】C语言规定,字符常量在程序中要用单引号括起来。判断c1是否为大写
字母的充要条件为c1>='A'和c1='Z',用逻辑与来表示。所以选项D正确。
题1-24:若int i=10;执行下列程序后,变量i的正确结果是( )。
A.13
B.12
C.11
D.10正确答案:A
【解析】由于case中缺少break语句,在case 10之后程序会一直执行下去,因
此结果为13。
题1-25:在下面的条件语句中(其中s1和s2表示C语言语句),只有一个在功
能上与其他三个语句不等价,它是( )。
A.if (a) s1; else s2;
B.if (a==0) s2; else s1;
C.if (a!=0) s1; else s2;
D.if (a==0) s1; else s2;
正确答案:D
【解析】答案A中if(a) s1; else s2;,假设a==0,那么if语句条件为假,执
行s2,假设a!=0,执行s1;答案B中 if(a==0); s2; else s1;,假设a==0,那么
if语句条件为真,执行s2,假设a!=0,执行s1;答案C中 if(a!=0) s1; else
s2;,假设a==0,那么if语句条件为假,执行s2,假设a!=0,执行s1;答案D中
if(a==0) s1; else s2;,假设a==0,那么if语句条件为真,执行s1,假设
a!=0,执行s2。
题1-26:假定所有变量均已正确定义,则下列程序段运行后y的值是( )。
A.20
B.11C.9
D.0
正确答案:A
【解析】if(a=0)y--;其中a=0是先给a赋值为0再判断,这里的a为0了,if(a)就是假的,不成立;else if(a>0)继续判断a>0。上面已经把a赋值为0,所
以这里也不成立;y++不执行,然后执行else y+=y;做到这一步了,y=y+y=20,所以a的值是0,y的值是20。
题1-27:假定所有变量均已正确定义,则下列程序段运行后x的值是( )。
A.34
B.4
C.35
D.3
正确答案:B
【解析】程序是一步一步往下执行的,对于if语句,只有为真的时候才会执行
其后面的语句。if(!a)会执行后面的语句,因为非零即为真,执行到这步后,x=34,但是程序继续往下,if(c)后面的语句不执行,就执行了else后的语句,所
以x=4。题1-28:若k是int型变量,且有下面的程序段:
上面程序段的输出结果是( )。
A.
B.
C.
D.有语法错误,无输出结果
正确答案:A
【解析】k的值为-3,满足if语句中的条件k<=0,因此输出结果为A。
题1-29:执行如下程序:
该程序的输出结果是( )。
A.a=2,b=1B.a=1,b=1
C.a=1,b=0
D.a=2,b=2
正确答案:D
【解析】case后面跟的必须是整型常量表达式。进入case后,如果没有遇到
break语句,就会一直往下执行,后面其他case或default分支的语句也会被执行
到,直到遇到break,或者执行到整个switch语句块的末尾。题目中给出了三个
case语句:case 0、case 1、case 2。当x为0时,从case 0语句开始执行,因为
没有break语句,将一直执行到函数末尾结束,即继续执行case 1、case 2两条语
句。执行完case 1时,a=1,b=1;执行完case 2时,a=2,b=2。
题1-30:以下程序的输出结果是( )。
A.0
B.1
C.2
D.3
正确答案:C
【解析】x值为-10,y值为1,在第一个if判断中满足条件,进入第二层if判
断,由于y>0,执行else语句,z=z+1=2,所以结果为C。题1-31:以下程序段的输出结果是( )。
A.a=10 b=50 c=10
B.a=10 b=30 c=10
C.a=50 b=30 c=10
D.a=50 b=30 c=50
正确答案:B
【解析】if(a>b) a=b;条件不成立,此语句不执行;b=c;直接赋值,b直接等
于c=30;c=a;语句让c直接等于a。
题1-32:执行语句for(j=0; j<=3; j++) a=1;后变量j的值是( )。
A.0
B.3
C.4
D.1
正确答案:C
【解析】在j=3时仍然满足循环条件,因此j仍然会执行一次j++的操作,此时
j=4,不满足j<=3的条件,退出循环。
题1-33:下列循环语句中有语法错误的是( )。
A.while(x=y) 5;B.while(0);
C.do 2; while(x==b)
D.do x++ while(x==10);
正确答案:D
【解析】D选项中x++是一条语句,后面要加(;)。
题1-34:语句while(!y);中的表达式!y等价于( )。
A.y==0
B.y!=1
C.y!=0
D.y==1
正确答案:A
【解析】y==0则!y就是非0,即为真;y!=1则y可以等于2、3,结果!y是假;
y!=0则y是1时y!=0是真,而!y是假;y==1则y是1时是真,!y却是假。
题1-35:若有int a=1,x=1;则循环语句while(a<10) x++; a++;的循环将执
行( )。
A.无限次
B.不确定次
C.10次
D.9次
正确答案:A【解析】while(a<10) x++; a++;语句中while是不包含a++的,只循环执行
x++。
题1-36:以下程序段( )。
A.是死循环
B.循环执行一次
C.循环执行两次
D.有语法错误
正确答案:A
【解析】进入do循环后,x的值变为1,满足while(x>0)的条件,因此会一直执
行do while,造成死循环。
题1-37:循环for(i=0,x=1; i=10x>0; i++);将执行( )。
A.无限次
B.不确定次
C.10次
D.9次
正确答案:A
【解析】i被赋值为10与x>0是永真的。一开始i=0,x=1只是给i和x赋了初值。
所以程序会执行无数次。
题1-38:有如下程序:该程序的执行结果是( )。
A.6
B.3
C.死循环
D.4
正确答案:A
【解析】首先,i=1,进入for循环,执行sum+=i后sum的值为3;执行i+=2,i
的值变为3,此时仍然满足i<=3的循环条件,继续执行for循环,sum的值变为6;再
次执行i+=2后i的值变为5,不满足循环条件,退出循环,因此sum的值为6。
题1-39:执行下列语句后,变量i的值为( )。
A.2
B.3
C.4
D.5
正确答案:C
【解析】当i=3时不满足条件退出循环,但i++会使i再加1,就变成了4。题1-40:以下对一维数组a的正确声明是( )。
A.char a(10);
B.int a[ ];
C.int k=5,a[k];
D.char a[3]={'a','b','c'}
正确答案:D
【解析】A应使用方括号[ ];B中没有定义数组大小;C方括号内必须是常量;
D正确。
常量的概念:CC++中的常量和变量是经常使用的两种类型,其中常量是存
放固定且不可变值的,一旦确定初始值,则在程序其他地方不可改变。常量一
般使用define或者const关键字来修饰,用define一般是为了程序代码可以做
统一的修改,而const多是为了保护数据不被修改。
对于常量概念的理解和使用是基础中的基础,但却容易被忽略,例如下面这道
题摘自迅雷的面试题。
题1-41:下列选项中不能作为合法常量的是( )。
A.1.234e+4
B.1.234e0.4
C.1.234e04
D.1.234e0
正确答案: B
【解析】实型字面值常量有两种表示方式:小数形式和指数形式。小数形式:由最前面的正负号,数字0~9和小数点组成,不允许有其他符号。
指数形式:包括指数和尾数两个不可缺少的部分,用符号E(e)分隔;E(e)左边
是尾数,为十进制整数或小数形式的实数,右边为指数,必须为十进制整数,表示
乘以10的多少次方,故选项B不正确。
宏定义:CC++中的宏定义是进行符号常量定义,该定义规定一种符号信
息,用来表示一些特殊的内容,使源代码更具有可读性,同时,也可以提高系
统的可移植性。宏定义是在编译时进行解释与替换的,实际运行中的代码是没
有宏定义符号的。而一般变量或常量定义在系统运行中,是有自己的内存空
间、访问权限和生存周期的。
在CC++中,宏定义的使用频率是很高的,对于宏定义的理解也是十分重要的。
例如下面这道题目摘自某知名互联网公司的考试内容。
题1-42:下列关于CC++宏定义的说法中,不正确的是( )。
A.宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用
const常量
B.宏的嵌套定义过多会影响程序的可读性,而且很容易出错
C.相对于函数调用,宏定义可以提高程序的运行效率
D.宏定义不检查参数正确性,会有安全隐患
正确答案:A
【解析】宏定义由预编译器来处理,当你定义一个记号,如define RATIO
1.652时,RATIO可能从未被编译器看到,而直接被预处理器移走了;如果你的定义
是define RATIO,在预处理进行一个宏替换的时候,由于调用地方的特殊性,会
出现一个莫名其妙的错误;但如果你使用的是const double RATIO = 1.652,若
你没有初始化这个变量,则在这个变量出错的地方,编译器将给出错误信息,可以
方便程序设计者很快地找出错误所在。这就是《Effective C++》作者所说的“尽
量以const enum inline替换define”的条款。内存分配:一个由CC++编译的程序占用的内存分为以下几个部分。
1.栈区(stack):由编译器自动分配和释放存放函数的参数值、局部变
量的值等。其操作方式类似于数据结构中的栈。
2.堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束
时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3.全局区(静态区)(static):全局变量和静态变量的存储是放在一块
的,初始化的全局变量和静态变量在一块区域中,未初始化的全局变量和未初
始化的静态变量在相邻的另一块区域中。
4.文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
5.程序代码区:存放函数体的二进制代码。
对于内存分配的理解,是CC++编程中的难点也是重点,所以更是笔试中被考察
的重点知识。例如下面摘取了奇虎360软件测试工程师的笔试题。
题1-43:在CC++中,能将分配的空间初始化为0的是哪种分配方法?( )
A.calloc( )
B.malloc( )
C.realloc( )
D.new[ ]
正确答案: A
【解析】
①calloc函数:void calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个num size连续的空
间。calloc申请内存空间后,会自动初始化内存空间为0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
②malloc函数:void malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则
返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
③realloc函数:void realloc(void ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把
ptr内存空间调整为size。申请的内存空间不会进行初始化。
④new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内
存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工
作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的
变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
题1-44:下面有关C++内存分配堆栈说法错误的是( )。
A.一般来讲,在32位系统下,堆内存可以达到4GB的空间,但是对于栈来讲,一般都是有一定的空间大小的
B.对于栈来讲,是由编译器自动管理,无须我们手工控制;对于堆来说,释放
工作由程序员控制
C.对于栈来讲,生长方向是向上的,也就是向着内存地址减小的方向;对于堆
来讲,它的生长方向是向下的,是向着内存地址增加的方向增长
D.对于堆来讲,频繁地进行newdelete操作势必会造成内存空间的不连续,从而产生大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题
正确答案:C
【解析】对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。CC++指针:指针是CC++编程中的重要概念之一,也是最容易产生困惑并
导致程序出错的问题之一。利用指针编程可以表示各种数据结构,通过指针可
使主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通信;指
针能够灵活、合理地操作内存,能够使程序更高效。从本质上讲,指针也是一
种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块
地址,这块地址指向某个变量或者函数,指针就是地址。指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。
指针的理解和应用是重中之重,也是大部分互联网公司CC++工程师笔试考察的
重点,例如下面摘自阿里巴巴搜索研发C++工程师笔试题的题目。
题1-45:声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数
指针,该函数的返回值是int,参数是int,正确的是( )。
A.int [10]p(int )
B.(int p[10])(int)
C.int ((p)[10])(int )
D.int ((int )[10])p
E.以上选项都不正确
正确答案: C
【解析】先看未定义标识符p,p的左边是,p表示一个指针,跳出括号,由于
[ ]的结合性大于,所以p指向一个大小为10的数组,即(p)[10]。左边又有一
个号,修饰数组的元素,(p)[10]表示p指向一个大小为10的数组,且每个数组
的元素为一个指针。跳出括号,根据右边的(int )可以判断((p)[10])是一
个函数指针,该函数的参数是int,返回值是int.所以选C.
下面这道题目摘自微软的笔试题。
题1-46:运行下面这段代码,输出结果是( )。A.12
B.11
C.Compile error
D.Garbage value
E.None of above
正确答案: D
【解析】const在的左侧,指针所指向的内容不可变,即p不可变;本题改变
的是指针p本身,但p++后不知道指针指向了哪里。所以p是没有用的值。
下面这道题目摘自小米的笔试题。
题1-47:int p = n;,那么p的值是( )。
A.n的地址
B.p的地址
C.n的值
D.p的值
正确答案: C
【解析】p指向n,p表示n的地址;p表示n的内容。拷贝原理:深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这
个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反
之,没有重新分配资源,就是浅拷贝。
拷贝原理是CC++中的基础知识,会作为基础考察点进行考察。例如下面这道摘
自奇虎360软件测试工程师笔试题的题目。
题1-48:关于“深拷贝”,下列说法正确的是( )。
A.会拷贝静态分配的成员对象
B.会拷贝动态分配的成员对象
C.会拷贝成员数据的值
D.A和C都对
正确答案: B
【解析】深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都
不会对另外一个对象造成影响。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不
同)。对其中任何一个对象的改动都会影响另外一个对象。
A和C都错在了同一个地方,即没有考虑静态成员。类的静态成员是所有类的实
例共有的,存储在全局(静态)区,只此一份,不管继承、实例化还是拷贝都是同
一份。
A中,静态成员属于成员数据,而C中,静态成员和局部成员都是静态分配的
(与动态分配对应),因此A和C中都包含了静态成员,所以不正确。
因此,D也不正确。
排序算法:C++中常见的排序算法有冒泡排序、选择排序、插入排序、快速
排序等。排序算法在很多领域中是十分重要的,尤其是大数据处理方面。一个优秀的算
法可以节省大量的资源,所以掌握各种排序算法的原理以及应用是十分重要的。下
面是摘自淘宝面试的题目。
题1-49:以下选项中,哪个选项的时间复杂度与记录的初始排列无关?( )
A.堆排序
B.插入排序
C.冒泡排序
D.快速排序
正确答案: A
【解析】由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最
坏还是平均时间复杂度均为O(nlog2n)。
空间复杂度上,它只有一个用来交换的暂存单元,也非常不错。不过由于记录
的比较与交换是跳跃式进行的,因此,堆排序也是一种不稳定的排序方法。
另外,由于初始构建堆所需的比较次数较多,因此,它并不适合待排序序列个
数较少的情况。
题1-50:下面程序的功能是输出数组的全排列。请将程序填写完整。正确答案:①k==m ②perm(list,k+1,m);
【解析】for循环的作用是先把index值为k的元素后面的元素依次与index为k
的元素交换,相当于得到index为k的元素可能的取值情况,然后使用递归得到
index为k+1的元素位置可能的所有取值。然而对index为k的位置元素进行取值的时
候,操作过后需要还原,避免取下一个值的时候出错,因此就有了第二个swap操
作。由上述分析可知,第一个空格应该为k==m,当index值到了m的时候输出即可,因为index为m时,后面已经没有元素与其进行对调。
函数重载:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一
范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数
的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算
功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不
同的问题。
函数重载在CC++的编程中也是广泛使用的一门基础技术,应该了解和掌握。例
如下面摘取了迅雷的笔试题目。
题1-51:为什么要使用函数重载?( )
A.为了提高速度
B.为了实现共享C.使用方便,提高可靠性
D.为了节约空间
正确答案: C
【解析】C++函数重载的作用如下。
①多个函数共用一个名字,减少对用户而言的复杂性。
②函数重载是指在同一作用域内,可以有一组具有相同函数名、不同参数列表
的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的
好处。
③类的构造函数跟类名相同,也就是说,构造函数都同名。如果没有函数重载
机制,要想实例化不同的对象,会特别麻烦。
面向对象编程(OOP):对象和类是面向对象编程里最为核心的概念。而面
向对象又具有三大特性:封装、继承、多态,除此之外还有众多的设计模式。
对于类和对象的理解是面向对象编程的核心,需要重点掌握,下面这道题是摘
自迅雷笔试题的题目。
题1-52:子类能够访问的成员属性是public、protected、private中的。
A.protected和private
B.public和protected
C.public和private
D.都能访问
正确答案: B【解析】private只能由该类中的函数或其友元函数访问。
1.1.2 中级要求
STL容器:STL(Standard Template Library,标准模板库)是惠普实验
室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和
David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在
C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码
从广义上讲分为三类:algorithm(算法)、container(容器)和
iterator(迭代器)。几乎所有的代码都采用了模板类和模板函数的方式,这
相比于传统的由函数和类组成的库来说,提供了更好的代码重用机会。
中高级CC++工程师应该了解STL容器、模板、模板类和模板函数等概念,并且
能够熟练使用,这也是技术公司面试的重点之一,例如下面这道迅雷面试的题目。
题1-53:针对下面选项中的几种STL结构,哪一种会在增加成员时可能使得原
有成员的存储位置发生变化?( )
A.list
B.map
C.set
D.vector
正确答案:D
【解析】vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。
vector是一块连续分配的内存,从数据安排的角度来讲,与数组极其相似,不同的
地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而
vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充
自身的容量。
vector的扩充机制是按照容器现在容量的一倍进行增长。vector容器分配的是
一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过
去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作
容器时,迭代器要及时更新。
UnixLinux核心编程:主要涉及UnixLinux内存管理、系统调用、进程
管理、进程通信以及多线程开发等技术。
UnixLinux系统的应用十分广泛,作为一名中高级的CC++开发人员,对于
UnixLinux的核心编程要有充分的了解并且要熟练掌握基础操作,这也是大部分互
联网公司考察的重点,例如下面摘自人人网研发笔试的题目。
题1-54:下列操作中,哪些会导致用户进程从用户态切换到内核态?( )
I.整数除以零
II. sin( )函数调用
III. read系统调用
A.仅I、II
B.仅I、III
C.仅II 、III
D.II和III
正确答案: B
【解析】用户态切换到内核态的三种方式如下。
①系统调用。
②异常。
③外围设备的中断。I是异常,III是系统调用。
下面这道题摘自奇虎360软件测试工程师笔试题。
题1-55:Linux系统下运行程序时,程序中未初始化的全局变量会被加载到以
下哪个内存段中?( )
A.BSS
B.STACK
C.DATA
D.TEXT
正确答案: A
【解析】BSS(Block Started by Symbol)通常是指用来存放程序中未初始化
的全局变量和静态变量的一块内存区域。特点是可读写,在程序执行之前BSS段会自
动清0。所以,未初始化的全局变量在程序执行之前已经为0了。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变
量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segmenttext segment)通常是指用来存放程序执行
代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域
通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也
有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):堆用于存放进程运行中被动态分配的内存段,它的大小并不固
定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被
动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆
中被剔除(堆被缩减)。
栈(stack):栈又称堆栈,用于存放程序中临时创建的局部变量,也就是说,我们在函数括弧{ }中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的
进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进
后出特点,所以栈特别方便用来保存恢复调用现场。从这个意义上讲,我们可以把
堆栈看成一个寄存、交换临时数据的内存区。
题1-56:可以用于线程之间同步的选项有( )。
A.事件
B.临界区
C.互斥量
D.信号量
正确答案: ABCD
【解析】
①进程间的通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件
槽、剪切板、动态数据交换、对象连接与嵌入、动态链接库、远程过程调用等。
②事件、临界区、互斥量、信号量可以实现线程同步。
MySQL:MySQL是一个关系型数据库管理系统,关联数据库将数据保存在不
同的表中,而不是将所有数据放在一个大仓库内,这样就提高了速度并增强了
灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。由于
其体积小、速度快、总体拥有成本低,尤其是开放源码的特点,一般中小型网
站的开发都选择MySQL作为数据库。
MySQL是在互联网应用中十分流行的数据库,无论是CC++还是使用其他语言的
编程人员都会接触,对于数据库的基础操作以及SQL语句都应熟练掌握。下面摘取了
阿里巴巴研发工程师的笔试题。
题1-57:在MySQL主从结构的主数据库中,以下哪种日志不会出现?( )A.中继日志
B.Redo log
C.错误日志
D.事务日志
正确答案: A
【解析】中继日志(relay-log)是MySQL备库从主库bin-log读取的日志。
题1-58:关系数据库中,( )用来表示实体间的联系。
A.树状结构
B.网状结构
C.二维表
D.属性
正确答案: C
【解析】关系模型实体间的敏感词采用二维表来表示,简称表。选项B为网状模
型实体间的敏感词,选项A为层次模型实体间的敏感词,选项D属性刻画了实体。
1.1.3 高级要求
MFC:微软基础类库(英语:Microsoft Foundation Classes,简称
MFC)是一个微软公司提供的类库(class library),以C++类的形式封装了
Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作
量。其中包含了大量的Windows句柄封装类和很多Windows的内建控件和组件的
封装类。
MFC是一个十分庞大而复杂的类库,对于MFC的理解和应用应该是高级C++工程
师所掌握的,例如下面这道摘自奇虎360工程师笔试题的题目。题1-59:MFC通过哪个类将一个界面分成两个部分?( )
A.COlePFrameWnd
B.CMiniFrameWnd
C.CMDIFrameWnd
D.CSplitterWnd
正确答案:D
【解析】CSplitterWnd类提供分离窗口的功能,使一个窗口包含多个方格。
Win32核心编程:Win32是指Microsoft Windows操作系统的32位环境,与Win64都为Windows的常见环境。学习Win32多线程不仅对理解Win32本身有
重要意义,而且对学习和领会其他操作系统也有触类旁通的作用。
对于高级C++工程师来说,Win32核心编程是需要掌握的,也是面试时会考察的
难点,例如下面这道摘自阿里巴巴校招研发试题的题目。
题1-60:32位操作系统中,下列类型占8个字节的为( )。
A.unsigned int
B.short int
C.int C long
D.long long
E.int
F. char
正确答案:D
【解析】可以用sizeof(int)、sizeof(float)等来测试字节数。在32位系统中,short占2字节,int、float、long都占4字节,double和long long占8字
节。
题1-61:给出如下代码:
在32位系统中的输出是( )。
A.0
B.4
C.23
D.24
正确答案:B
【解析】此题的正确答案应该对32位系统是4,对64位系统是8。数组作为函数
的参数是会退化为函数指针的,想想看,数组作为函数参数的时候经常是需要传递
数组大小的。
下面这道题目来自迅雷C++笔试题。
题1-62:编程实现在一亿个数中找最大的1000个数,要求效率高、占用内存
少。函数原型为find max data(int source data,int max data),其中,source data是存放一亿个数的数组,max data用于存放其中最大的1000个数。
【参考答案】题1-63:下面的代码,在32位小端机器上的输出是什么?( )
A.0x201, 0x605, 0x4030201, 0x8070605
B.0x201, 0x605, 0x807060504030201, 0x0C.0x201, 0x403, 0x807060504030201, 0x0
D.0x102, 0x506, 0x102030405060708, 0x0
正确答案:B
【解析】小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构
为小端模式。
pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为
0x0201。
pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进
制为0x05 0x06,对应的16进制数为0x0605。
pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制
形式为0x807060504030201。
pint + 2占用4个字节,指向的array数组的下标为8的元素,而下标为8~11的
元素没有指定数组的初始化值,默认为0,因此(pint + 2)对应的16进制为0。
架构设计:架构设计是一系列相关的抽象模式,用于指导大型软件系统各
个方面的设计。
对于高级软件工程师,架构能力是各大公司招聘时着重考察的点,能够对一个
项目进行有效的架构设计是十分重要的,例如下面摘取了某知名互联网公司的笔试
题目。
题1-64:关于BS架构软件与CS架构,下列选项中错误的是( )。
A.CS可以使用任何通信协议,而BS这个特殊的CS架构规定必须实现HTTP协
议
B.BS属于CS,浏览器只是特殊的客户端
C.CS架构维护和升级方式简单D.CS架构的劣势还有高昂的维护成本且投资大
正确答案:C
【解析】
①BS只能用HTTP协议。
②CS成本高,维护困难。
软件测试:软件测试(Software Testing)是一种用来促进鉴定软件的正
确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与
预期输出间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对
程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求
进行评估的过程。
软件测试对于C++工程师来说是应该掌握的知识点,对于任何项目都需要足够的
测试来保证软件的质量。例如下面摘取了某知名互联网公司的笔试题目。
题1-65:设计系统测试计划需要参考的项目文档有哪些?( )
A.软件测试计划
B.可行性研究报告
C.软件需求规范
D.迭代计划
正确答案:ACD
【解析】软件需求是软件开发之前做好的,软件开发是根据软件需求做的,那
么软件测试自然也需要参考该文件。迭代计划是软件的某个周期的计划,自然也需
要参考。可行性是软件开发前做好,用于证明该计划可行的,没有必要参考。
编程实例题1-66:将1~2(2n+1)2(2n+1)的数填到2n+1阶的数独中,使得每行、每列和
每条对角线上的数字和都相等。
程序代码如下:题1-67:输入三个字符串,请输出三个字符串的最长公共前缀。
程序代码如下:
题1-68:给定一个数组,该数组含有n+1个元素,该数组中的元素值范围为
1~n,请找出数组中的重复元素。
程序代码如下:题1-69:写一个程序,该程序可按标准输出2015年的日历,并且星期和日期是
一一对应的。
程序代码如下:题1-70:在插入排序中,假设序列是给定的,那么最少需要移动的次数是多
少?请编写一个程序来求出这个次数。
程序代码如下:题1-71:输入1000000个无序的自然数(可能重复),输出第一个没有出现的
自然数。
程序代码如下:1.2 专家介绍
李国松
腾讯百度
高级C++工程师
李国松专注于互联网移动互联网方向,拥有八年互联网相关的技术开发和项目
管理经验。
先后在腾讯、百度等知名互联网企业供职,主要从事互联网领域基础服务和产
品的技术研发、运营工作,具有丰富的高并发大容量互联网应用的架构设计和开发
经验。
大学毕业后,接触Windows平台上的嵌入式开发(WinCE)和PC端休闲游戏。之
后工作重心转移,进入腾讯后从事后台开发.2013年转战就职于百度.2015年开始尝
试在物联网平台(IoT)方面创业,现在处于自主创业阶段。
在技术方面,从Windows客户端开发转至Linux后台开发,有过运维、QA团队的
丰富工作经历。开发语言以C++为主,也有过PHP、Python的开发经验,现在使用
Golang较多,目前正在涉猎前端技术和产品设计。
林 飞
搜狗 高级经理
林飞毕业于北京大学,现在搜狗公司担任高级经理。拥有10年的互联网从业经
验,完成了搜狗某部门测试开发团队的搭建与管理,以及各类自动化测试框架和平
台开发,并且面向业界开源了Cynthia缺陷管理系统,免费开放项目协作平台
(www.effevo.com)。
大学毕业后的第一份工作是在事业单位,职责为开发与产品配套的自动化测试
框架。这也对林飞后来选择测试开发的职业道路起到了决定性影响。这一阶段的技
术提升主要集中在代码架构、开发文化以及编程风格等方面。后来,他进入了搜狐研发中心(现搜狗)工作,在搜狗的工作经历使他在技术
的专业性和深度上,以及从系统化思想到实战的演练上有了较大的成长。他先后开
发了几个比较重要的自动化测试框架,使用了C++、VBScript、Python、C、PHP、JavaScript等多种语言和技术。林飞对语言无任何偏向性,认为选择合适的
语言完成应该完成的工作最重要。
所在团队进行结构调整后,开始担任团队负责人,招聘成为工作中非常重要的
一个职责,为此,他研究了多种面试题目,也会在闲暇时间编写各种类型的算法程
序。
刘怀军
美团
高级技术专家
刘怀军毕业于西安交通大学,并且获得了计算机专业和数学专业双学位;之后
于2007年毕业于哈尔滨工业大学信息检索研究室,获得了硕士学位。
其在研究生毕业后就职于腾讯,负责过多个大数据算法项目和团队,其中包
括:知识社区反垃圾反作弊、知识推荐;搜索个性化推荐;搜索查询分析和排序;
微信搜索和语义智能等项目。
2015年他加入美团,担任高级技术专家,负责大数据方向的项目研发和团队管
理。在大数据算法领域有9年的工作经验,发明专利20余项,并且担任中文信息学会
社会媒体处理专委。刘怀军擅长大数据算法、机器学习、数据挖掘、NLP等,在工作
中主要使用C++编程语言。
1.3 专家意见
关于技术招聘
Q:在招聘时,您会看重哪些技术能力?
【搜狗 林飞】对于应届生来说,基本功的扎实与否是一个很重要的衡量因素。这里的基
本功主要指两方面:一是对语言的深刻理解以及熟练应用,譬如了解内存对齐的
机制对类对象大小的影响,多重继承会对代码的可维护性带来哪些影响等;二
是能够灵活应用各种常见的数据结构和算法解决实际项目中遇到的各种难题。
【美团 刘怀军】
作为一名高级编程人员,首先要有能够灵活快速地切换不同语言进行开发
的基础编码能力,而对于编程语言应有着更深刻的理解,例如语言的底层原
理、库函数STL内部原理等,并且对于编程思想应该有着更深层次的掌握,比
如面向对象的编程思想、常用的设计模式原理等。而对于特定的技术岗位,更
要熟练掌握相应的技能,比如数据岗位,需要大数据开发技术,像是Hadoop、Spark等。
【腾讯百度 李国松】
招聘人才时,我们不光要考察基础理论知识的掌握,更看重实践能力。编
码能力的扎实与否至关重要,例如在实际编码中对于错误的编码能否快速修
正,能否对众多的设计模式运用自如等。而在编写算法的过程中,是否拥有一
个清晰明确的思路,以及面对不熟悉、不了解的问题时应如何去应对,这些都
是我们所看重的。
Q:那么我们当前职位所对应的需掌握的技术范畴有哪些呢?
【搜狗 林飞】
对于大部分C++相关的职位来说,C++语言基础、算法、数据结构都是必备
的能力。不同的平台对人才也会有差异化的需求,例如PC端职位会着重考察人
才对Windows消息机制的理解,Windows编程经验是否丰富;测试开发职位会关
注应聘者是否编写过自动化测试框架,该框架的复杂性、架构合理性以及带来
的收益,或者是否具备各类测试框架的使用能力。
【美团 刘怀军】
对于数据岗位,我们需要面试者掌握大数据方向的相关技术,像是数据库、数据仓库、数据挖掘、数据开发技术、系统架构技术等。而对于更高级的
数据方面工程师,我们还会考察其对数据的敏感度,以及数据分析能力(通过
数据,发现业务、项目相关的核心结论及问题)等。
Q:现在公司正急需哪方面的人才呢?需要掌握哪些技术?
【腾讯百度 李国松】
腾讯主要以C++为主,其余部分部门使用Java。而百度以PHP为主,基础架
构部分以C++为主。
对于后台开发部门,主要还是以业务开发及架构设计为主。这需要对面试
者的基础语言掌握能力、编程能力、新技术、新框架的学习吸收能力,以及架
构设计或者对于设计模式的理解等方面有较高的要求。而且目前随着智能手机
的广泛应用,手机APP的普及以及前端技术的快速发展,对于客户端和前端开发
的技术人员需求也越来越大。
Q:公司招聘技术人才的流程是怎样的?主要有哪些形式?
【搜狗】
搜狗主要通过校招和社招来进行人才招聘。
校招时会到全国各大城市搞宣讲会和笔试面试。搜狗的笔试题主要由选择题和
编程题构成。选择题包含C++、Java、Windows、数据结构、Web、测试等各种类
别,每个分类大概有10~12道;编程题通常有两道,绝大部分职位都必做编程题。选
择题方面,不同的职位会选择不同的类别组合,如Windows开发工程师会选择C++、Windows这两类;测试开发工程师会考察C++、数据结构。搜狗公司这几年已开始启
用线上笔试,直接让面试者上机作答。笔试通过后,会根据各地的笔试整体成绩安
排面试官到各城市进行面试,面试通常有2~4轮。
社招除了从公司HR渠道获取简历以外,各用人部门也会在多个招聘网站和论坛
社区里发JD(Job Description)获得更多简历。面试过程中偶尔也会让面试者上机
编程,考察实际动手能力。【腾讯百度】
一般流程是HR收集、初次筛选过简历后,会把简历递交给研发团队,由技术人
员审查合格后通过电话联系候选人,会有一个电话面试,初步了解候选人的技术基
础后,邀请其到公司进行面试。
技术人员的面试一般先由中级工程师进行初面,测试一些基础题目,然后会让
高级工程师面试,了解面试者在算法、架构等方面的掌握程度,然后会由负责管理
的经理或总监进一步面试,进行一些性格和沟通能力上的了解。具体的流程因公司
和部门不同会有差异,每位负责面试的工程师的风格差异也比较大。
【美团】
公司的招聘形式分为社招、校招和实习生招聘。社招主要是对有工作经验的人才进行招聘;校招主要面向在校即将毕业的大学
生进行招聘;而实习生招聘,主要为在校学生提供在企业进行锻炼的机会。
主要流程如下。
(1)简历筛选(通过简历初判是否符合岗位的需求)。
(2)技能面试:技术面试(考察专业能力、工程能力、架构能力),软素质面试
(考察沟通、规划、管理等方面的能力)。
(3)综合面试:考察全局、宏观思考问题的能力。
(4)HR面试:考察文化、价值观的认可度,跳槽意图等。
1.4 QA专访
搜狗 林飞篇
Q:怎样去定义一个好程序员?能够加入搜狗的程序员需要具备什么样的条
件?
首先要有扎实的基本功,这是谈任何其他能力的基础。其次就是要有较强
的学习能力和逻辑思维能力,对于自己不了解的问题,如果能够在他人的引导
和提示下启动思维,举一反三,那么这个人的能力一定是值得肯定的。还有一
点就是抗压能力。目前互联网行业正在飞速发展,新技术、新知识正不断地涌
入技术领域,在这样的大环境下,要能够抵抗住信息的冲击,并且不断地吸收
新的技术为己所用,而不是被压力击垮,这样的人才才能得以任用。Q:找到合适的人才后,如何培养人才才能让具备潜力的人才快速成长?
通常来说,除了人才自身的因素外,环境因素和社交因素也能够影响到人
才的成长。为此,我们实行一些事后看来还算是有些效果的制度,能够较好地
营造积极向上的学习环境。在通过管理手段保证制度实行的过程中,一些员工
逐渐脱颖而出,并促进了其他员工的积极性。其中专家制度、知识库制度、技
术分享制度使得员工能力得到了快速的提升。专家制度促使人才深入了解特定
的知识领域,锻炼一个人思维的系统性和深度;知识库制度是对日常工作中的
一些技术点的总结,是对技术网的细节完善;技术分享制度锻炼的是总结能
力、表达能力和沟通能力,鼓励员工之间不同思考方式的碰撞和交流。
Q:那您在工作中都有哪些印象深刻的经历,之后这些问题都是如何解决的
呢?
在承担平台测试开发任务的过程中,通常面临的考验是短时间内完成比较
复杂的任务。让我印象比较深的是刚来搜狗时的第一个任务。之所以印象比较
深,原因有如下两点:第一点是当时刚从事业单位出来,需要适应快节奏的工
作方式,压力会比较大;第二点是该任务比较复杂,逻辑复杂,技术上也有一
定的难度。这个任务是要开发一个测试搜狗浏览器稳定性的专项工具,该工具
有如下几个基本功能。
(1)解析脚本,转化成对浏览器的各种操作。
(2)持续对搜狗浏览器进行各种操作,例如浏览网页、刷新页面、前进、后退、新建和关闭等。
(3)实时监控浏览器的资源占用情况和崩溃情况,在测试完毕后能够展示
资源占用情况,计算出浏览器崩溃和异常的时间点。
(4)能够回放上一次测试对浏览器的所有操作。
实现该工具时,采用C开发了自动化测试框架,完成用户界面和脚本解
析、记录和显示资源占用等功能,使用C++实现COM服务器和BHO,COM服务器用
于连接测试框架和BHO,BHO在浏览器进程空间负责对浏览器进行各种操作。具
体编程时,还应用到了Hook、线程注入、GDI+、COM套间、多线程同步、XML、资源管理等多种技术,其中,不少技术都是现学现用。另外,工具要对目标程
序进行长时间测试,开发时使用的COM、WinForm都是产生资源泄漏的温床,在
这方面也要花费一定的精力。
后来也同样接受过几个比较复杂且时间比较紧急的任务,大体上都采用了
类似的解决办法,下面分享给大家几条比较通用的技巧。
(1)制定详细的开发计划。最好细分到1天为单位,建议设定几个里程
碑。按照计划进行开发,无论如何都要确保每天完成计划中的任务。
(2)自信心很重要。即使面对复杂的任务,也要相信自己肯定能完成。
(3)一些逻辑复杂的代码可以采用测试驱动的方式来开发。这样,即使对
代码进行了改动,也会心里有底。
Q:在技术团队中,作为高级经理的角色职责是什么?
作为团队负责人,最重要的也是容易忽略的一点,就是要持续思考团队的
发展战略并推进实施。我们团队的发展战略其核心思想是开放与协作。具体实
践如下。
开放工作职责。以公司利益为出发点,以提高团队工作效率为中心,发掘
更多工作内容。从实际结果来看,我们不拘泥于已有的自动化测试职责,扩展
后的工作内容涵盖了自动化、单元测试、框架和平台开发、OA、协助其他团队
开发产品代码、开发公司新产品等多个方面。
尽量使用当前比较流行、确实有价值的技术,也尝试将我们自己的工作成
果分享给业界。两年前我们团队开源了小有名气的缺陷管理系统Cynthia,最
近也推出了免费使用的项目协作平台effevo。
在确定团队发展战略后,需要找到合适的人才来执行。因此,招聘就成了
团队负责人的一个非常重要的职责。每个团队都要定义“合适人才”的标准。
由于工作内容多样化,我们比较看重的是人才的潜力,项目经验反而求其次。
对人才潜力的考察,我们采用了算法题和逻辑题来进行。应试者能独立完成题
目解答最好,如果不能独立完成,则在面试官的提示下能够顺利解决问题也算OK。
作为团队负责人,要持续地在这些重要职责方面进行思考和总结,提升自
己这几个方面的专业素质,保证团队的良性运转和长远发展。
腾讯百度 李国松篇
Q:在工作中您都经历了哪些印象深刻的事情?
我主要从事后台开发和运维相关的工作,所以以开发为例,选取一个例子
与大家分享下一般大公司处理问题的基本思路,事件如下(对当时的问题做了
一些简化,主要介绍一下思路)。
我曾经参与优化一款知名APP的后台收藏功能。当时遇到一个问题,有用户
反馈在收藏夹中收藏失败,需要后台开发同事跟进处理。那么,我们一般是如
何分析和解决类似问题的呢?
首先,我们会先找到收藏功能的编号或API,在日志中使用grep找到所有
该请求失败的日志(系统会保留所有后台应用的日志并备份到一个统一的服务
器或集群中,方便后续开发和运维人员查询并追踪问题),如果客服能联系到
用户,可以直接拿到用户id进行查询,就更加方便了。
然后,我们对比失败的日志和用户反馈的时间节点,进一步检查请求失败
的原因(第一级服务获取请求失败,可能会对应后台多个其他服务)。经分
析,发现请求失败的原因是由于早期开发的版本对用户使用行为的考量不够严
谨,导致服务上线一段时间后出现部分用户有超过5000甚至更多收藏的情况,而超出该阈值后,该用户的收藏列表拉取速度会急剧下降,甚至会经常出现拉
取列表失败的情况。
其实这个问题简单来说就是一个数据量大了之后需要增加缓存的问题,即
使是对于小站而言,都是相对常见的问题,简单地说,解决思路就是增加缓
存。那么是不是我们直接添加一个缓存就可以了呢?大公司一般都是如何来处
理类似问题的呢?
我们需要先确认一下需要缓存的数量(包括单条缓存大小和预计缓存总量),根据缓存的总量和单条数据量来对缓存进行选型(如常见的开源缓存
memcache、redis、mongodb,以及自研缓存等),那么我们需要考查的指标
包括单机缓存的读取写入速度、单机缓存容量及内存利用率、缓存是否支持分
布式部署、是否支持水平扩展、运维难度(运维人员对该系统的熟悉程度,如
是否有大规模大容量运维经验、是否有完备的社区或内部团队支持)等多个考
查维度。
当我们完成缓存的初步选型后,会进行系统改造的详细设计(可能以文档
或邮件形式),组织开发团队的高工进行设计评审,敲定方案。
方案确定后,就可以开始编码了。编码完成后,需要编写单元测试并进行
初步的自测,之后交给测试人员来进行更加系统的测试;测试通过后,就可以
交付运维人员上线了(上线过程也需要考虑如何进行处理负载均衡,以保证服
务在上线过程中一直处于可用状态)。
如果上线正常,后台开发人员一般会在一周内持续观察线上日志的情况,确保线上的功能正常。
Q:对于技术出身的创业者,他们有哪些优势和劣势?
技术出身的创业者,一般逻辑思维能力会比较强,思维也会比较缜密。他
们对于技术方面的重视程度也会较高,对于新技术的接受程度可能也会更高一
些,有利于提高公司整体服务的质量,能够为日后的产品推广做好充足的准
备。
不过技术人员普遍比较内向,不太擅长沟通和推广,这可能会成为企业发
展的短板。另外在创业方向的选择方面,可能会更多地做技术方面的考虑,而
在一定程度上忽视用户的真实需求。
Q:可以成功入职的程序员需要具备什么样的条件?
应该从硬件和软件两个方面来考量。
硬性条件当然是要有过硬的技术基础,头脑灵活,可以独立分析并解决难
度相对较大的问题。如果先前的项目经验与公司现有的项目匹配度较高,会更好。
软性条件主要是指沟通能力、理解能力,以及个人的积极主动性,与公司
的风格是否匹配(所谓公司认同感)等。创业公司甚至会要求应聘者与所有团
队成员见一面,聊聊,以判别能否良好地融入团队。
对于后台开发人员来讲,要求对后台服务系统的整个运作过程有深入的理
解,对影响性能的地方能做到“一切尽在掌握”,如计算机的各个部分是如何
协作完成的,哪些地方会是瓶颈,预计能达到什么样的负载水平,了解各个组
件的性能。对于自己日常工作负责的服务,要求在系统架构设计阶段就能够根
据系统架构和硬件性能大致预测出系统的负载能力。
在日常工作中,要求能够根据遇到的问题,主动思考本部门的运营机制,理解服务需要达到的可用性要求。在进行技术选型时,能与相关同事积极沟
通,并具备及时重构的能力。
Q:怎么培养一个年轻的程序员呢?
对于计算机相关专业的同学,上课听讲,把操作系统、编译原理、计算机
网络、计算机体系结构等重要的基础课程学好,会对日后进入公司并开展工作
有很大的帮助。
对于非计算机相关专业或毕业后想转行做程序员的同学,建议从实际项目
开始学习,先了解基本操作和使用方法,之后有时间的话,努力学习计算机原
理知识会有很大的帮助。多向公司老员工请教,多看公司先前的项目代码,在
实际项目中学习。
对年轻人来讲,主要还是看个人的资质、工作目标、理想、态度,而技术
方向则是相对次要的。
美团 刘怀军篇
Q:怎么才可以加入美团?
能够成功入职的程序员,需要具备几项条件。(1)专业技能过硬。对于程序员,必须具备开发技能,精通相应岗位的开
发语言,如C++Java等。此外,还须有岗位需要的专业技能,比如大数据算法
岗位,需要精通各项算法,精通大数据并行开发。
(2)软素质优异。做事要主动积极,沟通要顺畅,更要团结协作。
(3)高度认可公司文化和价值观。
(4)未来有很好的成长潜力。自己对未来有好的成长规划,并付诸实施。
Q:怎么培养一个年轻程序员比较好呢?
对于一个程序员的培养,分为两方面:企业培养、自我培养。
(1)企业培养:人才是企业最重要的资源。每个企业都会投入大量的人
力、财力进行人才培养。对于程序员岗位,企业的培养分为如下几个方面。
①培训体系。公司内会有完善的培养制度,从内部专家到外部聘请,开展
各个方向的技术培训课程。
②导师制。对于新入职的员工,不论校招还是社招,都会由经验丰富的导
师带领和指导。
③培养计划。Leader和导师定期会跟员工制定成长计划,并监督执行,回
顾执行效果,进一步完善和改进。
(2)自我培养:个人的成长主要靠自我培养。俗话说:师傅领进门,修行
在个人。首先,个人要有明确的兴趣和未来规划,并主动学习相关技能。其
次,一定要通过多做项目,做深项目,反复思考和总结,来提升个人能力。另
外,一定要多向大牛请教和学习,站在巨人的肩膀上才能看得更远。
Q:您怎么看程序员这个行业?对年轻程序员有哪些建议?
程序员是互联网大潮中一支浩浩荡荡的队伍,支撑着整个互联网行业的高
速发展。这是一个十分辛苦的行业,但也是一个幸福的行业。辛苦之处在于加
班比较多,私生活比较少。幸福之处在于,你们是互联网的花朵,是互联网的希望和未来。选择程序员这个行业,未来就在你自己手上,可以充分发挥自己
的聪明才智,成就一番事业。
作为一个老程序员,对年轻程序员们,有几个衷心的建议。
(1)不要怕苦怕累,要趁着年轻,多做项目,锻炼自己的能力。
(2)一定要不断学习。对技术的执着追求,是一个程序员的基本素养。一
定要不断学习新技术,通过各种有效方法进行学习,不断追赶行业发展的潮
流。
(3)形成个人能力矩阵。技术这个领域其实是需要向深度和广度全面发展
的。深度是指自己有专长的技术和技能,要有深入的理论和实战积累,才能形
成自己的方法论。另一个是广度,对上下游的其他技能岗位,也需要熟悉和掌
握基本能力,这样才能很好地实现跨团队协作。
(4)培养自己的职业素养。企业以利润为目标,每个职员都要将企业目标
作为个人工作目标,保持最好的状态,完成上级给予的任务。
第2章 Java
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了
C++里难以理解的多继承、指针等概念,因此,Java语言具有功能强大和简单易用
两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理
论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植
性、多线程、动态性等特点。使用Java语言,可以编写桌面应用程序、Web应用程
序、分布式系统和嵌入式系统应用程序等。
2.1 Java工程师标准
2.1.1 初级要求Java基础:包括Java编程基础及规范、面向对象的特性(继承、封装、多
态等)、核心API等。
作为一名合格的Java工程师,对于Java的基础知识是一定要牢牢掌握的,大部
分互联网公司都会考察基础知识中一些易被忽略的知识点。下面这道题摘自腾讯春
招的题目。
题2-1:下列说法错误的有( )。
A.在类方法中绝对不能调用实例方法
B.在类方法中可用this来调用本类的类方法
C.在类方法中只能调用本类中的类方法
D.在类方法中调用本类的类方法时可直接调用
正确答案:A B C
【解析】
A:可以在类方法中生成实例对象再调用实例方法。B:类方法是指类中被
static修饰的方法,无this指针。C:类方法是可以调用其他类的static方法的。
题2-2:下面这道题摘自腾讯Java工程师笔试卷。
下列语句中正确的是( )。
A.Java程序经编译后会产生DLL
B.Java程序经编译后会产生machine code
C.Java程序经编译后会产生byte code
D.以上都不正确
正确答案:C【解析】
Java字节码是Java源文件编译产生的中间文件,Java虚拟机是可运行Java字节
码的假想计算机,Java的跨平台性也是相对于其他编程语言而言的。Java的编译过
程是,先是编写好Java源程序,即扩展名为Java的文件,然后由Java编译程序将源
程序编译为Java字节码文件,就是class文件,然后在Java虚拟机中执行。机器码
是由CPU来执行的。Java编译后是字节码,电脑只能运行机器码。Java在运行的时
候把字节码变成机器码。
题2-3:下面这道题摘自腾讯Java工程师笔试卷。
Java是从( )语言改进并重新设计的。
A.Pascal
B.C++
C.BASIC
D.Ada
正确答案:B
【解析】Java是类C语言,从C++改进而来,去掉了指针和多继承,采用自动垃
圾回收等。
题2-4:有关Java final的基本规则,下列描述中错误的是( )。
A.final修饰的局部变量即为常量,只能赋值一次
B.final修饰的成员变量只允许赋值一次,且只能在类方法中赋值
C.final修饰的方法不允许被子类覆盖
D.final修饰的类不能被继承
正确答案:B【解析】final修饰的方法,不允许被子类覆盖。final修饰的类,不能被继
承。final修饰的变量,不能改变值。final修饰的引用类型,不能再指向别的东
西,但可以改变其中的内容。
题2-5:关于Java抽象类的说法中,哪个是正确的?( )
A.某个抽象类的父类是抽象类,则这个子类必须重载父类的所有抽象方法
B.可以用抽象类直接去实例化创建对象
C.接口和抽象类是同一回事
D.一个类只能继承一个抽象类
正确答案:D
【解析】
A:非抽象类继承抽象类,必须将抽象类中的方法重写,否则需将方法再次声明
为抽象。所以这个方法还可再次声明为抽象,而不用重写。而用重载也错了,重载
是在同一个类中,重写、覆盖才是在父子类中。
B:抽象类无法实例化,无法创建对象。现实生活中也有抽象类的例子,比如说
人类是一个抽象类,无法创建一个叫人类的对象,人继承人类来创建对象。况且抽
象类中的抽象方法只有声明,没有主体,如果实例化了,又如何去实现调用呢?
C:抽象类可以没有抽象方法,接口是完全的抽象,只能出现抽象方法。
D:因为类是单继承的,类继承了一个抽象类以后,就不能再继承其他类了。
题2-6:执行test函数后,屏幕显示的结果为?( )A.127 127
B.128 127
C.129 128
D.以上都不对
正确答案:D
【解析】 public void add(Byte b){ b=b++; }这里涉及Java的自动装包
自动拆包(AutoBoxing UnBoxing)。 Byte的首字母为大写,是类,看似是引用
传递,但是在add函数内实现++操作,会自动拆包成byte值传递类型,所以add函数
还是不能实现自增功能。也就是说add函数只是个摆设,没有任何作用。 Byte类型
值大小为128~127之间。对于add(++a);这里++a会越界,a的值变为-128。对于
add(b);前面说了,add不起任何作用,b还是127。
题2-7:关于以下程序代码的说明,正确的是( )。A.5行不能通过编译,因为引用了私有静态变量
B.10行不能通过编译,因为x是私有静态变量
C.程序通过编译,输出结果为:x=103
D.程序通过编译,输出结果为:x=102
正确答案:D
【解析】不写在方法里面的变量叫作成员变量,也叫全局变量。定义了成员变
量后,在同一个类里的每个方法都可以使用,而不局限在单个方法里,而这里的成
员变量是用static修饰的,所以它是一个类变量,类变量资源共享,所以在第一次
实例化后,x+1后x=101,第二次实例化hs2.x++就是101+1=102,之后的hs1又实
例化一次,做++操作x=103,最后做--操作,最终结果为102。
题2-8:以下选项中,循环结构合法的是( )。
A.B.
C.
D.
正确答案:C
【解析】
A中i没有初始化。
B是死循环,j为非零,while循环的条件一直满足,就会一直循环下去。
D中当j增加到3的时候就执行continue loop,而代码中没有标明loop标志。
题2-9:类Test1、Test2定义如下:
将以下哪种方法插入行6是不合法的?( )A.float aMethod(float a,float b){ }
B.public int aMethod(int a,int b)throws Exception{ }
C.public float aMethod(float p,float q){ }
D.public int aMethod(int a,int b)throws IOException{ }
正确答案:A
【解析】子类重写了父类的方法。父类中定义的方法为public。也就是说,子
类重写这个方法的时候必须也为public。当子类重写父类的方法时,访问权限不能
变小,但可以变大。例如父类的方法为default的时候,子类重写后为public则是
正确的。
题2-10:关于以下程序段,正确的说法是( )。
A.行4与行6都将执行
B.行4执行,行6不执行
C.行6执行,行4不执行
D.行4、行6都不执行
正确答案:C
【解析】String重写了Object的equals方法,重写的这个方法就是比较字符
串的内容。而==比较的是内存地址,对于字符串来说,都要用equals来比较,因为
比较一个String的地址是否相同没有意义。s2是新创建的对象,与s1的内存地址是
不同的,因此执行行6。题2-11:以下哪个关键字可以用来为对象加互斥锁?( )
A.transient
B.static
C.serialize
D.synchronized
正确答案:D
【解析】synchronized是Java语言的关键字,当它用来修饰一个方法或者一个
代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。①当两个并
发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个
时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块
以后才能执行该代码块。②然而,当一个线程访问object的一个
synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非
synchronized(this)同步代码块。③尤其关键的是,当一个线程访问object的一
个synchronized(this)同步代码块时,其他线程对object中所有其他
synchronized(this)同步代码块的访问将被阻塞。④上个例子同样适用其他同步
代码块,也就是说,当一个线程访问object的一个synchronized(this)同步代码
块时,它就获得了这个object的对象锁,结果,其他线程对该object对象所有同步
代码部分的访问都被暂时阻塞。⑤以上规则对其他对象锁同样适用。
题2-12:以下关于构造函数的描述错误的是( )。
A.构造函数的返回类型只能是void型
B.构造函数是类的一种特殊函数,它的方法名必须与类名相同
C.构造函数的主要作用是完成对类的对象的初始化工作
D.一般在创建新对象时,系统会自动调用构造函数
正确答案:A【解析】构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没
有返回值,也不能用void来修饰。
题2-13:下列哪些语句关于Java内存回收的说明是正确的?( )
A.程序员必须创建一个线程来释放内存
B.内存回收程序负责释放无用内存
C.内存回收程序允许程序员直接释放内存
D.内存回收程序可以在指定的时间释放内存对象
正确答案:B
【解析】
A:程序员不需要创建线程来释放内存。
C:不允许程序员直接释放内存。
D:不一定在什么时刻执行垃圾回收。
题2-14:若需要定义一个类域或类方法,应使用哪种修饰符?( )
A.static
B.package
C.private
D.public
正确答案:A
【解析】类域即静态成员,类方法即静态方法。
题2-15:有以下程序片段,下列哪个选项不能插入到行1?( )A.import java.awt.;
B.package mypackage;
C.class OtherClass{ }
D.public class MyClass{ }
正确答案:D
【解析】public修饰的类名必须与Java文件名一致,所以一个.java文件中不
能出现两个或两个以上的公有类。
题2-16:以下哪项是接口的正确定义?( )
A.
B.
C.D.
正确答案:D
【解析】接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口
体由常量定义和方法定义两部分组成。修饰符可选,用于指定接口的访问权限,可
选值为public。如果省略则使用默认的访问权限。接口名为必选项,用于指定接口
的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends父接口名列表:可选项,用于指定要定义的接口继承于哪个父接口。当使
用extends关键字时,父接口名为必选参数。方法:接口中的方法只有定义而没有
被实现。
题2-17:下面哪个函数是public void aMethod{ ... }的重载函数?
A.void aMethod( ){...}
B.public int aMethod{...}
C.public void aMethod ( ){...}
D.public int aMethod ( int m){...}
正确答案:D
【解析】重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称
相同而参数形式不同。重载的规则如下。
①在使用重载时只能通过相同的方法名、不同的参数形式来实现。不同的参数
形式可以是不同的参数类型、不同的参数个数、不同的参数顺序(参数类型必须不
一样)。②不能通过访问权限、返回类型、抛出的异常进行重载。
③方法的异常类型和数目不会对重载造成影响。
题2-18:A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明:
以下哪个说法是正确的?( )
A.只有第1行能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行、第2行和第3行的声明都是正确的
正确答案:D
【解析】子类继承父类的所有属性和方法,B为A的子类,用A可以实例化B;C为
B的子类,用B可以实例化C;间接地,C也是A的子类,故有A a2 = new C( );。
题2-19:有如下代码段:
其中,方法unsafe将抛出IOException,可将以下哪项填入第1行?( )
A.public IOException methodName
B.public void methodName
C.public void methodName throw IOExceptionD.public void methodName throws IOException
正确答案:D
【解析】为了明确指出一个方法不捕获某类异常,而让调用该方法的其他方法
捕获该异常,可以在定义方法的时候,使用throws可选项,用以抛出该类异常。
语法格式:
题2-20:Java的字符类型采用的是Unicode编码方案,每个Unicode码占用个比特位。
A.8
B.16
C.32
D.64
正确答案:B
【解析】一个Unicode字符占两字节,一字节是8位,所以,每个Unicode码占
用16个比特位。
题2-21:给出下面的代码,关于该程序,以下哪个说法是正确的?( )
A.编译时将产生错误B.编译时正确,运行时将产生错误
C.输出零
D.输出空
正确答案:C
【解析】int类型的数组在没有初始化时默认值为0。
题2-22:在使用interface声明一个接口时,只可以使用( )修饰符来修饰该
接口。
A.private
B.protected
C.private protected
D.public
正确答案:D
【解析】接口是为了让别的类去实现,因此不能使用private和protected。
题2-23:编译并运行以下程序,以下描述哪个选项是正确的?( )
A.编译通过,运行无异常
B.编译通过,但运行时出错
C.行2出错,不能成功编译D.不能成功编译,行3出错
正确答案:D
【解析】Object类没有equals( )方法,只有equals(Object obj)方法。
题2-24:有语句String s = hello world; ,以下操作哪个是不合法的?
( )
A.int i = s.length;
B.s>>>=3;
C.String ts = s.trim;
D.String t = s+!;
正确答案:B
【解析】String不能按位运算。
题2-25:下列关于Java语言的特点,描述错误的是( )。
A.Java是跨平台的编程语言
B.Java支持分布式计算
C.Java是面向过程的编程语言
D.Java支持多线程
正确答案:C
【解析】Java是面向对象的编程语言。
题2-26:下述概念中不属于面向对象方法的是( )。
A.对象、消息B.继承、多态
C.类、封装
D.过程调用
正确答案:D
【解析】对象、消息、继承、多态、类、封装都是面向对象方法中的概念。过
程调用属于面向过程方法,通过调用函数来实现。
题2-27:结构化程序设计所规定的三种基本控制结构是( )。
A.输入、处理、输出
B.树形、网形、环形
C.顺序、选择、循环
D.主程序、子程序、函数
正确答案:C
【解析】结构化程序设计所规定的三种基本控制结构是顺序结构、选择结构
(分支结构)、循环结构。
题2-28:下面的程序中类ClassDemo定义了一个静态变量sum,分析程序的输出
结果( )。A.0
B.6
C.11
D.2
正确答案:C
【解析】sum是静态变量,是属于类的。虽然生成了两个对象,其实都是对一个
变量进行操作。在操作的过程中,加了两次5,所以等于11。
题2-29:下面这些类型的应用,哪个不使用Java语言来编写?( )
A.JavaScript
B.Applet
C.Servlet
D.Java Swing
正确答案:A
【解析】JavaScript是Netscape公司的产品,是为了扩展Netscape
Navigator功能而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言,它的前身是Live Script。一般认为,当时Netscape之所以将LiveScript命
名为 JavaScript,是因为Java是当时最流行的编程语言,带有“Java”的名字有
助于这门新生语言的传播。
题2-30:声明成员变量时,如果不使用任何访问控制符(public、protected、private),则以下哪种类型的类不能对该成员进行直接访问?( )
A.同一类
B.同一包中的子类
C.同一包中的非子类
D.不同包中的子类
正确答案:D
【解析】默认访问控制符:如果一个类没有访问控制符,说明它具有默认的访
问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又
称为包访问性。
题2-31:下面哪个流类属于面向字符的输入流?( )
A.BufferedWriter
B.FileInputStream
C.ObjectInputStream
D.InputStreamReader
正确答案:D
【解析】InputStreamReader是字节流通向字符流的桥梁:它使用指定的
charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给
定,或者可以接受平台默认的字符集。字符流的源或目标通常是文本文件。题2-32:下面关于数组声明和初始化的语句哪个有语法错误?( )
A.int a1[ ] = {3,4,5};
B.String a2[ ] = {string1,string1,string1};
C.String a3[ ] = new String(3);
D.int[ ][ ] a4 = new int[3][3];
正确答案:C
【解析】应为String a3[ ] = new String[3];。
题2-33:下面的方法,当输入为2的时候返回值是多少?( )
A.0
B.2
C.4
D.10
正确答案:D
【解析】由于case中没有break语句,因此程序继续向下执行。在执行case 2后,result的值为4,继续执行case 3后,result的值为10。
题2-34:下列描述中正确的一项是( )。
A.标识符首字符的后面可以跟数字
B.标识符不区分大小写
C.复合数据类型变量包括布尔型、字符型、浮点型
D.数组属于基本数据类型
正确答案:A
【解析】Java语言的标识符是以字母、下划线(__)和符号为首字符的字符
串,在首字符后面可以跟字母、下划线、和数字,且标识符是区分大小写的,标识
符的字符数没有限制,所以A选项是正确的。B选项是错误的。选项C错误,复合数据
类型应该包括数组、类和接口。数组属于复合数据类型,故D选项是错误的。
题2-35:下列哪一项不属于变量的组成部分?( )
A.变量名
B.变量属性
C.变量初值
D.变量大小
正确答案:D
【解析】选项A、B和C均属于变量的组成部分;选项D不是,因为Java的数据类
型长度都固定,变量的大小并不是组成变量的一部分,而应该是变量的类型,有了
变量的类型,变量的大小就能确定了。
题2-36:下列选项中,哪一项不属于Java语言的简单数据类型?( )A.整数型
B.数组
C.字符型
D.浮点型
正确答案:B
【解析】Java简单数据类型有float、double、byte、short、int、long、char、boolean。
题2-37:下列关于变量作用域的描述中,不正确的一项是( )。
A.变量属性是用来描述变量作用域的
B.局部变量作用域只能是它所在方法的代码段
C.类变量能在类的方法中声明
D.类变量的作用域是整个类
正确答案:C
【解析】类变量在类中声明,作用域是整个类,它不能在类的方法中声明。局
部变量在类的方法中声明,作用域只能是它所在的方法中。
题2-38:下列关于char类型的数据说法中,正确的一项是( )。
A.'\r'表示换行符
B.'\n'表示回车符
C.char类型在内存中占16位
D.凡是在Unicode中的字符都可以用单引号括起来作为char类型常量正确答案:C
【解析】'\r'表示回车符,'\n'表示换行符。不是所有的Unicode字符都可以
直接用作char类型常量的,比如选项A、B中的字符,需要用反斜杠做转义才可以。
题2-39:下列关于Java语言简单数据类型的说法中,哪个是正确的?( )
A.以0开头的整数代表八进制常量
B.以0x或者0X开头的整数代表八进制整型常量
C.boolean类型的数据作为类成员变量的时候,系统默认值初始为true
D.double类型的数据占计算机存储的32位
正确答案:A
【解析】选项B中,以0x或者0X开头的整数应该是16进制的整型常量;选项C
中,对于boolean类型的数据,作为类成员变量的时候,系统默认的初始值应该是
false;选项D中,double类型的数据应该占用64位的存储空间;选项A正确。
题2-40:下列不可作为Java语言修饰符的是( )。
A.a1
B.1
C._1
D.11
正确答案:D
【解析】Java命名规则是由数字、字母、下划线、组成,但是只能以字母、下
划线、开头,约定俗成的是首字母小写,后面的首字母大写,即采用驼峰标识,尽
量做到见名知意。题2-41:有一段Java应用程序,它的主类名是a1,那么保存它的源文件名可以
是( )。
A.a1.java
B.a1.class
C.a1
D.都对
正确答案:A
【解析】Java是plain text文件,是可以人工编辑的文件。.class是编译后
产生的字节码文件,这是JVM(Java虚拟机)解释执行的文件。
题2-42:整型数据类型中,需要内存空间最少的是( )。
A.short
B.long
C.int
D.byte
正确答案:D
【解析】
byte:8位,最大存储数据量是255,存放的数据范围是-128~127。
short:16位,最大数据存储量是65536,数据范围是-32768~32767。
int:32位,最大数据存储容量是232
-1,数据范围是-231
~231
-1。
long:64位,最大数据存储容量是264
-1,数据范围为-263
~263
-1。题2-43:有以下方法的定义,请选择该方法的返回类型( )。
A.byte
B.short
C.int
D.double
正确答案:D
【解析】short型除以double型,会强制类型转换成double型。
题2-44:在调用方法时,若要使方法改变实参的值,可以( )。
A.用基本数据类型作为参数
B.用对象作为参数
C.A和B都对
D.A和B都不对
正确答案:B
【解析】在调用函数时,会给参数赋一个临时名称,用于函数内部,这个名称
(参数名)叫作形参,而实际传入方法的参数,叫实参。实参的作用域在方法外,形参的作用域在方法内。基本类型和对象在参数传递的过程中,有不同的形式。
对于基本类型,传递的时候,将实参值复制,方法内获得的形参与实参没有关
系,只是值相同,称为值传递,在方法中修改形参不影响实参。
对于对象,传递的时候,将实参引用复制,形参与实参引用相同,指向的是同一个对象,称为引用传递,在方法中修改形参会影响实参。
题2-45:Java语言具有许多优点和特点,哪个反映了Java程序并行机制的特
点?( )
A.安全性
B.多线程
C.跨平台
D.可移植
正确答案:B
【解析】安全性是指Java执行多层安全机制,以提供足够的安全保障的特点;
跨平台和可移植是指Java一次编写到处运行;多线程反映了Java程序可同时执行多
个任务的并行机制特点。
题2-46:Character流与Byte流的区别是( )。
A.每次读入的字节数不同
B.前者带有缓冲,后者没有
C.前者是字符读写,后者是字节读写
D.二者没有区别,可以互换使用
正确答案:C
【解析】字节流是最基本的,所有的InputStream和OutputStream的子类都
是,主要用于处理二进制数据,它是按字节来处理的。但实际中很多的数据是文
本,又提出了字符流的概念,它是按虚拟机的encode来处理的,也就是要进行字符
集的转化。
题2-47:在Java中,由Java编译器自动导入而无须在程序中用import导入的包是( )。
A.java.Applet
B.java.awt
C.java.Util
D.java.lang
正确答案:D
【解析】本题考查Java中包的概念。Java中用import语句来导入包,但须注意
的是, Java语言中的java.lang包是由编译器直接自动导入的,因此,编程中使用
该包中的类时,可省去import导入。而使用其他包中的类时,则必须用import导
入,选项D为正确答案。
题2-48:下列关于构造方法的叙述中,错误的是( )。
A.Java语言规定构造方法名与类名必须相同
B.Java语言规定构造方法没有返回值,但不用void声明
C.Java语言规定构造方法不可以重载
D.Java语言规定构造方法只能通过new自动调用
正确答案:C
【解析】构造方法可以重载,但不可以重写。
题2-49:下列哪个类的声明是正确的?( )
A.abstract final class HI{ }
B.abstract private move( ){ }
C.protected private number;D.public abstract class Car{ }
正确答案:D
【解析】类声明格式为[public][abstract][final]class className
[extends superclassName] [implements interfaceNameList]{...类
体...},而abstract和final不能共存,因为abstract是要被继承的,而被final
修饰的类不可被继承。
题2-50:关于被私有访问控制符private修饰的成员变量,以下说法正确的是
( )。
A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中
的该类的子类
B.可以被两种类访问和引用:该类本身、该类的所有子类
C.只能被该类自身所访问和修改
D.只能被同一个包中的类访问
正确答案:C
【解析】对于private修饰的成员变量来说,只允许同一个类访问和修改,同
一个包、不同包中的子类、不同包中的非子类都是不允许访问和修改的。
题2-51:阅读以下代码:
输出结果应该是( )。A.代码得到编译,并输出“s=”
B.代码得到编译,并输出“s=null”
C.由于String s没有初始化,代码不能编译通过
D.代码得到编译,但捕获到NullPointException异常
正确答案:C
【解析】Java中所有定义的基本类型或对象都必须初始化才能输出值。
题2-52:编译运行以下程序后,关于输出结果的说明正确的是( )。
A.输出结果为:value is 99.9
B.输出结果为:value is 9
C.输出结果为:value is 9.0
D.编译错误
正确答案:C
【解析】99.9是浮点型,9是整型,在9和99.9做运算时,自动转化为浮点型,因此输出结果为9.0。
题2-53:执行完代码int [ ] x = new int[10];后,以下哪项说明是正确
的?( )
A.x[9]为0B.x[9]未定义
C.x[10]为0
D.x[0]为空
正确答案:A
【解析】int类型的数组未初始化时默认值为0。大小为10的数组范围为
x[0]~x[9]。
题2-54:以下程序的运行结果是( )。
A.2 2 2
B.2 3 3
C.2 2 3
D.3 4 4
正确答案:C
【解析】c初始化的值为2,第二个输出中执行了自增操作,然而顺序为先输
出,再自增。此时c的值变为3,因此输出结果依次为2 2 3。
题2-55:下列哪一个关键字用于实现从接口来定义类?( )
A.extendsB.implements
C.abstract
D.interface
正确答案:B
【解析】implements是一个类实现一个接口用的关键字。
题2-56:若a的值为3时,下列程序段被执行后,c的值是多少?( )
A.1
B.2
C.3
D.4
正确答案:C
【解析】a的值为3,符合a>0的情况,进入第二层判断;而a不大于3,执行
else操作,c的值为3。
题2-57:下面哪一个操作符的优先级最高?( )
A.
B.||
C.!
D.正确答案:D
【解析】指针最优,单目运算优于双目运算,如正负号。先乘除(模),后加
减。先算术运算,后移位运算,最后位运算。逻辑运算最后计算。A、B、C都属于逻
辑运算,D选项优先级最高。
题2-58:下列方法头中,哪一个不与其他方法形成重载(overload)关系?
A.void mmm
B.void mmm(int i)
C.void mmm(String s)
D.int mm
正确答案:D
【解析】重载要求方法名相同。
题2-59:编译Java程序的命令是( )。
A.appletviewer
B.javac
C.java
D.javadoc
正确答案:B
【解析】javac是Java语言程序的编译器。javac工具读由Java语言编写的类
和接口的定义,将它们编译成字节码的class文件。javac可以隐式编译一些未在命
令行中提及的源文件。题2-60:编译Java源程序文件将产生相应的字节码文件,这些字节码文件的扩
展名为( )。
A..byte
B..class
C..html
D..exe
正确答案:B
【解析】Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件
在不同的操作系统中运行时,操作系统再将字节码文件编译成机器码文件。这就是
Java跨平台。
题2-61:执行语句int i = 1,j = ++i;后i与j的值分别为( )。
A.1与1
B.2与1
C.1与2
D.2与2
正确答案:D
【解析】++i是先计算i的值,然后再使用这个值,而i++是先使用i,然后再计
算i++。这里是先++i得到i=2,然后将2赋给j,所以i和j都是2。
题2-62:下面哪一个循环会导致死循环?( )
A.for (int k = 0; k < 0; k++)
B.for (int k = 10; k > 0; k--)C.for (int k = 0; k < 10; k--)
D.for (int k = 0; k > 0; k++)
正确答案:C
【解析】C中k的初始值为0,k不断做自减操作,永远满足k<10的循环条件,因
此会造成死循环。
题2-63:有如下程序段:
则表达式a == b与s2 == s1的结果分别是( )。
A.true与true
B.false与true
C.true与false
D.false与false正确答案:A
【解析】==是比较操作符,它的主要作用是比较两个对象之间是否为同一个,也就是说比较操作符两端的对象在内存中是否为同一个地址。s2与s1指向的是同一
个对象,因此在进行==比较时,a与b、s1与s2分别指向相同的地址,所以比较结果
为true。
题2-64:在Java中用什么关键字修饰的方法可以直接通过类名来调用?( )
A.static
B.final
C.privateD.void
正确答案:A
【解析】静态方法是使用公共内存空间的,就是说,所有对象都可以直接引
用,不需要创建对象再使用该方法。
题2-65:若在某一个类定义中定义有如下的方法:abstract void
performDial( );则该方法属于( )。
A.接口方法
B.最终方法
C.抽象方法
D.空方法
正确答案:C
【解析】abstract修饰符可以用于类、方法、属性、事件和索引指示器
(indexer),表示其为抽象成员,抽象方法是没有方法体的方法。
题2-66:有如下程序段:
则执行完该程序段后,total的值为( )。
A.0
B.1
C.3D.6
正确答案:A
【解析】break是结束整个循环体,continue是结束单次循环。
题2-67:System.out.println(5 + 2);的输出结果应该是( )。
A.52
B.7
C.2
D.5
正确答案:A
【解析】任何与字符串进行“+”运算的结果都相当于字符串的连接。
题2-68:为AB类的一个无形式参数、无返回值的方法method书写方法头,使得
使用类名AB作为前缀就可以调用它,该方法头的形式为( )。
A.static void method( )
B.public void method( )
C.final void method( )
D.abstract void method( )
正确答案:A
【解析】静态方法是使用公共内存空间的,就是说,所有对象都可以直接引
用,不需要创建对象再使用该方法。
题2-69:欲构造ArrayList类的一个实例,此类继承List接口,下列哪个方法
正确?( )A.ArrayList myList = new Object;
B.List myList = new ArrayList;
C.ArrayList myList = new List;
D.List myList = new List;
正确答案:B
【解析】ArrayList继承了List,而List是一个接口,不能实例化。
题2-70:指出正确的表达式( )。
A.byte = 128;
B.Boolean = null;
C.long l = 0xfffL;
D.double = 0.9239d;
正确答案:C
【解析】A只有变量类型没有变量名,并且把int的128转byte需要显式强制转
换,应改为:byte b = (byte)128;。B只有变量类型没有变量名,应改为:
Boolean bo = null;。D同样没有变量名,应改为:double d = 0.9239d;。
题2-71:指出下列程序运行的结果( )。A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
正确答案:B
【解析】Java是传值,不是传引用。str=test ok只是修改的局部变量
str,不是类的成员变量。类的成员变量并没有被修改。char是原始类型,也就是
本身不是对象,是直接放在栈里的,也就是说,传递的就是本身的地址。所以结果
里是被修改的。
题2-72:运行下列程序,会产生什么结果?( )A.第1行会产生编译错误
B.第6行会产生编译错误
C.第6行会产生运行错误
D.程序会运行和启动
正确答案:D
【解析】方法start用来启动一个线程,方法run称为线程体,它包含了要
执行的这个线程的内容,程序运行结果为输出“this is run”。
题2-73:Java编程所必需的默认引用包为( )。
A.java.sys包
B.java.lang包
C.java.util包
D.以上都不是
正确答案:B
【解析】Java编程必需的默认引用包为java.lang包。
题2-74:下面哪一个是合法的数组声明和构造语句?( )
A.int[ ] ages = [100];
B.int ages = new int[100];
C.int[ ] ages = new int[100];
D.int( ) ages = new int(100);
正确答案:C【解析】定义数组的同时给出长度,初始化为默认值(由元素数据类型决
定)。
格式:
type[ ]变量名=new type[数组长度]
等价于:
type变量名[ ] = new type[数组长度]
题2-75:下面说法不正确的是( )。
A.一个子类的对象可以接收父类对象能接收的消息
B.当子类对象和父类对象能接收同样的消息时,它们针对消息产生的行为可能
不同
C.父类比它的子类的方法更多
D.子类在构造函数中可以使用super( )来调用父类的构造函数
正确答案:C
【解析】继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性
和行为,并能扩展新的能力。因此子类的方法不少于父类。
题2-76:对于下面的代码段,哪行将引起一个编译时错误?( )A.行1
B.行4
C.行6
D.行9
正确答案:D
【解析】构造方法Test中需要参数,行9中,实例化t1时没有传递参数。
题2-77:在JDK目录中,Java程序运行环境的根目录是( )。
A.bin
B.demo
C.lib
D.jre
正确答案:D
【解析】本题考查JDK目录结构。JDK包含如下目录。
①bin目录,包含编译器、解释器和许多工具。②demo目录,包含各种演示例子。
③include目录,包含Win子目录,都是本地方法文件。
④jre目录,是Java程序运行环境的根目录。
⑤lib目录,包含Java库文件。
经过上述分析可知,本题的正确答案是选项D。
题2-78:Java语言中所有的简单数据类型都被包含在( )中。
A.java.sql
B.java.awt
C.java.lang
D.java.math
正确答案:C
【解析】Java语言中,所有的简单数据类型都被包含在java.lang包中。
题2-79:在Java Applet程序中,当需要对发生的事件做出响应和处理的时
候,应该使用下面的( )语句。
A.import java.awt.event.;
B.import java.io.;
C.import java.awt.;
D.import java.applet.;
正确答案:A
【解析】本题考查对Java常用的各种包所包含的一些类的基本功能的理解.java.awt包是抽象窗口工具包,里面包括各种容器、组件、窗口布局管理器以
及一些常用的类(如Color、Font等),选项C满足题意。而java.applet包里面包
括了小程序执行时必须重载的一个类Applet,也就只有这一个类,所以选项D错
误.java.io包主要是提供一些输入输出类的,选项B不满足题意。
java.awt.event包就包含了一些能够对事件做出响应和处理的标准类。选项C不满
足题意。
题2-80:下列叙述中,错误的是( )。
A.Java中,方法的重载是指多个方法可以共享同一个名字
B.Java中,用abstract装饰的类称为抽象类,它不能实例化
C.Java中,接口是不包含成员变量和方法实现的抽象类
D.Java中,构造方法可以有返回值
正确答案:D
【解析】构造方法是一种特殊的方法,是为对象初始化操作编写的方法,用它
来定义对象的初始状态。Java中的每个类都有构造方法,它也是由方法名、参数和
方法体组成的。构造方法的名字必须与类名相同,并且构造方法不返回任何数据。
题2-81:下面不属于Java核心包的是( )。
A.java.lang包
B.java.awt包
C.javax.sound包
D.java.util包
正确答案:C
【解析】选项C属于扩展包,它提供多媒体声音要求的MIDI输入输出以及合成
操作的基本类。Java核心包包括Java.lang包、java.awt包、java.applet包、java.io包、java.net包、java. rm包、java.math包、java.util包、java.sql包、java.security包、java.text包和java.bean包。
题2-82:下列关于Java程序结构的描述中,不正确的一项是( )。
A.一个Java源文件中可以包括一个package语句
B.一个Java源文件中可以包括多个类定义,但是只能有一个public类
C.一个Java源文件中可以有多个public类
D.源文件名与程序类名必须一致
正确答案:C
【解析】一个完整的Java源程序应该包括下列5个部分:①package语句将源文
件存入指定的包中,该部分至多只有一句,必须放在源程序的第一句,如果没有该
语句,则源文件存入当前目录下。②import语句导入需要的包或类,该部分可以有
若干import语句或者没有,必须放在所有的类定义前。③公共类定义。公共类定义
部分至多只有一个公共类的定义,Java语言规定该Java源程序的文件名必须与该公
共类名完全一致。④类定义。类定义部分可以有0个或多个类定义。⑤接口定义。接
口定义部分可以有0个或多个接口定义。
题2-83:下列关于Java变量作用域的说法中,不正确的是( )。
A.在Java程序中要使用一个变量,必须先对其进行声明
B.变量声明语句可以放在程序的任何地方,只要位于变量使用之前即可
C.变量不可以在其作用域之外使用
D.局部变量在使用之前可以不初始化,系统使用默认的初始值
正确答案:D
【解析】局部变量在使用之前必须初始化,否则编译错误,类的成员变量则不
一定要在使用之前初始化,系统会赋予其默认的初始值。题2-84:下列有关Java语言的叙述中,正确的是( )。
A.Java是不区分大小写的
B.源文件名与public类型的类名必须相同
C.源文件的扩展名为.jar
D.源文件中public类的数目不限
正确答案:B
【解析】本题考查考生对Java语言概念的理解。这是考试重点内容,注意理解
这些基本概念。Java语言和C语言不同,它是区分大小写的; Java程序的源文件扩
展名为.class,.jar文件是由归档工具JAR生成的JAR文件。源文件中public类的
数目只能有0个或1个,用来指定应用程序类名,也是源文件名,所以选项B正确。
题2-85:Java中对Applet设置了严格的安全限制。下列关于Applet在Java 2
中的安全限制叙述正确的是( )。
A.根本无法解除
B.只有部分限制可以解除,而其他限制无法解除
C.可以在安全策略的控制下解除
D.已经默认地全部解除
正确答案:C
【解析】本题考查Applet的安全限制。Java 2中的安全机制建立一个策略文件
给Applet授予所需的权限,并使用这个安全策略实施安全控制,选项C说法正确。
要注意分析题目,本题通过仔细分析题目,也可以正确回答。
题2-86:在没有为类定义任何构造方法时,Java编译器会自动建立一个( )
的构造方法。A.不带参数
B.带一个参数
C.带多个参数
D.默认参数
正确答案:A
【解析】本题考查对默认构造方法的理解。要熟记构造方法的几个特点:①构
造方法用来初始化类的一个对象。②构造方法具有和类一样的名称,并且没有返回
类型还可以重载。③只能用运算符new调用构造方法。④如果没有定义构造方法,在
Java运行时,系统会自动提供默认的构造方法,它没有任何参数。
题2-87:Java程序的执行过程中用到一套JDK工具,其中javadoc.exe是指。
A.Java编译器
B.Java解释器
C.Java文档生成器
D.Java调试器
正确答案:C
【解析】javadoc用于生成API文档。根据Java源码及说明语句生成HTML文
档。所以本题选C。
题2-88:在Java中,用package语句说明一个包时,该包的层次结构必须是。
A.与文件的结构相同
B.与文件所在文件夹的层次相同C.与文件类型相同
D.与文件大小相同
正确答案:B
【解析】本题考查Java包的概念。Java采用包来管理类名空间,为编程提供一
种命名机制,也是一种可见性限制机制。定义一个包要用package关键字,用
package语句说明一个包时,该包的层次结构必须与文件所在文件夹的层次相同。
否则,在编译时可能出现查找不到的问题,所以选项B正确。
题2-89:在Java中,能实现多重继承效果的方式是( )。
A.内部类
B.适配器
C.接口
D.同步
正确答案:C
【解析】本题考查Java中多重继承的概念。首先要区分选项中的各个概念。内
部类是在一个类的内部嵌套定义的类,主要用来生成事件适配器。适配器定义一个
包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Adapter),它
包装的对象就是适配者(Adaptee),适配器提供客户类需要的接口。接口是一种只
含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现,所以与存储
空间没有任何关系,将多个接口合并,即多重继承,就可以很容易实现,选项C正
确。同步主要用在多线程程序设计中。
题2-90:下列说法中错误的是( )。
A.捕获异常在调用方法时用throw子句捕获并处理
B.异常对象用new来创建C.Java语言的类库中已定义有许多异常类可利用
D.Throwable类分为Error和Exception两个子类
正确答案:A
【解析】一个方法中为某种类型的异常对象提供对应的处理时,调用该方法就
可捕获这种异常,也就是说,当异常已被定义时,必须通过try-catch-finally语
句处理它。
题2-91:下列关于Java的说法正确的是( )。
A.Java中的类可以有多个直接父类
B.抽象类不能有子类
C.最终类可以作为其他类的父类
D.Java中的接口支持多继承
正确答案:D
【解析】Java中,接口支持多继承,所以选项D正确。Java语言只允许类间有
单继承关系,所以选项A错。抽象类是专门为别的类继承它而定义的,所以选项D
错。final声明一个类后,这个类不能被其他类继承,它是最终类,所以选项C错。
题2-92:下列变量名的定义中,符合Java命名约定的是( )。
A.fieldname
B.super
C.Intnum
D.number
正确答案:A【解析】Java命名约定全部小写,不得使用关键字,只有A符合。
题2-93:下列哪个选项的Java源文件代码片段是不正确的?( )
A.package testpackage; public class Test{ }
B.import java.io. ; package testpackage; public class Test{ }
C.import java.io.; class Person{ } public class Test{ }
D.import java.io.; import java.awt.; public class Test{ }
正确答案:B
【解析】Java中的package语句必须是源文件中除说明以外的第一条语句。导
入包语句可以有几个,但是必须位于package语句之后,其他类定义之前。一个源
文件中可以有几个类,但最多只能有一个是public的,如果有,则源文件的文件名
必须与该类的类名相同。
题2-94:下面所列类型中,不是复合数据类型的是( )。
A.类
B.数组
C.整型
D.接口
正确答案:C
【解析】复合数据类型包括数组、类和接口。
题2-95:下面说法中正确的是( )。
A.Java程序不需编译也可直接执行
B.Java程序经过编译后的字节代码仍然是ASCII文件C.Java程序经过编译后的字节代码是二进制文件,可以在操作系统上直接执行
D.Java程序经过编译后的字节代码是二进制文件,可以在Java虚拟机上执行
正确答案:D
【解析】Java语言的执行模式是半编译和半解释型,未经编译的Java程序不能
直接执行。Java程序经过编译后的字节代码是二进制文件,但不能直接在操作系统
上执行,它可看作虚拟机的机器码,由Java虚拟机解释执行。
题2-96:编译Java Applet源程序文件产生的字节码文件的扩展名为( )。
A..java
B..class
C..html
D..exe
正确答案:B
【解析】该题考查对Applet运行中所需要的几种文件的理解。Applet源程序与
任何Java源程序一样,其文件扩展名都为.java,编译之后生成的目标文件的扩展
名为.class,但要执行该小程序,必须有相应的HTML文件;而.exe文件根本就与
Java Applet不沾边。
题2-97:以下各项中不属于Java语言流程控制结构的是( )。
A.分支语句
B.跳转语句
C.循环语句
D.赋值语句正确答案:D
【解析】Java语言的流程控制结构包括分支语句、跳转语句、循环语句等,但
赋值语句是由赋值表达式构成的,不能用于流程控制。
题2-98:Java语言与C++语言相比,最突出的特点是( )。
A.面向对象
B.高性能
C.跨平台
D.有类库
正确答案:C
【解析】本题考查Java语言的特性.Java语言与C++语言都是面向对象的语言。
因此,选项A是错误的.Java语言与C++语言都是高性能的编程语言.Java字节码的设
计使之能很容易直接转换成对应于特定CPU的机器码,从而得到较高的性能.C++由
于具有极高的灵活性、强大的功能和非常高的效率,常常用于专业应用程序的开
发,C++非常适合于编写各种编程环境下的高性能代码。因此,选项B是错误
的.Java作为平台无关的语言,是指用Java写的应用程序不用修改就可在不同的软
硬件平台上运行。平台无关有两种:源代码级和目标代码级.C和C++具有一定程度的
源代码级平台无关性,C++语言支持程序员编写一些非常低级的程序,从而能够访问
机器硬件,并操纵实际内存地址。但这些是以牺牲可移植性为代价的,因为这时每
个程序都是针对某种具体硬件环境的。而Java主要靠Java虚拟机(JVM)在目标码
级实现平台无关性.Java编程人员在编写完软件后,通过Java编译器将Java源程序
编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程
序,而不管这种字节码是在何种平台上生成的。显然,Java语言与C++语言相比,最突出的特点是跨平台。因此,选项C是正确的.Java语言和C++语言中都包含有类
库,提供了大量的类以满足用户的多方面需要。因此,选项D是错误的。
题2-99:Java中,数值类型值中不可能出现的符号是( )。A.f
B.d
C.
D.e
正确答案:C
【解析】Java中,e用于科学计数法形式中,表示实常数,如123e3或123E3,其中e或E之前必须有数字,e或E后面的指数必须为整数。d表示double型的值,如
1.23d或者1.23D。对于float型的值,则在数字后加f或F,如12.3F或者12.3f,它在机器中占32位,且表示精度较double型要低。
题2-100:下列哪个是非法的Java标识符?( )
A.Tree Glasses
B.FirstJavaApplet
C.theLastOne
D.Two273.5
正确答案:D
【解析】本题主要考查Java语言的标识符这个知识点.Java语言的标识符必须
以字母、下划线(__)、美元符号(¥)开始,其余字符可以是上述3种符号或数字
(0~9).Java语言使用Unicode字符集,所以标识符中使用的字母包括下面几种:
①A~Z;②a~z;③Unicode字符集中序号大于0xC0的所有符号。选项A是正确的,下划线是可以在标识符里面出现的;选项B是正确的;选项C是正确的,符号¥也是
可以在标识符里面出现的;选项D是错误的,符号“.”不能在标识符里面出现。故
本题答案是D.
题2-101:在Java中,字符串由java.lang.String和( )定义。A.java.io.StringChar
B.java.io.StringBuffer
C.java.lang.StringChar
D.java.lang.StringBuffer
正确答案:D
【解析】在Java中,字符串是作为对象出现的,由java.lang.String和
java.lang.StringBuffer定义,分别用来处理长度不变和长度可变字符串,这两
类都被定义为final。
题2-102:能够支持javadoc命令的注释语句是( )。
A....
B....
C.
D....
正确答案:D
【解析】以“”开始的是单行注释语句,以“”开始、“”结束的是C
语言风格的注释语句,在“...”内的文档注释是自由形式的文本,支持
javadoc命令,被javadoc处理,可以建立类的一个外部说明性文件。
题2-103:下列关于Java对import语句规定的叙述中,错误的是( )。
A.在Java程序中import语句可以有多个
B.在Java程序中import语句可以没有
C.在Java程序中import语句必须有一个D.在Java程序中import语句必须引入在所有类定义之前
正确答案:C
【解析】Java程序中使用import关键字导入一个包中的类。在一个Java源程序
中,可以有0个或多个import语句,但是必须在所有类定义之前引入标准类。因
此,本题中选项C的说法是错误的。
题2-104:下列不属于Java语言健壮性特点的是( )。
A.Java能检查程序在编译和运行时的错误
B.Java能运行虚拟机,实现跨平台
C.Java自己操纵内存,减少了内存出错的可能性
D.Java还实现了真数组,避免了覆盖数据的可能
正确答案:B
【解析】Java健壮性的特点如下:Java在编译和运行程序时都要对可能出现的
问题进行检查,以防止错误的产生。Java编译器可以查出许多其他语言运行时才能
发现的错误。Java不支持指针操作,大大减少了错误发生的可能性。Java具有异常
处理的功能,当程序异常时,它能捕获并响应意外情况,以保证程序能稳妥地结
束,计算机系统不会崩溃。而Java能运行虚拟机实现跨平台是Java的与平台无关性
的特点。所以本题选B。
题2-105:下列有关Java布尔类型的描述中,正确的是( )。
A.一种基本的数据类型,它的类型名称为boolean
B.用int表示类型
C.其值可以赋给int类型的变量
D.有两个值,1代表真,0代表假正确答案:A
【解析】布尔型数据只有两个值,true和false,不对应任何数字,不与数字
转换,一般用于逻辑判别。
题2-106:下列说法不正确的是( )。
A.Java语言不支持分布式计算
B.Java是跨平台的语言
C.Java是面向对象语言
D.Java是具有多线程并发机制的语言
正确答案:A
【解析】本题考查Java语言的特点。Java语言是一种高级语言,具有简单、面
向对象、分布式、解释型、健壮性、安全、结构中立、可移植、高效率、多线程、动态等特点。
题2-107:在Java语言中,不允许使用指针体现出的Java特性是( )。
A.可移植
B.解释执行
C.健壮性
D.安全性
正确答案:D
【解析】选项A,Java语言跨平台的特点,保证了软件的可移植性。此外,Java本身的编译器也用Java语言编写,运行系统的虚拟机用C语言实现,这样,Java系统本身也具有可移植性。选项B,Java语言用字节码进行解释执行,字节本
身带有许多编译时产生的信息。选项C,健壮性也称为鲁棒性。Java语言在编译和运行时都有比较严格的检查。选项D,Java语言在运行程序时,有严格的访问权限检
查。对字节代码执行前要检查,不允许使用指针,可防止对内存的非法入侵。
题2-108:getSize( ).width指的是什么?( )
A.界面组件的窗口宽度
B.在Java中任何图形用户界面的宽度
C.框架的窗口宽度
D.用户显示器的宽度
正确答案:B
【解析】可以对Java的任何组件调用getSize.width和
getSize.height,来改变用户界面的宽度和高度。
题2-109:下面有关Java Object默认的基本方法,说法错误的是( )。
A.equals(Object obj)指示某个其他对象是否与此对象“相等”
B.copy创建并返回此对象的一个副本
C.wait导致当前的线程等待,直到其他线程调用此对象的notify方法或
notifyAll方法
D.toString返回该对象的字符串表示
正确答案:B
【解析】Object类中没有copy方法,只有clone方法,创建并返回此对象
的副本。
题2-110:在如下所示的Test类中,共有( )个构造方法。A.0
B.1
C.2
D.3
正确答案:D
【解析】构造方法的形式为:
类名([形式参数表])
构造方法没有返回值,不能添加void,构造方法可以被重载。
题2-111:检查程序是否存在问题。如果不存在,说明输出结果( )。A.test okandabc
B.test okandgbc
C.goodandabc
D.goodandgbc
正确答案:D
【解析】String类型和数组属于引用传递,但执行change方法后,数组改变的
是ch[0],也就是ch数组引用未改变,但其所指向内容的值被改变。
题2-112:下列说法中不正确的有( )。
A.call by value不会改变实际参数的数值
B.call by reference能改变实际参数的参考地址
C.call by reference不能改变实际参数的参考地址
D.call by reference能改变实际参数的内容
正确答案:B【解析】
①基本类型和基本类型变量被当作参数传递给方法时,是值传递。
在方法实体中,无法给原变量重新赋值,也无法改变它的值。
②对象和引用型变量被当作参数传递给方法时,是引用传递。
在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。
题2-113:明朝时期张居正改革的“一条鞭法”的主要思想是( )。
A.面向过程
B.万物皆数
C.统一接口
D.泛型编程
正确答案:C
【解析】一条鞭法的主要思想是“税以银征收”,取消了原来的田赋、力役和
其他杂税,促进自然经济的瓦解和商品经济的发展。面向过程是指以过程为中心的
编程思想,形成模块化特点。万物皆数是毕达哥拉斯学派的数学哲学理念(特指有
理数),属于世界观的一种。泛型编程是一种语言机制,能够帮助实现一个通用的
标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所
有可能类型的对象这样的事;泛型编程让我们可以编写完全一般化并可重复使用的
算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数
据类型上皆可操作的含意,与模板有些相似。一条鞭法的主要思想并不是以征税过
程为中心的思想,同时也不是在多种类型上的操作。
题2-114:What will be printed when you execute the following
code?( )A.BB
B.CBB
C.BAB
D.None of the above
正确答案:B
【解析】初始化过程是这样的。
首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序
初始化。
然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序
初始化。其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法。
最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法。
①初始化父类的普通成员变量和代码块,执行C c = new C( );输出C。
② super(B);表示调用父类的构造方法,不调用父类的无参构造函数,输出
B。
③System.out.print(B);输出B。
所以输出CBB。
题2-115:以下Java程序代码执行后的结果是( )。
A.Fred
B.true
C.编译错误
D.运行时抛出异常
正确答案:B
【解析】创建Object对象时,重写了equals方法。
题2-116:假设有以下代码:下列选项中返回false的是( )。
A.s.equals(t)
B.t.equals(c)
C.s==t
D.t.equals(new String (hello))
正确答案:B
【解析】String类重写了equlas方法,类型不同返回false,所以答案是B。
题2-117:Given the following class:
Which expression returns true?( )
A.c1==c2
B.c2==c3C.m==c1
D.c1.equals(m)
正确答案:B
【解析】
c1 = new Cat(10L);
c2 = new Cat(10L);
A:c1和c2是两个参数相同的不同对象,c1!=c2,所以返回false。
B:c2和c3指向同一个引用,所以c2==c3,返回true。
C:m与c1是不同类型,不相等,返回false。
D:c1没有定义equals方法,默认调用Object类的equals方法,返回false。
题2-118:Consider the following code:
Which code fragments cause an object of type
NullPointerException to be thrown?( )
A.if((s!=null)(s.length>0))
B.if((s!=null)(s.length>0))
C.if((s==null)|(s.length==0))
D.if(s==null)||(s.length==0))
正确答案:A C
【解析】s为null,因此只要调用了s.length都会抛出空指针异常。因此这个题目就是考察if语句的后半部分会不会执行。
A:单个与操作的符号用在整数上是按位与,用在布尔型变量上跟功能类
似,但是区别是无论前面是否为真,后面必定执行,因此抛出异常。
B:与操作,前半部分判断为假,后面不再执行。
C:这里跟和的区别类似,后面必定执行,因此抛出异常。
D:或语句,前面为真,整个结果必定为真,后面不执行。
题2-119:下面哪些情况下不需要使用抽象类?( )
A.当一个类的一个或多个方法是抽象方法时
B.当类是一个抽象类的子类,并且不能为任何抽象方法提供任何实现细节或方
法体时
C.当一个类实现多个接口时
D.当一个类实现一个接口,并且不能为任何抽象方法提供实现细节或方法体时
正确答案:C
【解析】当一个类中有一个方法是抽象类时,则类必须为抽象类。
抽象类中可以有非抽象方法。
抽象类给出方法的声明,但没有具体的实现。
题2-120:Given the following class:Please write the output result( )。
A.1234
B.welcome
C.空
D.不确定
正确答案:A
【解析】局部变量的作用域只在方法内部有效,在方法外无效。
题2-121:下列程序的运行结果是( )。
A.IOException!B.IOException!Exception!
C.FileNotFoundException!IOException!
D.FileNotFoundException!IOException!Exception!
正确答案:A
【解析】题目说抛出一个异常,但没说具体是什么异常,那么就要分情况了。
①如果抛出一个FileNotFoundException(或其子类),则最终结果就打印
FileNotFoundException!。
②如果抛出一个IOException,或者IOException的子类(不包含
FileNotFoundException及其子类),那么最终结果就打印IOException!。
③如果抛出一个Exception(不包含IOException及其子类),那么最终结果就
打印Exception!。
所以以上3个皆有可能。但是,不管是哪一种情况,只会输出其中之一。
从答案上来看,B、C、D的输出情况是不存在的。因此选A。
题2-122:以下方法中,哪个不是对add方法的重载?( )
A.pubilc int add(int x, int y, float z){return 0;}
B.pubilc int add(int x, int y, int z){return 0;}
C.pubilc void add(int x, int y){}
D.以上都不是
正确答案:B【解析】方法重载是指在 ......
您现在查看是摘要介绍页, 详见PDF附件(38036KB,732页)。





