2019年程序员考试面试题精选题
- 格式:docx
- 大小:38.37 KB
- 文档页数:4
程序员面试题精选100题1. 什么是面向对象编程(OOP)?列举几种常见的面向对象编程语言。
2. 解释一下封装、继承和多态的概念。
3. 什么是数据结构?列举几种常见的数据结构。
4. 解释一下栈和队列的概念,并提供它们的实际应用场景。
5. 什么是算法?解释一下时间复杂度和空间复杂度的概念。
6. 解释一下HTTP协议的工作原理。
7. 什么是数据库事务?解释一下ACID原则。
8. 解释一下前端开发中的MVC和MVVM模式。
9. 解释一下正向代理和反向代理的区别。
10. 什么是RESTful API?列举一些常见的HTTP请求方法。
11. 解释一下同步和异步的概念,以及它们的区别。
12. 解释一下进程和线程的概念,并提供它们的区别。
13. 解释一下操作系统中的死锁问题,以及如何避免死锁。
14. 解释一下TCP/IP协议族的组成部分。
15. 什么是单元测试?解释一下TDD(测试驱动开发)的概念。
16. 解释一下版本控制系统中的分布式版本控制和集中式版本控制的区别。
17. 什么是软件设计模式?列举几种常见的软件设计模式。
18. 解释一下Web应用程序中的会话管理机制,以及如何处理会话跟踪。
19. 解释一下缓存的工作原理,并提供一些常见的缓存算法。
20. 什么是虚拟机?解释一下虚拟化技术的概念。
21. 解释一下操作系统中的文件系统,以及不同类型的文件系统。
22. 解释一下数据库索引的概念,以及为什么使用索引可以提高查询性能。
23. 什么是反射?解释一下反射在Java中的应用。
24. 解释一下关系型数据库和非关系型数据库的区别。
25. 什么是分布式系统?列举一些常见的分布式系统架构。
26. 解释一下HTTP和HTTPS的区别,以及为什么使用HTTPS更安全。
27. 解释一下云计算的概念,以及云计算的优势和劣势。
28. 什么是容器化?解释一下Docker的工作原理。
29. 解释一下RESTful风格的API设计原则。
java2019面试题目100及最佳答案1. 什么是Java平台?请列举Java平台的三个主要组成部分。
答案:Java平台是指Java语言的运行环境,它包括Java虚拟机(JVM)、Java核心类库和Java编程语言本身。
三个主要组成部分包括Java运行时环境(JRE)、Java开发工具包(JDK)和Java应用程序接口(API)。
2. 解释Java中的异常处理机制。
答案:Java中的异常处理机制允许程序在运行时捕获和处理错误。
它使用try、catch和finally关键字来实现。
try块中包含可能抛出异常的代码,catch块用于捕获和处理异常,finally块中的代码无论是否发生异常都会执行。
3. Java中什么是多线程?请说明其优缺点。
答案:Java中的多线程是指在同一个进程中并行执行两个或多个线程的能力。
优点包括提高程序的响应性和效率,以及能够充分利用多核处理器。
缺点包括增加了程序的复杂性,可能导致资源竞争和死锁。
4. 解释Java中的垃圾回收机制。
答案:Java中的垃圾回收机制是指自动回收不再被引用的对象所占用的内存。
Java虚拟机(JVM)负责周期性地执行垃圾回收,以避免内存泄漏。
5. Java中的集合框架有哪些主要接口?答案:Java中的集合框架主要包括以下接口:List、Set、Map、Queue和Deque。
这些接口定义了集合的基本操作,如添加、删除、遍历等。
6. 什么是Java泛型?请举例说明其用途。
答案:Java泛型是指在定义类、接口、方法时使用类型参数,以支持编译时类型检查。
泛型可以提高代码的复用性和安全性。
例如,定义一个泛型类`List<T>`,其中T可以是任何类型的对象。
7. Java中什么是注解(Annotation)?请列举其主要用途。
答案:Java中的注解是一种特殊的接口,用于为代码提供元数据。
主要用途包括编译时处理、类和方法的标记、运行时处理等。
8. 解释Java反射机制及其应用场景。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==程序员面试的问题1.Are you the principal applicant?2.What is your marital status? When did you get married?3.Do you remember the date of your marriage?4.What is your current mailing address?5.Do you have any children?6.Do you have a passport?7.When did you graduate from the university?8.What is the major of your university degree?9.What are the major courses of your university major?10.When did you start working?11.What is your current occupation?12.When did you become an assistant engineer?13.When did you become an engineer? 14.What do you do at your current position?15.When did you change your job to the current position?16.Do you have an immigration agent?17.Which city in Canada do you intent to move in 18.How much money do you earn each month? 19.How much money do you have to bring over to Canada?20.Why did you choose Toronto as your immigration destination?21.How many workers in your work unit?22.How many employees are there in your group? 23.How many engineers and clerks are there in your group?24.Could you explain your first job on a daily basis?25.What are the names of projects that you had finished in the past few years?26.Could you explain your academic research at the institute?27. Why did you want to immigrant to Canada instead of other countries, such as USA, or Australia?28.How are you going to find a job in Canada?29.IF you could not find a job in the first years, what are you going to do ?30.Have you done anything for your preparation of immigration to Canada?31.Do you know anything about the Canadian labor market?32.Do you have any friend in Canada?33.How much money do you have that is transferable to Canada?34.Do you know anything about Toronto?35.Please explain in details of how you do research on N.C system?36.What kind of computer language do you know?37.What kind of automatic control system do you research?38.What is your wife’s occupation? 39Do you have any relativesin Canada?39.What is the name of your friend in Canada (if you have)?40.Are you going to study in Canada?41.Could you write down what are you going to do tomorrow in English?。
2019最全前端⾯试问题及答案总结HTML&CSS:对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒⼦模型、选择器优先级及使⽤、HTML5、CSS3、移动端适应。
JavaScript:数据类型、⾯向对象、继承、闭包、插件、作⽤域、跨域、原型链、模块化、⾃定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。
其他: HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、可维护、SEO、UED、架构、职业⽣涯1.请你谈谈Cookie的弊端cookie1.IE6或更低版本最多20个cookie2.IE7和之后的版本最后可以有50个cookie。
3.Firefox最多50个cookie4.chrome和Safari没有做硬性限制Opera 会清理近期最少使⽤的Firefox会随机清理 4096字节,为了兼容性,⼀般不能超过 IE 提供了⼀种存储可以持久化⽤户数据,叫做IE5.0就开始⽀持。
每个数据最多128K,每个域名下最多1M。
这个持久化数据放在缓存中,如果缓存没有清理,那么会⼀直存在。
优点:极⾼的扩展性和可⽤性1.通过良好的编程,控制保存在cookie中的session对象的⼤⼩。
2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
3.只在cookie中存放不敏感数据,即使被盗也不会有重⼤损失。
4.控制cookie的⽣命期,使之不会永远有效。
偷盗者很可能拿到⼀个过期的cookie。
缺点:1.`Cookie`数量和长度的限制。
每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
2.安全性问题。
如果cookie被⼈拦截了,那⼈就可以取得所有的session信息。
即使加密也与事⽆补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到⽬的了。
2019前端⾯试题总结及答案⼀)vue router 跳转⽅式1.this.$router.push()跳转到不同的url,但这个⽅法会向history栈添加⼀个记录,点击后退会返回到上⼀个页⾯。
1. this.$router.push({path: '/home/sort/detail',query:{id: 'abc'}})获取参数 {{this.$erId}}2. this.$router.push({name: 'detail',params:{id: 'abc'}})获取参数:{{this.$erId}}ps:query和params 的区别:1.⽤法上query要⽤path来引⼊,params要⽤name来引⼊:egthis.$router.push({name:"detail",params:{name:'nameValue',code:10011}});2.展⽰上的 query更加类似于我们ajax中get传参,params则类似于post,说的再简单⼀点,前者在浏览器地址栏中显⽰参数,后者则不显⽰2.this.$router.replace()同样是跳转到指定的url,但是这个⽅法不会向history⾥⾯添加新的记录,点击返回,会跳转到上上⼀个页⾯。
上⼀个记录是不存在的。
3.this.$router.go(n)相对于当前页⾯向前或向后跳转多少个页⾯,类似window.history.go(n)。
n可为正数可为负数。
正数返回上⼀个页⾯4.声明式:1) 根据路由路径(/home/sort/detail)跳转 <router-link :to="{path: '/home/sort/detail', query:{id: 'abc'}}">点击查看⼦页⾯</router-link>2) 根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查看⼦页⾯</router-link> :to="" 可以实现绑定动态的路由和参数⼆)Cookie和localStorage、sessionStorage的区别名称cookie localStorage sessionStorage相同点都可以⽤来在浏览器端存储数据,都是字符串的键值对数据声明周期⼀般由服务器⽣成,可设置失效时间;若在浏览器⽣成,默认关闭浏览器之后失效除⾮被清除,否则永久有效仅对当前对话有效,关闭当前页⾯或者浏览器后被清除存储⼤⼩4kb⼀般5mb与服务端通信每次都会携带在http请求头中,如果使⽤cookie保存过多,性能不太好仅在客户端存储,不参与服务端通信⽤途⼀般由服务器⽣成,来标识⽤户⾝份勇于浏览器端缓存数据三)数组相关参考⽂章数组相关:四)let var const 的区别1:var全局变量,存在变量提升,在声明前取值为undefined 会挂载在window上如:var a = 1;console.log(a,window.a) // 1 12:let 声明局部变量,只在块级作⽤域内有效console.log(b); // 报错:b在初始化之前不能接收let b = 10;var a = [];for (var i = 0; i < 10; i++) {a[i] = function () {console.log(i);};}a[2](); //10var b = [];for (let k = 0; k < 10; k++) {b[k] = function () {console.log(k);};}b[2](); //23:const 声名的是常量,⼀经声明不可改变。
2019年腾讯最新Java⼯程师⾯试题⼀、单选题(共21题,每题5分)1在正则表达式当中下⾯那⼀个字符集表⽰⾮空格字符、[:graph:]、[:digit:]C、[:space:]D、[:alpha:]参考答案:A答案解析:A2下列叙述中,错误的是( )。
A、内部类可访问它所在类的成员B、内部类的名称与定义它的类的名称可以相同C、内部类可⽤abstract修饰D、内部类可作为其他类的成员参考答案:A答案解析:暂⽆3以下哪个排序算法中,元素的⽐较次数元素与元素的初始排列⽆关()A、希尔排序B、快速排序C、归并排序D、直接插⼊排序E、选择排序参考答案:E4下⾯程序的输出结果是什么。
下⾯程序的输出结果是什么。
```1public class A2{2public static void main(String[] args){3int[] a={2,4,6,8,3,6,9,12};4 doSomething(a,0,a.length-1);5for(int i=0;i=x){6 swap(a,i,j);7 i++;//交换了⼏次8 }9 }//把最⼤的放到最后10 swap(a,i,end);//把最⼤的放到i的位置11return i;12 }1314private static void swap(int[] a,int i,int j)15 {16int tmp=a[i];17 a[i]=a[j];18 a[j]=tmp;19 }20 }21 ```A、找到最⼤值B、找到最⼩值C、从⼤到⼩的排序D、从⼩到⼤的排序参考答案:C答案解析:开始被注释迷惑了半天。
按快排的思想,遍历数组将⽐x⼤的按顺序存⾄a\[0\]a\[1\]a\[2\]..此时j负责遍历数组,i负责依次指向下⼀次遍历判断得到的⼤于x的数该存储的位置,每⼀次成功存储向后移动⼀格![](https:///source/1/Eawsn8OjUtldwcCznJeyAa-L2dkhbIeK.)![](https:///source/1/r_qNSSJe5jKn7YAjOeVqW87cD14xy3SB.)![](https:///source/1/P_3qexdojr61Po55nN0C_TegJw5vWnl_.)swap(a,i,end);//把最⼤的放到i的位置应该是将x交换⾄分界点,( x并⾮最⼤)⾄此⼀趟core完成,x左侧⼤于x,x右侧⼩于x,x左右任是⽆序数列然后依据分治的思想,对左序列,右序列迭代。
【黑马程序员】Java试题、50道Java面试题集(2019最新版)以下的内容是对原有的和最近Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,相对来说比较经典,相信对准备入职的Java程序员一定有所裨益。
一、Java基础部分1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。
抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2)继承:继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
3)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
4)多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B 系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
ava 最新常见面试题+ 答案汇总1、面试题模块汇总面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC 、Spring Boot/Spring Cloud 、 Hibernate 、 Mybatis 、RabbitMQ 、 Kafka、Zookeeper、 MySql、Redis、 JVM 。
以以下图所示:可能对于初学者不需要后边的框架和JVM 模块的知识,读者朋友们可依照自己的情况,选择对应的模块进行阅读。
合适阅读人群需要面试的初 / 中 / 高级java 程序员想要查漏补缺的人想要不断完满和扩大自己java 技术栈的人java 面试官详细面试题下面一起来看208 道面试题,详细的内容。
一、 Java 基础1.JDK 和 JRE 有什么差异?2.== 和 equals 的差异是什么?3.两个对象的hashCode()相同,则equals() 也必然为true ,对吗?4.final 在 java 中有什么作用?5.java 中的 Math.round(-1.5)等于多少?6.String 属于基础的数据种类吗?7.java 中操作字符串都有哪些类?它们之间有什么差异?8.String str="i" 与 String str=new String( “ i”)相同吗?9.如何将字符串反转?10.String 类的常用方法都有那些?11.抽象类必定要有抽象方法吗?12.一般类和抽象类有哪些差异?13.抽象类能使用final修饰吗?14.接口和抽象类有什么差异?15.java 中 IO 流分为几种?、 NIO、 AIO 有什么差异?17.Files 的常用方法都有哪些?二、容器18.java 容器都有哪些?19.Collection 和 Collections 有什么差异?、 Set、 Map 之间的差异是什么?21.HashMap 和 Hashtable 有什么差异?22.如何决定使用HashMap 还是TreeMap?23.说一下HashMap 的实现原理?24.说一下HashSet 的实现原理?25.ArrayList 和 LinkedList 的差异是什么?26.如何实现数组和List 之间的变换?27.ArrayList 和 Vector 的差异是什么?28.Array 和 ArrayList 有何差异?29.在 Queue 中 poll() 和 remove() 有什么差异?30.哪些会集类是线程安全的?31.迭代器Iterator是什么?怎么使用?有什么特点?和ListIterator有什么差异?34.怎么保证一个会集不能够被更正?三、多线程35.并行和并发有什么差异?36.线程和进度的差异?37.保卫线程是什么?38.创办线程有哪几种方式?39.说一下runnable和callable有什么差异?40.线程有哪些状态?41.sleep() 和 wait() 有什么差异?42.notify() 和 notifyAll() 有什么差异?43.线程的run()和 start() 有什么差异?44.创办线程池有哪几种方式?45.线程池都有哪些状态?46.线程池中submit() 和 execute()方法有什么差异?47.在 java 程序中怎么保证多线程的运行安全?48.多线程锁的升级原理是什么?49.什么是死锁?50.怎么防范死锁?51.ThreadLocal 是什么?有哪些使用途景?52.说一下synchronized 基层实现原理?53.synchronized 和 volatile的差异是什么?54.synchronized 和 Lock 有什么差异?55.synchronized 和 ReentrantLock 差异是什么?56.说一下atomic 的原理?四、反射57.什么是反射?58.什么是java 序列化?什么情况下需要序列化?59.动向代理是什么?有哪些应用?60.怎么实现动向代理?五、对象拷贝61.为什么要使用克隆?62.如何实现对象克隆?63.深拷贝和浅拷贝差异是什么?六、 Java Web64.jsp 和 servlet有什么差异?65.jsp 有哪些内置对象?作用分别是什么?66.说一下jsp 的 4 种作用域?67.session 和 cookie 有什么差异?68.说一下session 的工作原理?69.若是客户端禁止cookie 能实现session 还能够用吗?70.spring mvc 和 struts 的差异是什么?71.如何防范sql 注入?72.什么是XSS 攻击,如何防范?73.什么是CSRF 攻击,如何防范?七、异常和throws的差异?75.final 、 finally 、 finalize 有什么差异?中哪个部分能够省略?中,若是catch 中 return了,finally还会执行吗?78.常有的异常类有哪些?八、网络响应码301 和 302 代表的是什么?有什么差异?和redirect的差异?81.简述tcp 和 udp 的差异?82.tcp 为什么要三次握手,两次不能够吗?为什么?83.说一下tcp 粘包是怎么产生的?84.OSI 的七层模型都有哪些?85.get 和 post 央求有哪些差异?86.如何实现跨域?87.说一下JSONP 实现原理?九、设计模式88.说一下你熟悉的设计模式?89.简单工厂和抽象工厂有什么差异?十、 Spring/Spring MVC90.为什么要使用spring?91.讲解一下什么是aop?92.讲解一下什么是ioc?93.spring 有哪些主要模块?94.spring 常用的注入方式有哪些?95.spring 中的bean 是线程安全的吗?96.spring 支持几种bean 的作用域?97.spring 自动装置bean 有哪些方式?98.spring 事务实现方式有哪些?99.说一下spring 的事务隔断?100.说一下spring mvc 运行流程?101.spring mvc 有哪些组件?102.@RequestMapping的作用是什么?103.@Autowired的作用是什么?十一、 Spring Boot/Spring Cloud104.什么是spring boot ?105.为什么要用spring boot ?106.spring boot核心配置文件是什么?107.spring boot配置文件有哪几各种类?它们有什么差异?108.spring boot有哪些方式能够实现热部署?109.jpa 和 hibernate有什么差异?110.什么是spring cloud ?111.spring cloud断路器的作用是什么?112.spring cloud的核心组件有哪些?十二、 Hibernate113.为什么要使用hibernate ?114.什么是ORM 框架?中如何在控制台查察打印的sql 语句?有几种盘问方式?实体类能够被定义为final吗?118.在 hibernate中使用Integer 和 int 做照射有什么差异?是如何工作的?120.get()和 load() 的差异?121.说一下hibernate的缓存体系?对象有哪些状态?123.在 hibernate中getCurrentSession和openSession的差异是什么?实体类必定要有无参构造函数吗?为什么?十三、 Mybatis中#{}和${}的差异是什么?126.mybatis 有几种分页方式?127.RowBounds 是一次性盘问全部结果吗?为什么?逻辑分页和物理分页的差异是什么?可否支持延缓加载?延缓加载的原理是什么?130.说一下mybatis 的一级缓存和二级缓存?和hibernate的差异有哪些?有哪些执行器(Executor)?分页插件的实现原理是什么?如何编写一个自定义插件?十四、 RabbitMQ的使用途景有哪些?有哪些重要的角色?有哪些重要的组件?中vhost的作用是什么?的信息是怎么发送的?怎么保证信息的牢固性?怎么防范信息扔掉?142.要保证信息长远化成功的条件有哪些?长远化有什么弊端?有几种广播种类?怎么实现延缓信息队列?集群有什么用?节点的种类有哪些?集群搭建需要注意哪些问题?每个节点是其他节点的完满拷贝吗?为什么?集群中唯一一个磁盘节点崩溃了会发生什么情况?对集群节点停止序次有要求吗?十五、 Kafka152.kafka 能够走开zookeeper 单独使用吗?为什么?153.kafka 有几种数据保留的策略?154.kafka 同时设置了7 天和10G 除去数据,到第五天的时候信息达到了10G,这个时候kafka 将如何办理?155.什么情况会以致kafka 运行变慢?156.使用kafka 集群需要注意什么?十六、 Zookeeper157.zookeeper 是什么?158.zookeeper 都有哪些功能?159.zookeeper 有几种部署模式?160.zookeeper 怎么保证主从节点的状态同步?161.集群中为什么要有主节点?162.集群中有 3 台服务器,其中一个节点宕机,这个时候zookeeper 还能够够使用吗?163.说一下zookeeper 的通知体系?十七、 MySql164.数据库的三范式是什么?165.一张自增表里面总合有7 条数据,删除了最后 2 条数据,重启mysql 数据库,又插入了一条数据,此时id 是几?166.如何获取当前数据库版本?167.说一下ACID 是什么?168.char 和 varchar 的差异是什么?和double的差异是什么?170.mysql 的内连接、左连接、右连接有什么差异?171.mysql 索引是怎么实现的?172.怎么考据mysql 的索引可否满足需求?173.说一下数据库的事务隔断?174.说一下mysql 常用的引擎?175.说一下mysql 的行锁和表锁?176.说一下乐观锁和悲观锁?177.mysql 问题排查都有哪些手段?178.如何做mysql 的性能优化?十八、 Redis179.redis 是什么?都有哪些使用途景?180.redis 有哪些功能?181.redis 和 memecache 有什么差异?182.redis 为什么是单线程的?183.什么是缓存穿透?怎么解决?184.redis 支持的数据种类有哪些?185.redis 支持的java 客户端都有哪些?186.jedis 和 redisson 有哪些差异?187.怎么保证缓存和数据库数据的一致性?188.redis 长远化有几种方式?189.redis 怎么实现分布式锁?190.redis 分布式锁有什么弊端?191.redis 如何做内存优化?192.redis 裁汰策略有哪些?193.redis 常有的性能问题有哪些?该如何解决?十九、 JVM194.说一下jvm 的主要组成部分?及其作用?195.说一下jvm 运行时数据区?196.说一下货仓的差异?197.队列和栈是什么?有什么差异?198.什么是双亲委派模型?199.说一下类加载的执行过程?200.怎么判断对象可否能够被回收?201.java 中都有哪些引用种类?202.说一下jvm 有哪些垃圾回收算法?203.说一下jvm 有哪些垃圾回收器?204.详细介绍一下CMS 垃圾回收器?205.再生代垃圾回收器和老生代垃圾回收器都有哪些?有什么差异?206.简述分代垃圾回收器是怎么工作的?207.说一下jvm 调优的工具?208.常用的jvm 调优的参数都有哪些?2、面试题答案汇总(一)基础模块(二)容器(三)多线程(四)反射(五)对象拷贝(六) JavaWeb(七)异常(八)网络(九)设计模式(十) Spring/SpringMVC(十一) Spring Boot / Spring Cloud (十二) Hibernate(十三) Mybatis(十四) RabbitMQ(十五) Kafka(十六) Zookeeper(十七) MySql(十八) Redis(十九) JVM。
2019年Java 最常见的面试题1、java中Static关键字有哪些特点???答:1)、static成员变量静态变量:属于类,内存中只有一个复制,所有实例都指向同一个内存地址,只要类被加载,静态变量就会本分配空间,调用方式有两种。
类.静态变量和对象.静态变量实例变量:属于对象,只有对象被创建,实例对象才会被分配空间,调用方式:对象.实例变量2)、static成员方法静态方法:属于类,不需要创建对象,就可以被调用。
调用方式:类.静态方法和对象.静态方法非静态方法:属于对象,只能在对象被创建出来之后才可以被使用。
注意:static方法中,不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态成员方法。
2、java中length属性与length()方法有什么区别???答:length属性属于数组,用来获取数组的长度;而length()方法属于String 用来计算字符串长度。
3、java中Collections框架是什么???答:Collection是整个集合框架的基础,它里面存储了一组对象,用于表示不同类型的Collections.主要有一下三种,其特点如下。
1)、set 主要特点集合中元素不能重复。
2)、list有序的Collection,按照对象的进入顺序保存对象,可以重复。
3)、map提供了从键映射到值得数据结构,值可以重复单键必须唯一。
4、java中ArrayList 、Vector 、LinkedList有什么区别???答:ArrayList 、Vector 、LinkedList类均在java.util包,均为可伸缩数组,即可以动态改变长度的数组。
ArrayList 、Vector 都是基于数组来实现的,数据存储是连续的,支持下标访问元素,查询快,插入慢。
区别在于:ArrayList提供的方法都不是同步的,且线程不安全,但效率高。
Vector大部分方法都是同步的,且线程安全,效率低。
第1篇1. 请解释PHP中单引号和双引号的区别,以及哪个速度更快?为什么?2. 请简述PHP中魔术引用(magic quotes)的作用和风险。
3. 请解释PHP中的变量覆盖和引用传递。
4. 请说明PHP中的错误处理机制,包括错误报告级别和错误处理函数。
5. 请解释PHP中的魔术方法,如 __construct()、__destruct()、__get()、__set()、__call() 等。
6. 请解释PHP中的魔术常量,如 __FILE__、__LINE__、__CLASS__ 等。
7. 请简述PHP中的命名空间和自动加载机制。
8. 请解释PHP中的静态变量和静态方法。
9. 请解释PHP中的接口和抽象类。
10. 请解释PHP中的继承和多态。
二、PHP高级特性1. 请解释PHP中的闭包和匿名函数。
2. 请简述PHP中的反射(Reflection)。
3. 请解释PHP中的类型系统,包括类型提示、类型转换和类型断言。
4. 请解释PHP中的生成器(Generators)。
5. 请简述PHP中的异步编程。
6. 请解释PHP中的异步任务队列。
7. 请简述PHP中的缓存机制。
8. 请解释PHP中的数据库连接池。
9. 请解释PHP中的分布式缓存。
10. 请解释PHP中的异步数据库操作。
三、PHP框架和工具1. 请简述Laravel框架的主要特性和优势。
2. 请简述Symfony框架的主要特性和优势。
3. 请简述CodeIgniter框架的主要特性和优势。
4. 请简述Phalcon框架的主要特性和优势。
5. 请解释PHP中的依赖注入(Dependency Injection)。
6. 请解释PHP中的单元测试。
7. 请解释PHP中的代码质量工具,如PHPStan、PHP_CodeSniffer等。
8. 请解释PHP中的版本控制系统,如Git。
9. 请解释PHP中的持续集成(CI)和持续部署(CD)。
10. 请解释PHP中的性能优化工具,如Xdebug、Xcache等。
c语言面试题及答案2019C语言面试题及答案20191. 请解释C语言中的指针是什么?指针是一个变量,其值为另一个变量的地址。
在C语言中,指针可以指向任何类型的变量,包括整数、浮点数、数组、结构体等。
指针在内存中存储的是它所指向的变量的内存地址。
2. C语言中如何定义一个指针?在C语言中,定义一个指针需要使用星号(*)作为前缀。
例如,定义一个指向整数的指针可以写作:```cint *ptr;```这里,`ptr` 是一个指针变量,它可以存储一个整数的地址。
3. 解释C语言中的数组和指针的关系。
数组名在大多数情况下被用作指向数组第一个元素的指针。
例如,如果有一个数组 `int arr[10];`,那么 `arr` 可以被看作是一个指向 `arr[0]` 的指针。
4. C语言中如何声明一个指向指针的指针?指向指针的指针可以用于创建指向指针的指针变量。
声明方式是在指针声明的基础上再添加一个星号。
例如:```cint ptr_to_ptr;```这里,`ptr_to_ptr` 是一个指向指针的指针。
5. 什么是C语言中的函数指针?函数指针是指向函数的指针。
它可以存储函数的地址,并可以被用来调用函数。
声明函数指针的语法如下:```creturn_type (*ptr)(parameter_list);```其中 `return_type` 是函数的返回类型,`ptr` 是指针变量名,`parameter_list` 是函数参数列表。
6. C语言中如何使用函数指针?使用函数指针时,首先需要声明一个函数指针,然后可以将函数的地址赋值给该指针。
之后,可以使用指针调用函数。
例如:```cvoid func();void (*func_ptr)() = func;func_ptr(); // 调用函数```7. 解释C语言中的结构体是什么?结构体是一种用户自定义的数据类型,它允许将不同的数据类型组合成一个单一的数据结构。
程序员综合素质面试60题程序员综合素质面试60题1. ”你是谁?你来自哪里?你要走向何方?你要得到什么?” 用以上几个问题写一个小故事.2. 说说你今后三年的计划3. 说说你最想得到的三样东西(如事业,家庭,精神境界等)4. 说说你的优点5. 说说你处事的心态6. 你觉得成功人士要具备的三样素质7. 为什么你会选择我们公司?8. 你对自己所做过的项目有些很满意的?(团队完成和单独完成的分别说)9. 你会用什么数据库?10. 你的英语水平什么样?11. 你之前有没有过什么工作经验?(是不是IT的都可以)12. 你对你的未来有什么计划?13. 假如你的工作一直都和你想要的目标是不同的方向,你会有什么打算?14. 如果你被公司录用、由于工作需要,公司让你做一些其它方面的工作,遇到这种情况你该怎么办?15. 谈谈你对网页设计师这一职位的认识与看法。
16. 在我们工作生活中,难免会对某一问题17. 对于领导安排的工作你不会做,你的处理方法是什么?18. 你最得意的事情是什么?19. 你的缺点是什么?20. 你的三年计划是什么?如何达到?21. 是否使用过EJB?22. 是否用过单元测试?23. 能否做界面的工作?24. 对工作压力的处理?25. 能否出差工作?26. FrameWork1.1与FrameWork2.0的区别?分别有哪些技术?27. 讲讲自己曾经开发的项目。
运用哪些技术。
说出对该技术的了解。
28. 讲讲自己发展的前景和目标。
29. 你在与别人合作的项目中曾经遇到什么样的困难?是如何解决的?30. 假设你与一个好朋友在同一个公司不同部门,而且在竞争同一个项目,你应该怎样处理关系?31. 你期待的上司与同事是什么样的?当你的意见与上司相阻时是怎么处理的?32. 怎样看待IT行业的加班?怎样看待行业内高压的工作环境?33. 怎样理解公司的口碑?有什么建议?34. 使用期工资的期望值35. (争取回答3个人只要求2回答):假如你们三个中一定会淘汰一个,你认为会是哪一个?并说明理由.36. 你是怎么不断学习新知识的?通过什么途径?8. 你怎样理解团队9. 你未来2年的职业规划10. 你希望试用(3个月)和之后的薪水11. 如果公司要赶项目要星期6也上班,你有什么看法1. 说说你做过的一个项目2. 你在项目中扮演的角色3. 假设现在有一个个市政园林局的的项目, 你怎样制定一份需求说明?4. 要将项目中每一个功能模块的功能和操作流程展示给客户, 你会采用什么方式?(UML的用例图)5. 在程序中操纵数据库不用JDBC的话,你会用什么方式? 熟悉一对多、多对一吗?6. 你对WEB2.0了解有多少?7. 你为什么选择我们公司?37. 9.如果领导安排的任务不会做,你会怎么处理38. 你认为程序员最重要的是什么?39. 你对自己的未来有什么计划?40. 你对项目经理是怎么定义的?41. 什么叫做设计,用一句话概括42. 假如客户对你的软件不满意,如何解决?43. 你对目前的软件行业有何看法?你的目标是什么?44. 你在北大青鸟培训中心学到了什么?45. 你如何评价自己?46. 请列出我司聘请你的理由(50字内)。
第1篇一、基础知识1. 请解释一下什么是位运算,并举例说明其应用场景。
位运算是指对二进制位进行操作的运算,主要包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)等。
以下是一些应用场景:(1)按位与:用于判断两个整数的某一位是否同时为1。
(2)按位或:用于将两个整数的对应位进行或运算,得到结果。
(3)按位异或:用于将两个整数的对应位进行异或运算,如果两个位相同,则结果为0;如果两个位不同,则结果为1。
(4)按位取反:用于将整数的每一位取反,即将0变为1,将1变为0。
(5)左移:用于将整数的二进制表示向左移动指定的位数,右边的位被丢弃,左边补0。
(6)右移:用于将整数的二进制表示向右移动指定的位数,左边的位被丢弃,右边补0。
2. 请解释一下什么是数据类型,并列举常见的几种数据类型。
数据类型是指用于定义变量存储的数据种类的类型。
以下是一些常见的几种数据类型:(1)整型(int):用于存储整数,如int a = 10;(2)浮点型(float、double):用于存储实数,如float b = 3.14;(3)字符型(char):用于存储单个字符,如char c = 'A';(4)布尔型(bool):用于存储布尔值,如bool d = true;(5)数组:用于存储一系列相同类型的数据,如int arr[10];(6)结构体(struct):用于存储不同类型的数据,如struct Person {int age; char name[20];};(7)指针:用于存储变量的地址,如int ptr = &a。
3. 请解释一下什么是面向对象编程,并举例说明其应用场景。
面向对象编程(OOP)是一种编程范式,它将数据和行为封装在对象中,强调继承、封装和多态。
以下是一些应用场景:(1)设计大型软件系统,如操作系统、数据库等;(2)开发图形用户界面(GUI)应用程序;(3)开发网络应用程序,如Web应用、移动应用等;(4)开发游戏和模拟软件。
【黑马程序员】Java试题、50道Java面试题集(2019最新版)41-50以下的内容是对原有的和最近Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,相对来说比较经典,相信对准备入职的Java程序员一定有所裨益。
41、日期和时间:1)如何取得年月日、小时分钟秒?2)如何取得从1970年1月1日0时0分0秒到现在的毫秒数?3)如何取得某月的最后一天?4)如何格式化日期?答:操作方法如下所示:1)创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值2)以下方法均可获得该毫秒数:Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();//何问起3)示例代码如下:Calendar time = Calendar.getInstance();time.getActualMaximum(Calendar.DAY_OF_MONTH);//何问起4)利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。
42、打印昨天的当前时刻。
答:public class YesterdayCurrent {public static void main(String[] args){Calendar cal = Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}} //何问起黑马程序员视频库网址:(海量热门编程视频、资料免费学习)学习路线图、学习大纲、各阶段知识点、资料网盘免费领取+QQ 3285264708 / 354966419543、比较一下Java 和JavaSciprt。
【黑马程序员】Java试题、50道Java面试题集(2019最新版)21-30以下的内容是对原有的和最近Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,相对来说比较经典,相信对准备入职的Java程序员一定有所裨益。
21、描述一下JVM 加载class文件的原理机制?答:JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。
补充:1.由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。
当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。
加载完成后,Class对象还不完整,所以此时的类还不可用。
当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后JVM对类进行初始化,包括:1如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2如果类中存在初始化语句,就依次执行这些初始化语句。
2.类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(ng.ClassLoader的子类)。
从JDK 1.2开始,类加载过程采取了父亲委托机制(PDM)。
PDM更好的保证了Java平台的安全性,在该机制中,JVM 自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。
类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。
JVM不会向Java程序提供对Bootstrap的引用。
PHP程序员搜狐2019年⾯试题和答案解析⼀、单选题(共27题,每题5分)1.阅读下⾯PHP代码,并选择输出结果( )A、0B、1C、2D、3参考答案:D答案解析:static属性常驻内存2.PHP单例模式操作描述错误的是?A、单例模式第⼀次实例会被建⽴以后执⾏可以直接使⽤B、需要⼀个保存类的唯⼀实例的静态成员变量C、构造函数和克隆函数必须声明为私有的D、必须提供⼀个访问这个实例的公共的静态⽅法参考答案:A答案解析:PHP中,所有的变量⽆论是全局变量还是类的静态成员,都是页⾯级的,每次页⾯被执⾏时,都会重新建⽴新的对象,都会在页⾯执⾏完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式只是针对单次页⾯级请求时出现多个应⽤场景并需要共享同⼀对象资源时有意义3.下⾯那个不是mysql存储引擎的锁类型?A、表锁B、页锁C、⾏锁D、⽆参考答案:B答案解析:mysql中myisam是有表锁,innodb是⾏锁,基于索引加锁,如果where条件没有索引,是所有⾏加锁;sql server 才有页锁(加⼊群677079770获取更多⾯试题答案。
)4.以下哪条不是PHP语⾔的特性?A、开源B、免费C、基于客户端D、便捷⾼效参考答案:C答案解析:PHP语⾔的特性为:开源、免费和便捷⾼效。
5.关于PHP模式修饰符说法错误的是?A、i ⼤⼩写不敏感匹配B、m ^将只匹配字符串的开头C、x 空⽩和#注释将被忽略D、将替换后的字符串作为php代码评估执⾏参考答案:B答案解析:m为增强的⾏锚点模式,\\n的前后也会被认为结束和开始(加⼊群677079770获取更多⾯试题答案。
)6.关于Laravel中间件错误的是?A、运⾏Artisan 命令 make:middleware 创建新的中间件B、可定义前置 & 后置中间件C、中间件是代理模式D、中间件是中介模式参考答案:C答案解析:运⾏Artisan 命令 make:middleware 创建新的中间件可定义前置 & 后置中间件(加⼊群677079770获取更多⾯试题答案。
js面试题及答案20191. JavaScript中,什么是闭包,它有什么用途?答案:闭包是指一个函数能够访问其定义时的作用域链,即使在其定义的作用域外执行。
闭包常用于创建私有变量和函数,实现模块化编程。
2. 请解释JavaScript中的原型继承。
答案:JavaScript中的原型继承是指对象可以直接继承另一个对象的属性和方法。
每个JavaScript对象都有一个原型对象,通过原型链可以访问到原型对象的属性和方法。
3. 如何判断一个变量是数组类型?答案:可以使用`Array.isArray()`方法来判断一个变量是否是数组类型。
4. JavaScript中,什么是事件冒泡和事件捕获?答案:事件冒泡是指当一个元素上的事件被触发时,该事件会从当前元素开始,逐级向上传播到文档的根元素。
事件捕获则是相反的过程,事件从根元素开始,逐级向下传播到目标元素。
5. 请解释JavaScript中的`var`、`let`和`const`之间的区别。
答案:`var`声明的变量具有函数作用域,且可以被重新赋值和提升。
`let`声明的变量具有块级作用域,不能被重新声明,也不能被提升。
`const`声明的常量具有块级作用域,一旦声明必须初始化,且不能被重新赋值。
6. 什么是异步编程,JavaScript中如何实现异步编程?答案:异步编程是指在程序执行过程中,允许某些操作在后台执行,而不会阻塞主线程。
JavaScript中可以通过回调函数、Promise、async/await等方式实现异步编程。
7. 请解释JavaScript中的深拷贝和浅拷贝。
答案:浅拷贝只复制对象的第一层属性,如果属性值是引用类型,则复制的是引用。
深拷贝会递归复制对象的所有层级,直到所有的属性都被复制。
8. 什么是JavaScript的事件循环机制?答案:JavaScript的事件循环机制是指JavaScript运行时环境维护一个任务队列,当执行栈为空时,事件循环会检查任务队列,将任务依次加入执行栈执行。
第1篇一、基础知识1. PHP是什么?PHP(Hypertext Preprocessor)是一种开源的脚本语言,主要用于服务器端编程。
它具有跨平台、易于学习、功能强大等特点,广泛应用于网站开发、服务器管理等领域。
2. PHP的运行环境有哪些?PHP主要运行在Linux、Windows、macOS等操作系统上,支持Apache、IIS、Nginx 等多种Web服务器。
3. PHP的数据类型有哪些?PHP的数据类型包括:- 整数(int)- 浮点数(float)- 字符串(string)- 布尔值(bool)- 数组(array)- 对象(object)- 资源(resource)- NULL4. PHP中的变量声明有哪些方式?PHP中的变量声明有以下几种方式:- $var = value;- $$var = value; // 前导$表示变量名是变量- list($var1, $var2, ...) = array(value1, value2, ...); // 数组解包PHP中的运算符包括:- 算术运算符(+、-、、/、%等)- 关系运算符(==、===、<、>、<=、>=等)- 逻辑运算符(&&、||、!等)- 赋值运算符(=、+=、-=等)- 其他运算符(如字符串连接符`.`、数组连接符`[]`等)6. PHP中的函数如何定义和使用?PHP中的函数使用以下格式定义:```phpfunction function_name($param1, $param2, ...) {// 函数体}```使用函数时,只需调用函数名并传入相应的参数即可:```phpfunction_name($param1, $param2, ...);```7. PHP中的面向对象编程有哪些特点?PHP中的面向对象编程具有以下特点:- 封装:将数据和操作数据的方法封装在一起- 继承:通过继承可以创建新的类,并继承已有类的属性和方法- 多态:通过接口或抽象类实现不同类对同一方法的实现,实现多态PHP中的魔术方法包括:- 构造方法:__construct()- 析构方法:__destruct()- 设置器:__set()- 获取器:__get()- 运算符重载:__add()、__sub()、__mul()、__div()等二、进阶知识1. PHP中的面向对象编程有哪些优点?- 提高代码的可读性和可维护性- 实现代码重用- 降低代码耦合度- 支持代码封装、继承和多态2. 如何在PHP中实现单例模式?在PHP中实现单例模式有以下几种方法:- 使用静态变量存储实例- 使用工厂方法- 使用注册器模式以下是一个使用静态变量存储实例的单例模式示例:```phpclass Singleton {private static $instance = null;private function __construct() {// 构造函数私有,防止外部实例化}public static function getInstance() {if (self::$instance === null) {self::$instance = new Singleton();}return self::$instance;}}```3. PHP中的数据库连接方式有哪些?PHP中的数据库连接方式主要有以下几种:- 使用mysqli或PDO类连接MySQL数据库- 使用mysqli或PDO类连接PostgreSQL数据库- 使用mysqli或PDO类连接SQLite数据库- 使用mysqli或PDO类连接Oracle数据库以下是一个使用mysqli连接MySQL数据库的示例:```php$mysqli = new mysqli("localhost", "username", "password", "database"); if ($mysqli->connect_error) {die("连接失败: " . $mysqli->connect_error);}```4. PHP中的会话控制有哪些方法?PHP中的会话控制主要有以下几种方法:- 使用$_SESSION超全局变量存储会话数据- 使用session_start()函数开启会话- 使用session_destroy()函数销毁会话- 使用session_regenerate_id()函数生成新的会话ID以下是一个使用$_SESSION存储会话数据的示例:```phpsession_start();$_SESSION['username'] = 'John Doe';```5. PHP中的文件操作有哪些方法?PHP中的文件操作方法包括:- 使用file()、file_get_contents()、file_put_contents()等函数读取和写入文件- 使用fopen()、fclose()、fwrite()、fread()等函数操作文件指针- 使用feof()、fgetc()、fgets()、fputs()等函数逐字符读取文件以下是一个使用file_get_contents()读取文件的示例:```php$fileContent = file_get_contents("example.txt");echo $fileContent;```6. PHP中的异常处理有哪些方法?PHP中的异常处理主要有以下几种方法:- 使用try-catch语句捕获和处理异常- 使用throw关键字抛出异常- 使用set_exception_handler()函数设置异常处理函数以下是一个使用try-catch语句捕获异常的示例:```phptry {// 尝试执行的代码throw new Exception("发生错误");} catch (Exception $e) {// 捕获异常并处理echo "捕获到异常:" . $e->getMessage();}```三、实战题目1. 编写一个函数,实现字符串反转。
2019年程序员考试面试题精选题
-求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态
的限制。
但这道题却能有效地考查发散思维水平,而发散思维水平能
反映出对编程相关技术理解的深刻水准。
通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种
思路。
因为已经明确限制for和while的使用,循环已经不能再用了。
同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归
下去还是终止递归,但现在题目已经不允许使用这两种语句了。
我们仍然围绕循环做文章。
循环仅仅让相同的代码执行n遍而已,我
们完全能够不用for和while达到这个效果。
比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。
我们能够将需要执行的代码放到构造函数里。
如下代码正
是基于这个思路:
class Temp
public:
Temp() { ++ N; Sum += N; }
static void Reset() { N = 0; Sum = 0; }
static int GetSum() { return Sum; }
private:
static int N;
static int Sum;
};
int Temp::N = 0;
int Temp::Sum = 0;
int solution1_Sum(int n)
Temp::Reset();
Temp *a = new Temp[n];
delete []a;
a = 0;
return Temp::GetSum();
我们同样也能够围绕递归做文章。
既然不能判断是不是应该终止递归,我们不妨定义两个函数。
一个函数充当递归函数的角色,另一个函数
处理终止递归的情况,我们需要做的就是在两个函数里二选一。
从二
选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。
那现在的问题是如和把数值变量n
转换成布尔值。
如果对n连续做两次反运算,即!!n,那么非零的n转
换为true,0转换为false。
有了上述分析,我们再来看下面的代码:class A;
A* Array[2];
class A
public:
virtual int Sum (int n) { return 0; }
};
class B: public A
public:
virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};
int solution2_Sum(int n)
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
这种方法是用虚函数来实现函数的选择。
当n不为零时,执行函数B::Sum;当n为0时,执行A::Sum。
我们也能够直接用函数指针数组,
这样可能还更直接一些:
typedef int (*fun)(int);
int solution3_f1(int i)
return 0;
int solution3_f2(int i)
fun f[2]={solution3_f1, solution3_f2};
return i+f[!!i](i-1);
另外我们还能够让编译器帮我们来完成类似于递归的运算,比如如下
代码:
template struct solution4_Sum
enum Value { N = solution4_Sum::N + n};
};
template
enum Value { N = 1};
};
solution4_Sum::N就是1+2+...+100的结果。
当编译器看到
solution4_Sum时,就是为模板类solution4_Sum以参数100生成该类型的代码。
但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum::N=solution4_Sum::N+100。
这个过程会递归一直
到参数为1的类型,因为该类型已经显式定义,编译器无需生成,递
归编译到此结束。
因为这个过程是在编译过程中完成的,所以要求输
入n必须是在编译期间就能确定,不能动态输入。
这是该方法的缺点。
而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不
能太大。