1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
2、JDK和JRE的区别是什么?
Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其他工具。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
3、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
4、是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
5、Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8种基本数据类型是:
byte、short、int、long、float、double、boolean、char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
Java支持的数据类型包括两种:一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程
6、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
7、Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
8、Java支持多继承么?
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。
9、接口和抽象类的区别是什么?
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别
10、什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递
11、进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
线程的划分小于进程,线程隶属于某个进程。 进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能占有这些资源的。 进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。 进程在执行的过程中,包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制
12、创建线程有几种不同的方式?你喜欢哪一种?为什么?
有4种方式可以用来创建线程:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
还有一种方式是实现Callable接口
13、概括的解释下线程的几种可用状态。
1. 新建( new ):新创建了一个线程对象。
2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。
4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。 当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。
5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。
14、同步方法和同步代码块的区别是什么?
区别:
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
15、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
16、什么是死锁(deadlock)?
所谓死锁是指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。死锁产生的4个必要条件:
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
https://wenku.baidu.com/view/844a0cb08662caaedd3383c4bb4cf7ec4afeb6a8.html
在复试之前听闻专业课笔试考查的范围很广,准备了也没大用,考完专业课笔试大觉前辈言之有理。今年的专业课考了数据结构+操作系统+软件工程+编译原理,基本就是这四门课的内容。题型大概如下:
填空题:
(1)折半查找失败时的最大次数
(2)在软件工程各个阶段中有几个阶段可以软件复用
(3)编译原理的几个环节(词法分析,语法分析等等。。)
大题:
(1)编译原理中的消除二义性
(2)PV操作的一个设计题
英语翻译,二选一的题目。一题是分布式系统的翻译题另一题是人机交互的题目
(3)编程题,题目大意是在平面空间有N个点,让你求出一个点的坐标,这个点到这N的点的距离和最小
大题:
可以称之为开放题,二选一,也是两个实验室各一个题,做哪一个任意。我就记得软工的题目是谈谈对中间件和分布式系统的了解并举例。
面试
面试每个人20分钟左右,5分钟讲PPT,最后有个英语口语测试。讲PPT的过程中我发现老师们对两部分的内容很感兴趣,其一是本科做过的项目以及毕业设计,其二是对于研究生生活和就业方向的规划。根据情况来看,不管是谁老师都会问两个方面的问题:(1)有关你做过的项目的问题
(2)有关你对该实验室研究方向的了解程度
其他的问题就千奇百怪了,我讲完ppt老师先问我的问题是“如果给你一个团队你将如何完成项目的开发?”,随后又是几个有关软件工程的问题。然后就谈到了本科做的项目实现,可能是由于我之前做的东西和实验室关联不大又或者是在PPT中我讲的比较详细,这个部分老师就粗略问问没有深究。随后,有老师开始问与实验室相关的问题,询问一些与分布式系统有关的问题。最令人蛋疼的问题是让我谈谈并行存储技术与我已经掌握的算法有什么共通性?(当时我讲未来规划的时候提到要挖掘技术平台的共通性,老师就在这里借题发挥了,囧。。。)还好当时脑子转的比较快,用分治法结合自己的认识作答,老师听了以后点点头不再问问题了。
之后,几位老师互相看了看,估计是觉得要问的了于是就开始英语口语测试。口语的一般套路是老师让你做个自我介绍然后问你问题,可是到我这里那老师可能忘了,上来就开始问问题。题目比较简单,我也都听懂了,不过本人口语实在拙劣,基本上都是很简单的回答。口语遇到最蛋疼的问题是,老师问“你最喜欢的运动是什么?”,我豪不思索的回答了“Esports!”,那个女老师满脸不解,旁边一个男老师估计和我是同道中人在那里偷笑(略显邪恶),随后她追问道“什么是电子竞技”。顿时我蛋疼了,后悔自己给自己弄了这么大一个坑。。。"Can I speak Chinese?",众人一阵无语。。。
这就是我的面试经过,我觉得最重要的是要对自己有信心,懂得东西一定要说遇到不懂的东西可以把话题引到你擅长的领域,随机应变才是王道。记得之前师兄说过复试之前一定要蛋腚,以平常心对待,回想起来很有道理,我也想劝明年复试的师弟师妹们蛋腚,一定要蛋腚。。。相信自己,发挥正常水准就没问题的。
复试笔试共6道题目: 1,给了一串数字,两小问 1》建立初始堆(小堆) 2》平衡二叉树 2,脑子短路…… 3,3000个随机数,选出最小的8个数字即可,问下列那种排序方法最好……堆,快排,归并,基数排序。 4,软件工程的题目,面向对象的概念和性质,软件测试的过程,瀑布模型,快速原型模型。 5,给了一段函数,问哪些地方有错 6,印象深刻,因为不会而且错了 union str{ int x; char a[2]; }e; int main(){ e.a[0]=1; e.a[1]=9; printf("%d",e.x); return 0; } 问输出结果 我写的是0,应该是2305。涉及到大小端输出,我想的太简单的,我以为和struct一样。 ps:1和9的顺序可能弄反了,记不大清,知识点没错。 面试,尬聊。因为本以为简单英文介绍和ppt讲解就没事了,结果问了好多……最最遗憾的是,好几个老师在问同一个问题,你做项目时候,有没有遇到什么 困难和难点,我回答是比较简单,都是参考书上能查到的,所以没啥难点,老师问过好多次,我都这回答,逼急了,我回了句,环境变量第一次配的时候,挺难的 ……现在想想,真是智障。 面试内容我总结下: 1,英语,自我陈诉后问问题,今年c组好像都有问到你有没有什么印象深刻的teamwork? 2,ppt自我介绍。 3,重点会问项目经历 4,开放性问题,生活类,例如你们学校的XX老师你认识么……之类的 5,好的本科院校和初试成绩蛮重要的,老师会认为你基础就是这个,加成比较大 6,今年数学我没有被问到什么。 后来我问老师,老师说没打算问什么专业难度东西,就是想看看你基础怎样,有没有做学术的潜力。说我基础还在,有点儿薄弱,需要培养。 |
. 软件所复试B组包括基础软件国家工程研究中心、互联网软件技术实验室
一、综述 1. 软件所复试B组包括基础软件国家工程研究中心、互联网软件技术实验室; 2. 时间安排: 1) 22日下午13:30 - 16:00 报道,交材料; 2) 23日上午笔试(120min,8:30 - 10:30)、机试(60min,10:30 - 11:30),下午面试(13:00 - 17:00); 3) 24日体检(8:00 - 10:00,中关村医院4层体检中心); 二、笔试题 1. 智力题:1.数字序列找规律 2.英文智力题 3.综合智力题; 2. 选择题:内容涉及数据结构、操作系统、计算机网络、数据库、软件工程、编译原理、C++等;(主要是基本概念比较简单) 3. 问答题 1) 浅谈大数据对生活带来的变革 2) 浅谈对“互联网+”的理解 3) 什么是数据库中的基本表,什么是视图,两者有什么关联 4) 什么是系统调用,和过程调用有什么联系和区别 5) 选择其中至少两个名词进行解释:COCOMO、PAAS、API、Git、 4. 翻译题:选择其中一篇,第一篇是关于软件工程的,第二篇是关于物联网的; 5. 表述题:结合自己的项目经历,选择其中一个题目进行表述 1) 描述一个自己的项目,包括项目的需求获取、项目分析、项目的设计等角度阐述 2) 描述自己发表的一篇论文,要求一作或二作 3) 谈谈开源软件的影响 4) 结合自己的项目经历表述自己对软件工程的认识 三、机试题:有四个分值段的题目,分别为2'、3'、5'、10',第四分值段只有一道,其他多道;考试形式是从一、二、三中各选一道或者选最后一道进行作答(选够10分即可),考试时间60min。注意:考研复试机试题目与历年机试题、保研机试题等可能会有很多重复,所以… 1. 第一分值段2' 1) 求最大公约数 2. 第二分值段3' 1) 判断一棵二叉树是不是二叉排序树 3. 第三分值段5' 1) 01背包问题 4. 第四分值段10' 四、面试 1. 流程:结合PPT展开自我介绍(5min)、老师提问、测试英语口语; 2. 关于自我介绍的建议: 1) 一定要事先设计好你的简历、自我介绍、PPT哦(这三个其实是你自己的不同表现形式,其实是统一的),设计好你的自我介绍让老师老老实实进入你的坑,比如你重点介绍一个项目,让老师自然而然的问你关于这个项目的问题; 2) 我设计的自我介绍是:个人简介(个人信息、学校、性格、个人兴趣)、成绩(初试、本科、六级等、专业课兴趣、获得的奖励)、项目经历+毕业设计、研究生阶段的计划(目的、规划)。其中项目经历着重简要描述其中三个,最主要的是第一个,描述项目应该包括来源、现在的成果如何、做项目的过程是什么、有哪些收获等;毕业设计我也着重准备了。事实证明,面试完全在我的计划之中,包括老师提问的问题大部分都是提前设计好的,这还是蛮有意思的。关于自我介绍+PPT,我私下排练了很多遍,到了面试时才能自然而然的说出应该说的,讲解的内容如果能达到”必要充分“的程度真的是极致完美了; 3. 关于英语口语的建议:额。。我提前准备好了比较完美的英文自我介绍,结果发现没有英文自我介绍(所以,提前了解清楚情况是多么重要。。),然而之前我觉得不太会问”介绍你的家乡“”介绍你的家庭“”介绍你的学校“等很low很泛滥的问题所以没准备,结果真的问了。。结果我就卡壳了。。所以有备无患,不要懒惰。(摘录在《操作系统王道单科书》上看到的一句话,是说了三遍的一句话,“考研成功的秘诀是反复和多次,偷工减料是要吃亏的”)英语口语不好不会把你毙掉,但是会影响成绩的。 4. 其他建议:做最真实的自己,要真诚不要虚假,你的态度老师会感觉到的;气氛没必要弄的紧张,开开心心、轻轻松松的进行自我介绍回答老师问题,也可以在恰当的时机开个玩笑,整个氛围都会是轻松的; 五、体检:早点去早点去早点去,不然排队很长很无聊的。。。 |