java面试题收集整理(1)

来源:互联网 发布:淘宝买家怎么申请退款 编辑:程序博客网 时间:2024/04/29 12:30

这篇文章是本人对一些看过的java面试题的一些整理,如果有错误的地方,望大家指出改正,共同进步

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

2、Java有没有 goto?

java 中的保留字,现在没有在 java 中使用。

3、说说&和&&的区别。

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true
时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于
if(str != null && !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现
NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异常。If(x==33 & ++y>0)
y 会增长,If(x==33 && ++y>0)不会增长
&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,我
们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31 & 0x0f
的结果为 0x01。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自
己理解透彻深入、实际经验丰富。

4、在 JAVA 中如何跳出当前的多重嵌套循环?

在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的
代码中使用带有标号的 break 语句,即可跳出外层循环。例如,

ok:for(int i=0;i<10;i++){    for(int j=0;j<10;j++)    {     System.out.println(“i=” + i + “,j=” + j);if(j == 5) break ok;}}
通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层
循环体代码的控制,例如,要在二维数组中查找到某个数字。
public static void main(String[] args) {        int arr[][] = { { 1, 2, 3 }, { 4, 5, 6, 7 }, { 9 } };        boolean found = false;        for (int i = 0; i < arr.length && !found; i++) {            for (int j = 0; j < arr[i].length; j++) {                System.out.println("i=" + i + ",j=" + j);                if (arr[i][j] == 5) {                    found = true;                    break;                }            }        }    }

5、switch 语句能否作用在 byte上,能否作用在 long 上,能否作用在 String 上?

在 switch(expr1)中,expr1 只能是一个整数表达式或者枚举常量(更大字体),整数表达式可
以是 int 基本类型或 Integer 包装类型,由于,byte,short,char 都可以隐含转换为 int,所以,这些
类型以及这些类型的包装类型也是可以的。显然,long 和 String 类型都不符合 switch 的语法规
定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中。

在jdk1.7中,string现在可以使用

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

对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,
再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处理,
因此可以正确编译。

7、char 型变量中能不能存贮一个中文汉字?为什么?

char 型变量是用来存储 Unicode编码的字符的,unicode 编码字符集中包含了汉字,所以,char
型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集
中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字节,
所以,char 类型的变量也是占用两个字节。
备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问
题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。

8、用最有效率的方法算出 2 乘以 8 等於几?

2 << 3,
因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位
即可,而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3。

9、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是
可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

10、"=="和 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 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object 类的 equals
方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就
是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals 和使用
==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你编写的类希望能够
比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals 方法,由你自己写代码
来决定在什么情况即可认为两个对象的内容是相同的。

可以用简单记住以下

==

1)当对比的是基本类型时,可以简单比较值是否相等

2)比较的是对象类型时,对比对象是否是同一个对象

equals

1)对比的是String类型的时候,比较的是内容是否相等。

2)比较的是对象类型时,若未重写,则用==比较

11、静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量
才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以
也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空
,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,
静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,并且
每创建一个实例对象,这个 staticVar 就会加 1;但是,每创建一个实例对象,就会分配一个
instanceVar,即可能分配多个 instanceVar,并且每个 instanceVar的值都只自加了 1 次。

public class VariantTest{public static int staticVar = 0;public int instanceVar = 0;public VariantTest(){staticVar++;instanceVar++;System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);}

12、是否可以从一个 static 方法内部发出对非 static 方法的调用?

不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上
进行方法调用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个 static
方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的
调用,那个非 static 方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个 static 方法
内部发出对非 static 方法的调用。

Cannot make a static reference to the non-static field name

我们常常遇到上述的问题,通常明白是说不能在静态方法中引用非静态变量。但有时候却不去想想

为什么。这是不好的。要做到知其所以然。

13、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名
称的含义相对应

例如ceil 的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的
结果为 12,Math.ceil(-11.3)的结果是-11;

floor 的英文意义是地板,该方法就表示向下取整,
Math.ceil(11.6)的结果为 11,Math.ceil(-11.6)的结果是-12;

最难掌握的是 round 方法,它表示“四
舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)
的结果为 12,Math.round(-11.5)的结果为-11












原创粉丝点击