JAVA面试宝典总结(一)

JAVA基础部分

1.switch语句是否可以作用在byte类型上,long和string类型呢?
在switch(str)语句中,str只能是一个整数表达式或者枚举常量,整数表达式可以是int类型或者integer包装类型,short,byte,char可以隐式转换为int,所以可以作用在byte类型上,而long,string显然与上面的描述不符,因此不能作用在switch语句。

2.short i=0;i=i+1;语句有错吗?为什么?short i=0;i+=1;语句有错吗?
表达式一有错,因为在i+1是会自动提升表达式的类型,因此结果是int类型,然后再赋值给short类型的变量,所以会发生类型转换的错误。表达式二不会报错,因为+=运算符是java语言规定的字符串,编译器不会对做特殊处理,因此正常编译。

3.一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

4.用最高效的方法算出2乘以8等于几?
2<<3,
因为一个数左移n为就相当于这个数乘以2的n次方,而位运算是cpu直接支持的,不需要经过中间任何的转换,因此效率最高。

5.请设计一个一百亿的计算器
首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一
定的范围的,为了便于讲解和理解,我们先以 byte 类型的整数为例,它用1个字节进行存储,
表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,如果两个-1
相加,不考虑 Java 运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由
于进位后超过了 byte 类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,
也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为
10000000,如果两个-128相加,不考虑 Java 运算时的类型提升,运算后会产生进位,二
进制结果为1,00000000,由于进位后超过了 byte 类型的存储空间,所以进位部分被舍弃,
即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的
算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范
围。由于 Java 中涉及表达式运算时的类型自动提升,我们无法用 byte 类型来做演示这种问
题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

先不考虑 long 类型,由于 int 的正数范围为2的31次方,表示的最大数值约等于
2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己
设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大
概功能如下:
(1)这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
(2)有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
(3)提供加减乘除的功能
public class BigInteger{
int sign;
byte[] val;
public Biginteger(String val) {
sign = ;
val = ;
}
public BigInteger add(BigInteger other) {

}
public BigInteger subtract(BigInteger other) {

}
public BigInteger multiply(BigInteger other){

}
public BigInteger divide(BigInteger other){

}

}
这个类要完整写出来还是挺复杂的,具体可以参考java.math.BigInteger的jdk源码。

10.final修饰一个变量的时候,是引用不能变还是引用的对象不能变?
final关键字修饰一个变量的时候是引用不能变,引用的对象里面的内容还是可以改变的,举个简单的例子:

final str=new StringBuffer("hello");
str=new StringBuffer("world");      //编译报错
str.append(" world");      //不会报错

6、”==”和 equals 方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存
储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作
符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块
内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那
块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即
要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相
同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达
式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input
= …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object 类的 equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承
的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用
equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你
编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals
方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

7.int和integer的区别是什么?
int的默认值0,而integer的int的包装类型,默认值为null,在javaee部分,在设置提交表单的字段的类型的时候,当对应字段为int类型是,用el表达式向前台传递值的时候可能会输出0,而当对应字段设置为integer类型的时候,展现在前台的值为一个空的字符串,因此在web表单提交的时候,integer更适合使用。在hibernate框架中,将ID设置为integer类型时,可以通过判断是否为null值来对一个对象进行判定,用int类型时,还要在hbm映射文件中设置其对应属性unsave value为0。另外,在integer类中还有许多方法,比如,将一个数字字符串转换为整数。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37142346/article/details/80133428
文章标签: 基础 java 面试宝典
上一篇Spring Security实现RememberMe功能以及原理探究
下一篇GOF23设计模式之单例模式详解
想对作者说点什么? 我来说一句

java面试宝典

2018年07月04日 1.18MB 下载

2017java面试必过宝典

2017年11月10日 67KB 下载

2017最新Java面试知识点xmind版

2017年05月02日 290KB 下载

没有更多推荐了,返回首页

关闭
关闭