String和常量池

例题:

  以下代码输出什么?为什么?

  String s1 = "hello";
  String s2 = "hello";
  String s3 = new String("hello");
  String s4 = s3.intern();

  System.out.println(s1 == s2);    // 输出?
  System.out.println(s1 == s3);    // 输出?
  System.out.println(s1 == s4);    // 输出?
  System.out.println(s3 == s4);    // 输出?
  System.out.println(s1.equals(s3)); // 输出?
  请逐一说明原因,并解释 intern() 方法的作用。

答案

打印结果依次是:true、false、true、false、true
解析:
s1和s2都是字符串常量池的数据,地址一样,s3则是一个java对象,不是字符串常量。s4,即取出s3中的字符串常量,和s1、s2是一样的。
intern方法,如果字符串常量池有相应的数据,则直接返回相应地址,如果没有,则在字符串常量池创建并返回地址

java的异常体系

java中的所有异常,来自throwable接口,这个接口具体有两个实现:error和exception。前者主要是系统级别的错误,内存溢出等;后者主要是业务层面的,后者又分为自检异常和非自检异常,自检异常,即可以提前抓捕以保证程序正常运行的异常,如classnotfount等,非自检异常,即不能提前抓捕的exception异常,比如数组越界等待

泛型

题目:

以下代码为什么有警告/错误?如何修正?

List list = new ArrayList();
list.add("hello");
list.add(123);

for (Object obj : list) {
String s = (String) obj; // 这里有什么问题?
}

另外,请解释:

  1. 泛型擦除(Type Erasure) 是什么?
  2. List 和 List 在运行时是同一个类吗?为什么?

答案

警告:List list = new ArrayList();没有声明元素类型
错误: list.add("hello");list.add(123);不能在一个数据添加两种类型的数据
String s = (String) obj;integer转换String会报错