0074 几道面试题

时间:2021-07-24 14:19:50

昨天参加了惠装网的面试,有些题不会做的,记录下来

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

Java1.7以前:byte、short、int、char
Java1.7开始:新增String
因此switch语句不能作用在long上,看下面代码:

public class Test {
public static void main(String[] args) {

long b=126L; //将b的类型改为byte、short、int、char都可以正常执行
switch(b){ //b类型为long时,提示编译错误:Incompatible Types,Found"long", required "byte、short、int、char"
case 125:
System.out.println("A");
break;
case 126:
System.out.println("B");
break;
case 127:
System.out.println("C");
break;
}
}
}

Java中如何跳出当前的多重嵌套循环

先看代码:

public class Test {
public static void main(String[] args) {

lable1:for(int i=0;i<8;i++) { //循环1
System.out.println("i= "+i);
lable2:for(int j=0;j<5;j++) { //循环2
System.out.println(" j= " + j);
lable3:for(int m=0;m<2;m++) { //循环3
if (j == 2) {
System.out.println(" j==2 break lable2;");
break lable2; //j==2时,退出循环2,也就是上层循环
}
System.out.println(" m= " + m);
}
}
}
}
}

break语句一般只能退出当前循环
嵌套循环中如果要退出上面几层的循环,那得先给该层循环定义一个标签,在break语句处指定标签名即可
注意的是,break只能退出包含了这个break语句的代码块,包括直接和间接的
break除了可用于退出嵌套循环,实际上可用于用标签定义的代码块,比如下面这样

public class Test {
public static void main(String[] args) {

lable1:{
lable2:{
lable3:{
for(int i=0;i<=3;i++) {

if (i==2) {
break lable2;
}else{
System.out.println("i= " + i);
}
}
}
System.out.println("lable2的输出,不会被执行");
}
System.out.println("lable3的i==2,终止lable2的执行");
}
}
}

HashTable与HashMap的区别

同步:HashTable的方法是同步的,而HashMap不是
null:HashTable的key和value都不能有null,而HashMap的key可以有一个null,value可以有多个null
遍历:HashTable和HashMap都有values()、entrySet()、keySet()方法返回key的集合进行遍历,但HashTable多了个elements()方法,可以返回Enumeration对象进行遍历
hash值:HashTable直接使用Object的hashCode()的返回值,但HashMap还要进行一番计算
数组大小:HashTable默认大小是11,增加方式是2*old+1; 而HashMap默认是16,成倍增加
参考:http://blog.csdn.net/tianfeng701/article/details/7588091

hashCode()方法的作用

在HashMap、HashTable等集合类中,用于确定元素的存放位置,可以实现快速查找

其他: 两个对象equals那么其hashCode一定要想等,反过来,hashCode相等,不一定equals,一个桶里可以放多个不equals的对象

序列化接口的id有什么用

可以将一个对象保存到硬盘或者在网络上传输,这就需要对象的序列化。
查看Java标准库中的类,很多都有一个“serialVersionUID”的属性,比如HashMap是这样的:

private static final long serialVersionUID = 362498820763181265L;

这个serialVersionUID的作用是什么呢?
就是为了保证对象在反序列化后的类跟序列化前的类能够兼容。谁知道一个对象序列化后多久会反序列化呢,几秒、几天还是几年,万一反序列化的时候,原来的那个类进行了很多修改呢,还能反序列化为那个类型吗?
简单的说,这个id就是为了版本的兼容性。
那么如何指定这个id呢?
如果不特别指定,那系统会根据这个类的成员变量等信息计算一个hash。这种情况下,如果一个类后来增加删除了几个属性,就很可能导致反序列化的失败。因此最好还是自己指定一个id。
是不是id相同,就一定能反序列化成功呢?不是。如果那个类进行了一些非兼容性改动,那即使id相同,也会失败。

构造器是否能被重写

不能。构造器不能被继承,不能被重写。可以重载

Java中是否存在内存泄漏

Java有垃圾回收机制,不可达对象都会被垃圾回收器自动回收,一般而言,不会出现内存泄漏,但还是有可能的。
如果内存中存在大量的无用但可达的对象、长生命周期对象持有短生命周期对象,内存就可能会爆掉。考虑这两种情况

  1. 一个类的静态属性指向了一个集合对象,而这个对象还会持续增大。
  2. 一个单例类持有外部对象的引用,这些外部对象在这个单例类的生命期内都是可达的,如果这些外部对象特别大或者持续增长而不能减小。