- 今天打王者打飘了,差点忘了我心爱的博客。
- 今天的题目是:
一、==和equals有什么区别呢?
平时也做过一些小小的测试,比如说在我们声明两个变量以后,初始化为不同的值,去用==比较,如下图:
通过这个例子,我们可以知道在用==比较int基本类型的数据时,若是数据相等,那么就返回true
我们平常在比较两个字符串时,常用的是equals方法,如下图:
那么这个==又是比较的什么呢?
回答:
关于==操作符:
- ==操作符是专门用来比较两个变量的值是否相等,也就是说比较变量所对应的内存中所存储的数值是否相等,要比较两个基本数据类型或是引用变量是否相等,只能用==操作符。
- 如果一个变量指向的是对象类型的,那么就涉及到了两块内存,对象本身占一块内存,其引用也占一块。 例如:
Object object = new Object();变量object是一个内存,new Object()也占用一个内存,变量object对应的内存中存储的数值就是对象占用内存的首地址,对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,要看这两个变量所对应的内存中的数值是否相等,这个时候需要用==去比较。
关于equals方法是比较两个独立对象的内容是否相同,例如:
String a = new String(“foll”);
String b = new String(“foll”);
-
这两条new语句创建了两个对象,而a,b分别指向其中一个对象,这两个对象是不同的,他们的首地址是不同的,即a,b中存储的数值是不同的,当用==去比较时,表达式会返回false,当用equals去比较时,两者相同,因为对象中存储的内容是相等的。
-
在实际开发中,大部分字符串比较用到的是equals方法。如果一个类没有实现equals方法,那么它将继承Object中的equals方法,该方法默认使用==操作符,比较两个变量指向的对象是不是同一个对象。如果你希望去比较两个实例对象中的内容,那么必须要覆写equals方法。
二、关于常量池(java中的常量优化机制)
- 再看一个例子,如下:
int x = 127;
int y = 127;
Integer a = 127;
Integer b = 127;
System.out.println(x == y);
System.out.println(a == b);
-
关于这个代码的正确输出结果为:true,true
-
但是给Integer换一个值得效果却不同了,如下图:
这又是为什么呢?
-
解答:因为Java中基本类型的包装类的大部分都实现了常量池技术,例如:byte,short,integer,long,character,Boolean,前五种在对应的数字范围内才能使用常量池。常量池的范围为:-128-127.
常量优化机制:
- 普及到一个常量优化机制:在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,
那么编译器javac将会直接将若干个常量表达式计算得到结果。Eg:short result = 5 + 8;——> short
result = 13;
看以下例题:
public static void main(String[] args) {
String s="abc";
String s1="a";
String s2=s1+"bc";
String s3="a"+"b"+"c";
System.out.println(s==s2);
System.out.println(s==s3)
}
这个例子的输出结果应该为false,true
- false:因为它是一个变量和一个常量的相加。所以会产生新的地址值
- true:因为常量的优化机制 s3 的三个常量相加相当于 s3=“abc”;再做一系列的运算。因此输出的true