1. instanceof 关键字的作用(了解)
为:
boolean result = obj instanceof Class
int i = 0 ;System . out . println ( i instanceof Integer ); // 编译不通过 i 必须是引用类型,不能是基本类型System . out . println ( i instanceof Object ); // 编译不通过Integer integer = new Integer ( 1 );System . out . println ( integer instanceof Integer ); //true//false , 在 JavaSE 规范 中对 instanceof 运算符的规定就是:如果 obj 为 null ,那么将返回 false 。System . out . println ( null instanceof Object );
2. Java自动装箱和拆箱
Integer.valueOf(100);
Integer a=1; int i = a.intValue();
Integer i = 10;
面试题1: 以下代码会输出什么?
public class Main {public static void main ( String [] args ) {Integer i1 = 100 ;Integer i2 = 100 ;Integer i3 = 200 ;Integer i4 = 200 ;System . out . println ( i1 == i2 );System . out . println ( i3 == i4 );}}
运行结果:
true
false
下面这段代码是Integer的valueOf方法的具体实现: cache[0]= -128 cache[128]=0
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
总结:Byte,Short,Integer,Long,Character。这5种整型的包装类的常量池范围在-128~127之间,也就是说, 超出这个范围的对象都会开辟自己的堆内存。 使用常量池的好处,不用频繁的去new对象,减少空间。
3. Java 创建对象有几种方式?
3.1 使用 new 关键字,这也是我们平时使用的最多的创建对象的方式,示例:
User user = new User();
3.2 使用反射方式创建对象,使用 newInstance()
User user=User.class.newInstance();Object object=(Object)Class.forName("java.lang.Object").newInstance();
3.3 使用 clone 方法, clone 是 Object 的方法,所以所有对象都有这个方法。
3.4 使用反序列化创建对象,调用 ObjectInputStream 类的 readObject() 方法。
4.Object 有哪些常用方法?大致说一下每个方法的含义
![](https://i-blog.csdnimg.cn/blog_migrate/dcb60c7f7e8cbe8285f8782543d4212a.png)
public class Test implements Cloneable{ public static void main(String[] args) throws CloneNotSupportedException { Test test = new Test(); Object clone2 = test.clone(); System.out.println(test==clone2); } }
运行结果:false
该方法和垃圾收集器有关系,一个对象的finalize()方法只会被调用一次
调用finalize() 方法的时机: 当JVM 确定不再有指向该对象的引用时,垃圾收集器在对象上调用该方法。
finalize() 方法的作用: JVM 调用该方法,表示该对象即将“死亡”,之后JVM就可以回收该对象了。有点类似对象生命周期的临终方法。
Class Object is the root of the class hierarchy.Every class has Object as asuperclass. All objects, including arrays, implement the methods of this class.
大致意思:Object 是所有类的根,是所有类的父类,所有对象包括数组都实现了 Object 的方法。
5. wait()和sleep()的区别
sleep()是使线程暂停执行一段时间的方法。wait()也是一种使线程暂停执行的方法。例如,当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。并且可以调用notify()方法或者notifyAll()方法通知正在等待的其他线程。notify()方法仅唤醒一个线程(等待队列中的第一个线程)并允许他去获得锁。notifyAll()方法唤醒所有等待这个对象的线程并允许他们去竞争获得锁。具体区别如下:
1) 原理不同。sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,他会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒。例如,当线程执行报时功能时,每一秒钟打印出一个时间,那么此时就需要在打印方法前面加一个sleep()方法,以便让自己每隔一秒执行一次,该过程如同闹钟一样。而wait()方法是object类的方法,用于线程间通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程调用notify()方法或者notifyAll()时才醒来,不过开发人员也可以给他指定一个时间,自动醒来。
2) 对锁的 处理机制不同。由于sleep()方法的主要作用是让线程暂停执行一段时间,时间一到则自动恢复,不涉及线程间的通信,因此,调用sleep()方法并不会释放锁。而wait()方法则不同,当调用wait()方法后,线程会释放掉他所占用的锁,从而使线程所在对象中的其他synchronized数据可以被其他线程使用。
3) 使用区域不同。wait()方法必须放在同步控制方法和同步代码块中使用,sleep()方法则可以放在任何地方使用。sleep()方法必须捕获异常,而wait()、notify()、notifyAll()不需要捕获异常。在sleep的过程中,有可能被其他对象调用他的interrupt(),产生InterruptedException。由于sleep不会释放锁标志,容易导致死锁问题的发生,因此一般情况下,推荐使用wait()方法。