Java面试题2

  1. java 异常处理机制
    Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为 java.lang.Throwable, Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题。 Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让 软件系统继续运行或者让软件死掉,例如,数组脚本越界( ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
    java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try…catch 处理或用 throws 声明继 续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不 强制用 try…catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常。

  2. 请写出你最常见的 5 个 RuntimeException
    下面列举几个常见的 RuntimeException。
    1)java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
    2)java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序 试图通过字符串来加载某个类时可能引发异常。
    3)java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
    4)java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
    5)java.lang.IllegalArgumentException 方法传递参数错误。
    6)java.lang.ClassCastException 数据类型转换异常。
    7)java.lang.NoClassDefFoundException 未找到类定义错误。
    8)SQLException SQL 异常,常见于操作数据库时的 SQL 语句错误。
    9)java.lang.InstantiationException 实例化异常。
    10)java.lang.NoSuchMethodException 方法不存在异常。

  3. throw 和 throws 的区别
    throw:
    1)throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    2)throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。

throws:
1)throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
2)throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
3)throws 表示出现异常的一种可能性,并不一定会发生这种异常。

  1. final、finally、finalize 的区别?
    1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
    2)finally:异常处理语句结构的一部分,表示总是执行。
    3)finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法 提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对 象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。

五、JavaSE常用 API
5. Math.round(11.5)等于多少? Math.round(- 11.5) 又等于多少 ?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5然后进行取整。

  1. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?
    Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。从 Java 5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型。
    从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

  2. 数组有没有 length() 方法?String 有没有 length() 方法?
    数组没有 length()方法,而是有 length 的属性。String 有 length()方法。JavaScript 中,获得字符串的长度是 通过 length 属性得到的,这一点容易和 Java 混淆。

  3. String 、StringBuilder 、StringBuffer 的区别?
    Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它们都可以储存和操作字符串,区别
    如下。
    1)String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。初学者可能会有这样的误解:
    String str = “abc”;
    str = “bcd”;
    如上,字符串 str 明明是可以改变的呀!其实不然,str 仅仅是一个引用对象,它指向一个字符串对象“abc”。第二行代码的含义是让 str 重新指向了一个新的字符串“bcd”对象,而“abc”对象并没有任何改变,只不过该对象已经成为一个不可及对象罢了。
    2)StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
    3)StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的, 因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。

  4. 请说出下面程序的输出
    class StringEqualTest {
    public static void main(String[] args) {
    String s1 = “Programming”;
    String s2 = new String(“Programming”);
    String s3 = “Program”;
    String s4 = “ming”;
    String s5 = “Program” + “ming”;
    String s6 = s3 + s4;
    System.out.println(s1 == s2); //false
    System.out.println(s1 == s5); //true
    System.out.println(s1 == s6); //false
    System.out.println(s1 == s6.intern()); //true
    System.out.println(s2 == s6.intern()); //false
    }
    8.如何取得年月日、小时分钟秒?
    public class DateTimeTest {
    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    System.out.println(cal.get(Calendar.YEAR));
    System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
    System.out.println(cal.get(Calendar.DATE));
    System.out.println(cal.get(Calendar.HOUR_OF_DAY));
    System.out.println(cal.get(Calendar.MINUTE));
    System.out.println(cal.get(Calendar.SECOND));
    // Java 8
    LocalDateTime dt = LocalDateTime.now();
    System.out.println(dt.getYear());
    System.out.println(dt.getMonthValue()); // 1 - 12
    System.out.println(dt.getDayOfMonth());
    System.out.println(dt.getHour());
    System.out.println(dt.getMinute());
    System.out.println(dt.getSecond());
    }
    }

9.如何取得从 1970年 1月 1日 0时 0分 0秒到现在的毫秒数?
Calendar.getInstance().getTimeInMillis(); //第一种方式
System.currentTimeMillis(); //第二种方式
// Java 8
Clock.systemDefaultZone().millis();

10.如何格式化日期?
1)Java.text.DataFormat 的子类(如 SimpleDateFormat 类)中的 format(Date)方法可将日期格式化。
2)Java 8 中可以用 java.time.format.DateTimeFormatter 来格式化时间日期,代码如下所示:
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
class DateFormatTest {
public static void main(String[] args) {
SimpleDateFormat oldFormatter = new SimpleDateFormat(“yyyy/MM/dd”); Date date1 = new Date();
System.out.println(oldFormatter.format(date1));
// Java 8
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern(“yyyy/MM/dd”); LocalDate date2 = LocalDate.now();
System.out.println(date2.format(newFormatter));
补充:Java 的时间日期 API 一直以来都是被诟病的东西,为了解决这一问题,Java 8 中引入了新的时间日期 API, 其中包括 LocalDate、LocalTime、LocalDateTime、Clock、Instant 等类,这些的类的设计都使用了不变模式,因 此是线程安全的设计。

六、Java的数据类型

  1. Java 的基本数据类型都有哪些各占几个字节如下表所示:
      byte 1 -128~127
    整型 short 2 -32768~32767
      int 4 -2147483648~2147483647
      long 8 -2~2 -1
    float 4 -3.63403E6338~3.403E38
    浮点型 double 8 -1.798E308~1.798E308
    字符型 char 2 表示一个字符,如(‘a’,‘A’,‘0’,‘家’)

  2. String 是基本数据类型吗?
    String 是引用类型,底层用 char 数组实现的。

  3. short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗;
    前者不正确,后者正确。对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型, 需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

  4. int 和 和 Integer 有什么区别?
    Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本 数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
    Java 为每个原始类型提供了包装类型:

  • 原始类型: boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
  1. String 类常用方法

  2. String、StringBuffer、StringBuilder 的区别?(2017-11-23-wzz)
    (1)、可变不可变
    String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对
    象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。
    (2)、线程是否安全
    String:对象定义后不可变,线程安全。 StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区
    大量数据。
    StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
    (3)、共同点
    StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
    StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(…)。
    只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer。

  3. 数据类型之间的转换
    (1)、字符串如何转基本数据类型?
    调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型。
    (2)、基本数据类型如何转字符串? 一种方法是将基本数据类型与空字符串(“”)连接(+)即可获得其所对应的字符串;另一种方法是调用 String
    类中的 valueOf()方法返回相应字符串。

你可能感兴趣的:(面试题)