Java面试题

1、JDK是如何平台的?

不夸平台:如果不跨平台的话我们就需要针对不同版本的不同操作开发同一套系统,这样做代价太大。
跨平台:由于不同版本的不同系统底层所基于的字节码指令集不同,所以JDK屏蔽了不同版本操作系统的字节码指令,提供了一套统一的字节码指令,
并调用统一的API接口完成动作。

2、JDK,JRE,JVM的区别?

JDK{JRE{JVM}}
JDK:全称:Java Development Kit,java开发工具包,java语言编写的程序所需的开发工具包,JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。
JRE:全称:Java Runtime Environment,Java 运行时环境。它主要包含2块:JVM 的标准实现;JAVA 的一些基本类库。
JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。
所以说,jvm 是 Java 能够跨平台的核心

3、JAVA有几种数据数据类型?

在JAVA中一共有八种基本数据类型,他们分别是
byte、short、int、long、float、double、char、boolean
1 2 4 8 4 8 2 1 字节
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)

4、Java中,char型变量中能不能存储一个中文汉字,为什么?

答案:java 的 char 类型变量是用来储存 Unicode 编码字符的,Unicode 字符集包含了汉字,所以 char 类型自然就能存储汉
字,但是在某些特殊情况下某个生僻汉字可能没有包含在 Unicode 编码字符集中,这种情况下 char 类型就不能存储该生僻汉字。

5、byte a = 127; a+=5; System.out.println(a); 请问输出结果是什么?

答案:124。首先byte取值范围-128~127 当a+=1时此时已经是超过了byte的临界值此时输出的为-128 、a+=2时输出
为-127,以此类推a+=5时输出为-124,只要记住这个技巧对于这个面试题就可以应对了。

6、不同类型的变量在相互赋值时,什么情况下需要进行强制类型转换?

答案:范围大的->范围小、长->短、精度高->精度低,父类->子类

7、java 中 float f = 3.4; 是否正确?

答案:不正确,因为3.4是双精度类型属于double类型,而double类型范围大于float类型,如果想要赋给float类型必须强制转
换:float f=(float)3.4或者float f=3.4F
byte->short->int->long->float->double (范围从小到大)

8、switch语句能否作用在byte上,能否作用在long上,能否作用在string上?

答案:首先switch支持int类型,所有可以转换成int类型都支持,byte,char,short范围小于int。byte的存储范围小于int,
可以向int类型进行隐式转换,所以switch可以作用在byte上,long的存储范围大于int,不能向int进行隐式转换,只能强制转换,
所以switch不可以作用在long上,String在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了。

9、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?

答案:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会
出现类型转换错误。对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理(实际就是在
内部做了类型转化short s1 = 1; s1 +=1等价于short s1 = 1; s1=(short)s1+1),因此可以正确编译。

10、public static void say() {ystem.out.println(3 - 2.6 == 0.4);}判断输出结果?

答案:false ->int类型和float类型做运算会损失精度所以不等,可以System.out.println(3 - 2.6 )输出结果并不等于0.4

11、 Integer i1 =200; Integer i2 =200;System.out.println("i1i2: "+(i1i2));Integer i3 =100;Integer i4 =100;System.out.println("i3i4: "+(i3i4));

答案:(i1i2)为false(i3i4)为true。
因为Integer默认的缓存值是-128~127之间,如果Integer值在这个范围之间就会默认从内存中获取,如果超过这个范围就会重新赋值,所以是false和frue
本题考点int类型的自动装箱,什么是自动装箱具体可参考https://blog.csdn.net/ghbxj1989/article/details/80736147

例如:Integer i = 100;相当于编译器自动为您作以下的语法编译
Integer i = Integer.valueOf(100);
而自动装箱的源码
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象)
所以范例中,i3 与 i4实际上是指向同一个对象。
而其他值,执行Integer.valueOf(int i) 返回的是一个新建的 Integer对象,所以范例中,i1与i2 指向的是不同的对象。
equals() 比较的是两个对象的值(内容)是否相同。
“==” 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
以上几个经典的题其实考核的点都是大概围绕数据类型转换,以及自动装箱拆箱来考的,所以这个就要求我们一定要记住几个基本数据类型的范围排序
byte->short->int->long->float->double (范围从小到大),不管拿那个类型来考我们只要知道小范围可以自动转换小范围,而小范围要转大范围必须强转才行

12、为什么有了基本数据类型还需要包装类?

JAVA是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性
在某些场合不能使用基本类型必须使用包装类,比如集合能接收的类型为Object,基本类型是无法添加进去的,还有范型也必须使用包装类。
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型,
它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作
12-1、基本类型:是存储在栈中的,
装箱:把基本的数据类型转换成对应的包装类型.
Integer .valueOf(1)
12-2、包装类:使用new创建的存储在堆中
拆箱:就是把包装类型转换为基本数据类型.基本数据类型 名称 = 对应的包装类型。
Integer i = 1;
int j = i;自动拆箱
int j = intValue();手动拆箱
二者的区别:
基本数据类型保存的是原始值,引用类型保存的是引用值就是数据在内存中的地理位置。

  1. 声明方式不同:
    基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;

  2. 存储方式及位置不同:
    基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;

  3. 初始值不同:
    基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;

  4. 使用方式不同:
    基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。
    总结:
    整型是int,浮点是double,
    int类型的缓存只是-128-127之间,在这个值之间就是在缓存中取,超出就会充型赋值。
    装箱:Integer.valueOf(1)
    拆箱: int j = intValue();

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值