- 什么是泛型方法?
答:将方法的参数类型定义为泛型,这样方法能够接受各种类型的参数从而做不同的处理方式,这就是泛型方法。 - 什么是泛型类?
答:在定义类时,同时在类上定义了泛型,这样在使用这个类时可以根据传入的不同参数来实例化不同的对象。这样说可能比较抽象,直接举个例子,List类就是个泛型类,可以想想我们在使用List时是不是可以使用多种多样的参数类型来满足业务需要。 - 什么是泛型接口?
答:接口类似于类,所以其实泛型接口和泛型类是很类似的。在定义接口时,同时在接口上定义了泛型,这就是泛型类。不过我们知道接口是无法实例化的,所以泛型接口的具体类型是在其实现类中进行声明的。给个例子理解下:
泛型接口Animal:
public interface Animal<T> {
public T getValue(T t);
}
实现类Demon,可以看到在Demon这个类中,我们对泛型接口Animal的具体类型做了声明,所以方法getValue()的入参出参都是Integer类型:
public class Demon implements Animal<Integer> {
@Override
public Integer getValue(Integer integer) {
return integer;
}
}
- 接口是类么?(这问题是我总结知识点突然想到的,就加在这章面试题里了)
答:不是,不过他们的不同点我就不一一列举了,这里直接举一个接口不是类的有力证明,如下:
这是一个接口:
public interface Animal {
public T getValue;
}
这是一个类:
public class Animal {
public void getValue() {};
}
很明显的可以知道,我们在定义一个文件时,要么定义成类(抽象类也是类),要么定义成接口,没有又是接口又是类的文件,所以interface和class是同级的存在,不存在谁是谁,谁像谁倒是可以。
-
说说泛型的类型擦除过程?
答:这就是个类型替换的操作。首先会去寻找能替换泛型类型参数的具体类(一般都是Object类),如果我们还指定了泛型的上限,那么这个上限的类就会被作为具体替换泛型类型参数的类,而找到具体替换类后,就把代码里的泛型类型参数全部替换成具体类。 -
说说泛型的各种标记以及它们代表了什么?
泛型标记 | 说明 |
---|---|
E-Element | 在集合里使用,表示在集合中存放的元素 |
T-Type | 表示Java类 |
K-Key | 表示键 |
V-Value | 表示值 |
N-Number | 表示数值类型 |
? | 表示不确定的Java类型 |
-
Object中有哪些公共方法?
答:getClass();hashCode();equals();clone();toString();notify();notifyAll();wait().finalize(); -
如何正确的退出多层嵌套循环?
答:第一种是使用标号加break。第二种就是让外层的循环表达式结果可以受到内层循环体代码的控制,给出示例代码方便理解:
public class TestMain {
public static void main(String[] args) throws Exception {
//定义一个二维数组
int arr[][] = {{1, 2, 3}, {4, 5, 6, 7}, {9}};
boolean result = false;
//加上条件---result为false时外层循环才会继续执行
for (int i = 0; i < arr.length & !result; i++) {
for (int j = 0; i < arr[i].length; j++) {
if (arr[i][j] == 6) {
//内层循环里一旦碰到值为6,则修改result值为true
result = true;
//跳出内层循环,result值已经为true,外层循环再次判断后不会再执行,成功跳出多层嵌套循环
break;
}
}
}
}
}
- Java中基本数据所占字节(byte) 大小?
1byte=8bit,一个bit表示一个0或1。
类型 | 字节(byte) |
---|---|
byte | 1 |
char | 2 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
boolean | 1 |
- String对象的intern()方法有什么用?
答:String对象的intern()方法是个native方法。调用这个方法时,这个方法会先去字符串常量池里检查是否已经有对应的字符串常量了,如果有,则直接返回该常量的引用,如果没有,则会在常量池中创建,然后再返回引用。
下面给出示例代码方便理解:
public class TestMain {
public static void main(String[] args) throws Exception {
String test = "1";
String test2 = test.intern();
System.out.println("调用intern方法的==比较结果:" + (test == test2));
System.out.println("调用intern方法的equals比较结果:" + (test.equals(test2)));
String ob = new String("1");
String test3 = ob.intern();
System.out.println("新建String对象后再调用intern方法的==比较结果:" + (ob == test3));
System.out.println("新建String对象后再调用intern方法的equals比较结果:" + (ob.equals(test3)));
}
}
运行结果如下:
= =比较的是内存地址,而新建String对象,这对象是放在堆中的。所以第一条结果为true和第三条结果为false可以证明了intern()方法会先去常量池取引用后再根据情况选择返回引用的处理逻辑。
这里输出equals的结果就是做个对比,因为equals比的是内容,结果肯定true。