日期:2014-05-20  浏览次数:20978 次

java面试总结(第一天)
第一:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

答:一个java源文件中可以包含多个类,但是只有一个类是public类型的并且类名和源文件名相同。

第二:Java有没有goto?

答:在java中goto是保留字,在java中并不是有这个关键字。

第三:说说&和&&的区别。

答:
<1、相同点:都可以作为逻辑与运算当表达式两端都为true整个表达式为true,否则为false

<2、不同点:
1、&& 具有短路的功能,例如if(str!=null && !str.equeal(""))如果str==null则 !str.equeal(""))就不会被执行也就不会抛出空指针异常
2、& 例如if(str!=null && !str.equeal(""))当str==null 时候!str.equeal(""))也会被执行 会抛出空指针异常 。
3、& 有位运算功能当表达式两端部位boolean 类型的时候 & 表示为运算操作

第四:在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;
}
}

第二:使用循环条件标记 例如:

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;
}
}
}


第五:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

答:在java中 byte、short、 char 能隐士的转换成int型所有可以作用在switch上 long、String不能隐士的转换成int 所有不能作用在switch上


第六:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

答:<1、首先short 加上一个int的整数会自动向上转型为int类型 然后再赋值给一个short类型此时是向下转型必须强制类型转换否则会有类型转换异常
   <2、 += 是java语言规范定义的所有 编译器会作一些特殊的处理不会出现异常


第七:char型变量中能不能存贮一个中文汉字?为什么?

答:在java中采用unicode编码包含了汉字 所有可以储存汉字 如果一些特殊的汉字没有包含在内也就不能储存 在这里java中一个字符有两个字节

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

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

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

答:final关键字修饰的变量是不能变的,变量指向的对象的值是可以改变的 例如:

final StringBuffer a=new StringBuffer("aaa");
下面的语句编译器会报错
a=new StringBuffer("bbb");
下面的语句正常的编译
a.append("cccc");

第九:"=="和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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。


第十:静态变量和实例变量的区别?

答:在语法定义上的区别:静态变量前要加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);
}
}

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

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

第十二:Integer与int的区别(参考)

答:int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以+web层的表单数据的类型。
在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。


第十三:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:java中Math类提供三个方法:ceil floor round

ceil:(天花板)即向上取整Math.ceil(11.3) 12 Math.ceil(-12.3) -12
floor:(地板)即向下去整Math.floor(11.3) 11 math.floor(-11.2) -12
round:(四舍五入)Math.round(11.5)12 Math.round(-11.5)-11