JavaSE面试题总结
== 和 equals 的区别
1、== 解读
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
基本类型:比较的是 值是否相同;
引用类型:比较的是 引用是否相同;
1 | // 代码示例: |
代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写 开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
2、equals 解读
equals 本质上就是 ==,只不过 String 和 Integer 等 重写了 equals 方法,把它变成了值比较。
1 | class Cat { |
输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:
1 | public boolean equals(Object obj) { |
原来 equals 本质上就是 ==。
但是你可能会好奇,两个相同值的 String、Integer 对象,为什么返回的是 true?代码如下:
1 | String s1 = new String("老王"); |
原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。
下面我们也将上面 Cat类重写equals 和 hashCode,然后比较 c1.equals(c2) 就是true乐
1 |
|
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用; 而 equals 默认情况下是引用比较,重写equals 和 hashCode 变成值比较
JAVA的事件委托机制和垃圾回收机制
Java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。
垃圾回收机制 垃圾收集是将分配给对象但不再使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收
反射机制
1、概念:
通过类(Class对象),可以得出当前类的fields、method、construtor、interface、superClass、modified等,同时可以通过类实例化一个实例、设置属性、唤醒方法。Spring中一切都是反射、struts、hibernate都是通过类的反射进行开发的。
2、得到Class的三个过程
- 对象.getClass()
- 类.class
- Class.forName()
静态变量和实例变量的区别?
静态变量属于类,不用实例化就已经存在,所有的实例共享同一个静态变量,可以通过类名和实例名来访问。实例变量属于实例,每个实例都有自己的这个变量,只能通过实例名来访问。
什么是构造器,构造器的特征?
方法名必须和类名相同,无返回值,不能显示被调用,实例化时自动调用。完成初始化工作。系统会默认提供了一个默认的无参构造器。初始化子类时,会先调用父类的构造器,可以在方法中通过supper()指定调用父类的哪一个构造器。
sleep()与wait()区别
sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);
wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。
接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承具体类。抽象类中可以有静态的main方法。
记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract的方法。
char型变量中能不能存贮一个中文汉字?为什么?
在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的。所以,在Java中,char类型变量可以存储一个中文汉字。
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math 类中提供了三个与取整有关的方法:
ceil(表示向上取整)、floor(表示向下取整)、round(四舍五入)。故Math.round(11.5) 的结果为12 ,
Math.round(-11.5)的结果为-11。
内部类可以引用成员吗?有没有什么限制?(需要本地测试下,后去除)
完全可以。如果不是静态内部类,那没有什么限制!如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。