Java工程师面试题.docx
- 文档编号:30132986
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:47
- 大小:156.24KB
Java工程师面试题.docx
《Java工程师面试题.docx》由会员分享,可在线阅读,更多相关《Java工程师面试题.docx(47页珍藏版)》请在冰豆网上搜索。
Java工程师面试题
1、面向对象的特征有哪些方面?
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
3、String是最基本的数据类型吗?
基本数据类型:
8个
引用数据类型:
数组,类和接口
4、floatf=3.4;是否正确?
Floatf=(float)3.4
否。
Float型常量后面必须要有后缀f或F。
5、shorts1=1;s1=s1+1;有错吗?
shorts1=1;s1+=1;有错吗?
对于shorts1=1;s1=s1+1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。
而shorts1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换。
6、Java有没有goto?
goto和const,是两个java目前无法使用的关键字
7、int和Integer有什么区别?
①int是基本数据类型,integer是int的包装类
②integer变量必须实例化后才能使用,int变量不需要
③integer实际是对象的引用,指向此new的Integer对象,int是直接存储数据值。
④integer的默认值是null,int默认值是0
8、&和&&的区别?
&:
无论左边结果为什么,右边都要参与运算
&&:
短路与,如果左边为false,那么右边不参与运算
|和||:
|两边都运算
||:
短路或,如果左边为true,那么右边不参与运算
对两个变量的数据进行交换,不需要第三方变量。
Inta=3,b=5
①a=a+b;b=a-b;a=a-b;②a=a^b;b=a^b;a=a^b;
9、解释内存中的栈(stack)、堆(heap)和静态区(staticarea)的用法。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。
栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
Stringstr=newString("hello");
上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。
补充:
较新版本的Java(从Java6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能
10、Math.round(11.5)等于多少?
Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。
四舍五入的原理是在参数上加0.5然后进行下取整。
--补充!
ceil>=rount>=floor
11、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch表达式的值可以为byte,short,int,char,enum,string(java7开始)
,不能为long
12、用最有效率的方法计算2乘以8?
2<<3(左移3位相当于乘以2的三次方,右移3位相当于除于2的3次方)
13、数组有没有length()方法?
String有没有length()方法?
数组求长度用length属性,String求长度用length()方法,集合求长度用size()方法。
14、在Java中,如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环
15、构造器(constructor)是否可被重写(override)?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
构造器Constructor用来生成一个类的实例。
16、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?
不对,如果两个对象x和y满足x.equals(y)==true,它们的哈希码(hashcode)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
17、是否可以继承String类?
Java把string类声明为final类,因此用户不能扩展string类,即string类不可以有子类。
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
(值传递)
Java编程语言只有值传递参数。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。
指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
19、String和StringBuilder、StringBuffer的区别?
答:
Java平台提供了两种类型的字符串:
StringStringBuffer/StringBuilder,它们可以储存和操作字符串。
其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
StringBuilder是Java#5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
面试题1-什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
(String没有append方法)
面试题2-请说出下面程序的输出。
classStringEqualTest{
publicstaticvoidmain(String[]args){
Strings1="Programming";
Strings2=newString("Programming");
Strings3="Program";
Strings4="ming";
Strings5="Program"+"ming";
Strings6=s3+s4;
System.out.println(s1==s2);
System.out.println(s1==s5);
System.out.println(s1==s6);
System.out.println(s1==s6.intern());
System.out.println(s2==s2.intern());
}
}
返回值:
falsetruefalsetruefalse补充:
String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
1.如果要操作少量的数据用:
String
2.单线程操作字符串缓冲区下操作大量数据:
StringBuilder
3.多线程操作字符串缓冲区下操作大量数据:
StringBuffer
20、重载(Overload)和重写(Override)的区别。
重载的方法能否根据返回类型进行区分(不可以)?
重载和重写都是多态性的体现,区别是重载是编译时的多态性,重写是运行时的多态性;
重载:
只发生在一个类中,通过同名方法名不同参数类型或者参数个数来区分
重写:
发生在父类和子类之间,重写要求子类的重写方法必须和父类被重写方法有相同的返回类型,比父类的方法更好访问,不能比父类被重写的方法声明更多的异常,而重载没有返回类型的特殊要求
21、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。
当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。
加载完成后,Class对象还不完整,所以此时的类还不可用。
当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后JVM对类进行初始化,包括:
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:
根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。
从Java2(JDK1.2)开始,类加载过程采取了父亲委托机制(PDM)。
PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。
类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。
JVM不会向Java程序提供对Bootstrap的引用。
下面是关于几个类加载器的说明:
Bootstrap:
一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
Extension:
从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
System:
又叫应用类加载器,其父类是Extension。
它是应用最广泛的类加载器。
它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。
22、char型变量中能不能存贮一个中文汉字,为什么?
char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
23、抽象类(abstractclass)和接口(interface)有什么异同?
①同:
abstract类和interface都不能实例化,都可以有abstract方法,一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
②异:
接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
24、静态嵌套类(StaticNestedClass)和内部类(InnerClass)的不同?
Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。
而通常的内部类需要在外部类实例化后才能实例化
25、Java中会存在内存泄漏吗,请简单描述。
理论上Java因为有垃圾回收机制(GC周期检查检查某个实体实体是否已不再被任何对象所调用(引用),如果存在这样的实体,就释放实体占有的内存)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。
例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
26、抽象的(abstract)方法(只允许声明,不允许实现)是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能。
抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。
本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。
synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的
27、阐述静态变量(类变量)和实例变量的区别。
①不同对象的实例变量互不相同②所有对象共享类变量(不同对象的类变量占同一处内存)③通过类名可以直接访问类变量
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
否。
静态方法只能操作静态变量,不可以操作实例变量。
非静态方法必须用类new出对象后才能调用,在调用非静态方法时可能对象没有初始化。
29、如何实现对象克隆?
1).实现Cloneable接口并重写Object类中的clone()方法;
2).实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
31、Strings=newString("xyz");创建了几个字符串对象?
两个对象,一个是静态区的”xyz”,一个是用new创建在堆上的对象
32、接口是否可继承(extends)接口?
抽象类是否可实现(implements)接口?
抽象类是否可继承具体类(concreteclass)?
接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类,也可以继承抽象类,抽象类也可以有静态main方法。
33、一个".java"源文件中是否可以包含多个类(不是内部类)?
有什么限制?
可以包含多个类,但只允许有一个public类,并且类名必须和文件名一致。
(如果有多个类,但没有public类,那么源文件的名字只要和某个类的名字相同就可以了。
)
34、AnonymousInnerClass(匿名内部类)是否可以继承其它类?
是否可以实现接口?
可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调
35、内部类可以引用它的包含类(外部类)的成员吗?
有没有什么限制?
完全可以。
如果不是静态内部类,那没有什么限制!
一个内部类对象可以访问创建它的外部类对象的成员包括私有成员。
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。
36、Java中的final关键字有哪些用法?
(1)修饰类:
表示该类不能被继承;
(2)修饰方法:
表示方法不能被重写;(3)修饰变量:
表示变量只能一次赋值以后值不能被修改(常量)
38、数据类型之间的转换:
1)如何将字符串转换为基本数据类型?
2)如何将基本数据类型转换为字符串?
1)调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;Integer.parseInt(a)Integer.valueOf(a)
2)一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用String类中的valueOf(…)方法返回相应字符串String.valueOf(int)Integer.toString
39、如何实现字符串的反转及替换?
方法很多,可以自己写实现也可以使用String(replaceALL())或StringBuffer(reverse(),replace(intstartIndex,intendIndex,Stringstr))/StringBuilder中的方法。
有一道很常见的面试题是用递归实现字符串反转,代码如下所示:
publicstaticStringreverse(StringoriginStr)
{if(originStr==null||originStr.length()<=1)
returnoriginStr;
returnreverse(originStr.substring
(1))+originStr.charAt(0);}
40、怎样将(GB2312)编码的字符串转换为(ISO-8859-1)编码的字符串?
Strings1="你好";Strings2=newString(s1.getBytes("GB2312"),"ISO-8859-1");
41、日期和时间:
42、打印昨天的当前时刻。
publicclassYesterdayCurrent{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Calendarcalendar=Calendar.getInstance();
calendar.add(Calendar.DATE,-1);
System.out.println(calendar.getTime());
}
43、比较一下Java和JavaSciprt。
JavaScript与Java是两个公司开发的不同的两个产品。
Java是原SunMicrosystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。
JavaScript的前身是LiveScript;而Java的前身是Oak语言。
下面对两种语言间的异同作如下比较:
-基于对象和面向对象:
Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。
它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。
-解释和编译:
Java的源代码在执行之前,必须经过编译。
JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。
(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率)
-强类型变量和类型弱变量:
Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。
-代码格式不一样。
补充:
上面列出的四点是网上流传的所谓的标准答案。
其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。
目前的编程语言的发展趋势是函数式语言和动态语言。
在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民,因此JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure),当然Java8也开始支持函数式编程,提供了对Lambda表达式以及函数式接口的支持。
44、什么时候用断言(assert)?
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本、关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的
45、Error和Exception有什么区别?
①Error:
表示系统级的错误和程序不必处理的异常,是Java运行环境中的内部错误或是硬件问题。
如内存溢出、内存资源不足。
②Exception:
程序运行时可能出现的错误。
如打开一个不存在的文件。
46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
会被执行。
Try中return语句不会立刻返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值。
(如果在try遇见中执行了程序退出代码:
system.exit(0),则不会执行finally子语句)
47、Java语言如何进行异常处理,关键字:
throws、throw、try、catch、finally分别如何使用?
Java的异常处理是通过5个关键词来实现的:
try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。
如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM
47、运行时异常与受检异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。
受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。
Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常
48、列出一些你常见的运行时异常?
Arit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 工程师 试题