面试中常问问题
1.==和equals的区别
==对比栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址
public class test {
// 关于 == 和 equals 的区别
public static void main(String[] args) {
String str1 = "qwe"; //在常量池里面添加内存空间
String str2 = new String("qwe"); // 在堆内存里添加
String str3 = str2;
System.out.println(str1 == str2); // false
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // ture
System.out.println(str1.equals(str2)); // ture
System.out.println(str1.equals(str3)); // ture
System.out.println(str2.equals(str3)); // ture
}
}
str1是基本数据类型(存放在常量池中),str2是一个引用数据类型。(在堆内存中),两者的地址是不同的。二者是比较地址,因此用==会false,而equals是比较是值,会出现true
如下,a和b都是基本数据类型,因此比较变量值。
String a = "1";
String b = "1";
System.out.println(a == b);
总之一句话,==是比较地址,equals比较值
2.final
最终的
-
修饰类:表示类不可被继承
-
修饰方法:表示方法不可被之类覆盖,但是可以重载
-
修饰变量:表示变量一旦被赋值就不可以改变它的值
修饰成员变量
-
如果final修饰类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值。
-
如果final修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值
修饰局部变量
- 系统不会对局部变量进行初始化,必须由程序员显示初始化。如果赋值,这不能改变该默认值,如果没有值,可以在之后进行唯一的一次赋值。
修饰基本类型数据和引用类型数据
-
如果是基本数据类型变量,则其数字一旦在初始化之后便不能更改
-
如果是引用类型变量,则在对其初始化之后便不能再让其指向另一个对象,但是引用的值是可变的