JavaSE面试题总结



== 和 equals 的区别

1、== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

基本类型:比较的是 是否相同;
引用类型:比较的是 引用是否相同;

1
2
3
4
5
6
7
8
// 代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写 开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

2、equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等 重写了 equals 方法,把它变成了值比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Cat {
public Cat(String name) {
this.name = name;
}

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

原来 equals 本质上就是 ==。

但是你可能会好奇,两个相同值的 String、Integer 对象,为什么返回的是 true?代码如下:

1
2
3
String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

下面我们也将上面 Cat类重写equals 和 hashCode,然后比较 c1.equals(c2) 就是true乐

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Cat)) return false;
Cat cat = (Cat) o;
// 同getName().equals(cat.getName())
return cat.name.equals(name);
}

@Override
public int hashCode() {
return Objects.hash(getName());
}

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用; 而 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。

内部类可以引用成员吗?有没有什么限制?(需要本地测试下,后去除)

完全可以。如果不是静态内部类,那没有什么限制!如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  1. © 2020 Liu Yang    湘ICP备20003709号

请我喝杯咖啡吧~

支付宝
微信