面试题

1、请解释Java语言的跨平台特性。
解析:虽然不知道什么是跨平台也可以使用Java语言进行编程,但是对于一个Java编程员来说,理解跨平台特性能够更深入掌握Java语言,所以企业中往往要求应聘者至少理解这个特性。
参考答案:Java的跨平台特性也被称为可移植性、平台无关性,或者一次编写处处运行。他的意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。之所以能实现跨平台的特性。主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上都能运行。

2、请列举JAVA语言的主要特点
解析:了解一门语言,往往从熟悉该语言的主要特点开始入手,所以企业也常常通过应聘者对JAVA语言特点的掌握程度而判断其语言基础是否扎实。参考答案:JAVA语言有很多特点,主要包括1跨平台性:一个应用可以不经过修改直接运行到不同的平
台上。2面向对象:JAVA语言是一门面向对象的语言,可以使用对象的属性和行为,可以使用面向对象的思想进行分析设计,并实现整个应用。3解释执行JAVA应用时,JVM中的解释器将解释类文件,生成符合当前平台的字节码。4自动回收:JAVA应用中的垃圾回收是自动进行的,JVM中的后台线程将监视内存中数据的使用,当内存中的数据不再被引用时,将被作为垃圾回收,而不需要程序员动手回收。

3、Java语言有哪些特点?
1,简单易学;2,面向对象(封装,继承,多态);3,平台无关性(Java虚拟机实现平台无关性);
4,可靠性;5,安全性;6,支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持);7,支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的,因此Java语言不仅支持网络编程而且很方便);8,编译与解释并存;

4、什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机?
Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台
的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。
Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
采用字节码的好处: Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
Java虚拟机:
任何一种可以运行Java字节码的软件均可看成是Java的虚拟机(JVM)

5、什么是JDK?什么是JRE?
JDK是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE即Java运行环境,还包含了其他供开发者使用的工具包。
JRE:普通用户而只需要安装JRE(Java Runtime Environment)来运行Java程序。而程序开发者必须安装JDK来编译、调试程序。

6、请列举Java语言中的八种基本数据类型,并说明每种数据类型的含义及长度。
解析:数据类型在任何一门编程语言中都是很重要的知识点,属性、方法参数、方法返回值要指定各自的数据类型。Java语言虽然是一门面向对象的语言。但是也定义了基本数据类型,基本数据类型可以直接赋值,不需要使用new关键字创建,可以直接使用运算符进行运算,编程中经常被使用,而且Java语言中的基本数据类型的长度固定,不会随着平台的不同而不同。
参考答案:Java语言的八种基本数据类型有:byte字节型,8位长度:short短整型,16位长度,int整型,32位长度:long长整型,64位长度:float单精度浮点型。32位长度:double双精度浮点型,64位长度:char字符型,16位长度:boolean型,表示逻辑值,有true和false两个值,分别表示真和假

7、什么叫引用类型,引用类型和基本数据类型有什么区别?解析:很多初级程序员都能够理解int i=20;中的int是一种类型,称为整型。而对于类似Employee
e=new Employee();这样表达式中的Employee却感觉无所适从。其实,任何一个类都是一种类型,如Employee就是一种类型,可以说变量e的类型就是Employee。Java语言中将类的类型称为引用类型,即reference type。可以说,除了八种基本数据类型之外的类型都是引用类型,包括API中所有的类、自定义的所有类,也包括数组。引用类型和基本数据类型的直观区别就是引用类型的变量需要使用new调用构造方法来赋值,而基本数据类型可以直接使用“=”号赋值。但是,引用类型中的String比较特殊,既可以使用new关键字赋值,也可以直接使用“=”赋值,一般情况下都使用“=”直接赋值。
参考答案:Java语言中除了基本数据类型之外的类型,都称为引用类型。引用类型就是类的类型,所有的对象都是引用类型,包括数组对象。引用类型必须使用new调用构造方法进行赋值,引用类型的变量拥有自己的属性和方法,可以使用圆点调用自己的属性和方法。基本数据类型直接使用=号进行赋值,且没有自己的属性和方法,往往都在声明属性或方法时使用。

8、请说明操作符的作用。
解析:实际编程中,是非常常用的操作符。很多初级程序员会使用这样的代码if(s”save”0{},结果
会发现,即使当字符串s的值为save时,if条件依然不能被执行。是
在比较引用类型时,比较的是两个
对象的虚地址,而不是内容。要比较两个对象的内容是否相同,往往需要使用equal方法,例如
if(s.equals(“save”)){}。比较基本类型时,将比值的二进制是否相等,例如(x0.5){}。值得注意的
是,与空指针null值进行比较,往往用进行,例如if(snull||s.equals(“”)),表示如果字符串是空指针
或者空串。
参考答案:==可以用来比较基本类型或者引用类型。比较基本类型时,==用来比较二进制的值,比较引
用类型时,用来比较对象的虚地址。

9、请说明&&与&的区别和联系
解析:实际编程中,常常需要使用“与”或者“或”的逻辑。其中&&和&存在一定区别&&可能发生各路问题,例如if(s!=null&&s.length()==6)中,如果要的值为null,那么第一表达式的值为false,返回值肯定是false,不会计算第二个表达式的值,这就是短路。然而使用&,例如if(s!=null&s.length()==6),假设s的值为,null,返回值肯定是false,但是会判断第二个表达式的值,将发生空指针异常。实际工作中,经常使用&&操作符。
参考答案:&&会发生短路问题,当第一个表达式的值为false时,将直接返回结果为false而不会判断第二个表达式的值。而&不会发生短路问题,即使第一个表达式的值是false,会判断第二个表达式的值。

10、请列举Java语言中的几种位运算符,并说明位运算符的作用。
解析:位运算符是对二进制数值进行运算,左移一位相当于乘2运算,右移一位相当运算。位移运算符效
率较高,往往在游戏开发中经常使用。
参考答案:java语言中有三种位移运算符,分别是<<;左移运算符,左移1位相当于乘2.>>;有符号右
移,右移一位相当于除2;>>>;无符号右移,忽略符号位,空位都以0补齐。

11、break语句能在什么场景使用
解析:break语句表示中断,不能够随便使用,只能在循环语句中或者switch语句中使用。初级工程师往往容易将break和return混淆。Return是可以再方法体中任意位置使用,可以带值返回页可以不带值返回,执行return语句后,该方法将返回,也就是方法执行结束。而break只能在循环体中或者switch的case语句中使用,不能随意使用。
参考答案:break语句可以再循环体中使用,也可以在switch的case语句中使用。

12、for循环中的break语句和continue语句的使用
解析:很多时候,循环是为了查找某些符合条件的数据,只要找到就没有必要继续下去,称为中断循环,break语句就可以用来中断循环。而continue语句恰恰相反,是用来继续下一次循环。值得注意的是,java语言中可以再循环前面加标号,即label,然后可以使用break或continue中断或继续标号的循环。
参考答案:break可以用来中断循环,continue可以用来继续下一次循环。

13、int和Integer有什么区别?谈谈Integer的值缓存范围 [面试]
int是整形数字,是Java的8个原始数据类型(Primitive Types,boolean、byte、short、char、int、float、double、long)之一。Java 语言虽然号称一切都是对象,但原始数据类型是例外
Integer是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。在Java5中,引入了自动装箱和自动拆箱功能boxing/unboxing,Java可以根据上下文,自动进行转换,极大地简化了相关编程
大部分数据操作都是集中在有限的、较小的数值范围,因而,在Java 5中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照Javadoc这个值默认缓存是-128到127之间
注意事项
基本类型均具有取值范围,在大数*大数的时候,有可能会出现越界的情况
基本类型转换时,使用声明的方式。例:long result= 1234567890 * 24 * 365;结果值一定不会是你所期望的那个值,因为1234567890 * 24已经超过了int的范围,如果修改为:long result= 1234567890L

  • 24 * 365;就正常了
    慎用基本类型处理货币存储。如采用double常会带来差距,常采用BigDecimal、整型(如果要精确表示分,可将值扩大100倍转化为整型)解决该问题
    Math.abs(100-b)<1e-6
    优先使用基本类型。原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合
    如果有线程安全的计算需要,建议考虑使用类型AtomicInteger、AtomicLong 这样的线程安全类。部分比较宽的基本数据类型,比如 float、double,甚至不能保证更新操作的原子性,可能出现程序读取到
    只更新了一半数据位的数值

14、对于String对象,可以使用=赋值,也可以使用new关键字赋值,两种方式有什么区别?
解析:String类型是实际工作中经常使用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类。所以String类型的对象可以使用new创建,例如String name=new String(“ETC”);为变量name进行赋值,值为“ETC”。然而,String类比起其他类有些特殊,可以使用“=”直接赋值,如String name=“ETC”,也是为变量name进行赋值,值为“ETC”。这两种赋值方式是有差别的,使用new赋值,永远都是创建一个新对象,在新的内存空间初始化了字符串的值;而使用“=”赋值,不会每次都初始化新的字符串,而是从一个“字符串实例池”中去查找有没有要赋值的字符串,如有则直接引用;如不存在,则初始化一个字符串,并放入“字符串实例池”。在实际编程中,往往使用“=”好对String类型变量进行赋值。
参考答案:使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。使用new进行赋值,则每次都创建一个新的字符串。

15、String类是一个“不可变类”,请解释“不可变类”的含义
解析:String类是一个不可变类,即immutable类。所谓不可变,意思是当一个字符串被初始化后,它的值就不会被改变。例如,String s=new String(“hello”)为将初始化一个值为hello的字符串,如果调用 s.toUpperCase()看起来是把hello变为大写的HELLO,然而事实上并不会把已有的hello变为HELLO,而是在新的空间初始化一个HELLO字符串。也正因为有这种不可变性,所以才能支持“字符串实例池”的
使用。
参考答案:所谓的不可变类,就是当字符串初始化后,就不能够被改变。

16、String类和StringBuffer类有什么区别?
解析:String类是不可变类,字符串一旦初始化后,就不能被改变。而StringBuffer类是可变类,字符串值可以呗改变。常常在实际应用中看到累死这样的代码:String s=new(“hello”);s+=”world”,这两句代码首先创建一个字符hello,然后将world追加到hello结尾并重新赋值给变量s。然后,这个过程实际上是这样的:首先创建一个StringBuffer对象,然后用StringBuffer类的append方法追加字符串,最后对
StringBuffer对象调用toString方法合成字符串返回。可见,使用+号连接字符串时,本质上是使用了可变的StringBuffer类,经变动肯定性能效率受到影响,所以建议需要追加字符串时,可以考虑直接使用StringBuffer类。参考答案:String类是不可变类,即字符串值一旦初始化后就不可能改变。
StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。

17、包装器类型包括哪些类,有什么作用?
解析:初级程序员常常对float和Float或者double和Double感到混淆。在Java语言中,有八中基本数据类型,即byte、int、long、float、double、char、boolean。对应这八种基本数据类型,API中定义了八个类,能把这些基本类型转换成引用类型,分别是Byte、Short、Int、Long、Double、Character、Boolean。这八个类被统称为包装器类。JDK5之后,包装器类和基本数据类型之间可以直接转换,称为自动的装箱拆箱(boxing/unboxing)。例如integer it=3;it++;虽然写法上可以像使用基本数据类型一样
使用包装器类型,但是本质上依**行了类似 it= new Integer(3)的转换,因此,不要轻易使用包装器类的自动装箱拆箱,以优化的性能。能够使用基本类型就使用基本类型。
参考答案:包装类器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等类,
主要用来对byte、short、integer、long、float、double、character、boolean这八种基本数据类型进行包装,使其称为引用类型。

18、请说明Java语言中的值传递规则
解析:值传递时编写应用时不可避免的操作。例如某方法声明形式是public void f(int x){},写方法是,必须为其传递一个int类型的实际参数,如f(10)。又如public void g(Employee)。那么使用该方法时,必须为其传递一个Employee类型的实际参数,例如g(new Employee())。所以,对于初级程序员来说,了解Java语言的值传递规则非常重要。Java语言是本类型传递的值,例如f(10),仅仅把10复制给形式参数
x,是值的拷贝。而引用类的传递时引用,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同一个对象。
参考答案:基本数据类型传递的是值,引用类型传递的是引用,即虚地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值