【Java面试的艺术】JAVA基础知识阶段二

124 阅读4分钟

Java基础知识阶段二

静态方法和实例方法有何不同

静态方法和实例方法的区别主要体现在两个方面:

  • 在外部调用静态方法时,可以使用“类目.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式,也就是说,调用静态方法可以无需创建对象
  • 静态方法在访问本类的成员的时候,只允许直接访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法,实例方法则无此限制

euqals()和“==”的区别

  • 重写后equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.long.Object类的,所以适用于所有对象,可以自己定制规则.如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals返回的却是==的判断
  • "=="比较的是变量(栈)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象

Integer与int的区别

  1. 基础
  • int是java提供的8种原始数据类型之一,Integer是java为int提供的封装类。
  • int的默认值为0,而integer的默认值为null
  • Integer可以区分出为赋值和值为0的区别,int无法表达出未赋值的情况
  1. 扩展
  • 在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示的时候,结果为0,所以,int不适合作为web层的表单数据的类型
  • 在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0

下面这条语句一共创建了多少对象: Stirng s= "a" + "b" + "c" + "d";

  • 这一行代码被编译器在编译时优化后,相当于直接定义了一个“abcd”的字符串,所以上面的代码应该只创建了一个String对象

String a = new String("ab"); String b = a + "cd"创建了几个对象?

  • 4个对象
  • 具体来说new String("ab")有两个,分别在堆内容和常量池,cd一个;abcd一个

String、StringBuffer,StringBuilder有什么区别

  • 它们之间最大的不同就是String不可变,后者可变
  • StirngBuffer是线程安全的,StringBuilder是线程不安全且速度较快

创建线程的方式是什么,优缺点是什么?

方式

  • 方式一:继承Thread类创建线程类
    • 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
    • 创建Thread子类的实例,即创建了线程对象。
    • 调用线程对象的start()方法来启动该线程。
  • 方式二:通过Runnable接口创建线程类
    • 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
    • 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
    • 调用线程对象的start()方法来启动该线程。
  • 方式三:通过Callable和Future创建线程
    • 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
    • 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
    • 使用FutureTask对象作为Thread对象的target创建并启动新线程。
    • 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

优缺点

  • 采用实现Runnable、Callable接口的方式创见多线程
    • 优势是:
      • 线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
      • 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
    • 劣势是:
      • 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法
  • 使用继承Thread类的方式创建多线程
    • 优势是:
      • 编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
    • 劣势是:
      • 线程类已经继承了Thread类,所以不能再继承其他父类。