Java中==运算符与equals方法的区别及intern方法详解
1. ==运算符与equals()方法
2. hashCode()方法的应用
3. intern()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/*
Come from xixifeng.com
Author: 习习风(StellAah)
*/
public class AboutString2
{
public static void main(String[]arsgs)
{
String myName= "xixifeng.com" ;
String myName3= "xixifeng" ;
String myName4= ".com" ;
String myName5=myName3+myName4;
String myName6= "xixifeng.com" ;
if (myName==myName5)
{
System.out.println( "myName==myName5" );
}
else
{
System.out.println( "myName=" +myName);
System.out.println( "myName5=" +myName5);
System.out.println( "myName!=myName5" );
}
//经运行打印出: myName!=myName5
if (myName==myName6)
{
System.out.println( "myName==myName6" );
}
else
{
System.out.println( "myName!=myName6" );
}
//经运行得出: myName!=myName5,myName==myName6
//myName,myName5(myName5的值是由myName3+myName4得到的),myName6 这三个对象的值是相等的, 为什么 它们之间用==进行运算的结果是 myName!=myName5,myName==myName6呢?
//原因在于==运算符
//显然==参与String运算中不是用来比较值的,而是用来比较对象是否相等的.
//那么在String运算中,通过什么方法来比较它们的值是否相等呢,java 提供了equals()方法 ,主要用于比较对象的值是否相等
//示例如下:
//myName==myName5 是false (不是同一个对象)
if (myName.equals(myName5))
{
System.out.println( "myName.equals(myName5) 比较的结果是true !" );
}
else
{
System.out.println( "myName.equals(myName5) 比较的结果是false !" );
}
//经运行输出:myName.equals(myName5) 比较的结果是true ! 在由于myName与myName5不是同一个对象,充分说明:
//equals()方法[是用来比较对象的值是否相等]
//再抛出疑问:是不是两个对象的哈希值相等就说明这两个对象相等呢?
//(由上述测试myName==myName5 得出false ①表明myName与myName5不是同一个对象)
System.out.println(myName.hashCode());
System.out.println(myName5.hashCode());
//经测试 ②myName与myName5的哈希值相等
//由①,② 得出: 两个对象的hashCode值相等,不能表明其对象也相等.
//抛出疑问: 怎样使myName与myName5的对象相等呢?
//引入intern()方法
myName5=myName5.intern();
if (myName==myName5)
{
System.out.println( "(myName==myName5) 得true" );
}
else
{
System.out.println( "(myName==myName5) 得false" );
}
//经运行打印出: (myName==myName5) 得true
//结论: intern()方法能使两个(对象不相等而值相等的)对象变得相等
//myName5.intern();的意思,可以解释为: myName5在内存中查找对象嫁给自己,条件是,该对象要与自己的值相等. 找到了,就指定该对象.
//myName5找到对象,并认定,就不必再创建对象了,所以说这样做,可以节约内存资源.
//抛出疑问: 什么样的对象建议使用intern()呢?
// myName="xixifeng.com" myName6="xixifeng.com", myName与myName6的对象是相等的,上述已经证实.
// 所以说,对象在直接赋予同样的值的时候没有必要用intern().
//myName="xixifeng.com" myName5=myName3+myName4,它们的值相等,但是对象不相等,上述已经证实.
//所以说, 对象在间接赋予(有可能与已有对象)同样的值的时候,建议用一下intern()方法,从而可公用内存中存在的对象.
//==参与int型运算中,也营造类似的比较
int i= 8 ;
int j= 3 ;
int k= 5 ;
int m=j+k;
int n= 8 ;
if (i==m)
{
System.out.println( "i=" +i);
System.out.println( "m=" +m);
System.out.println( "i==m" );
}
else
{
System.out.println( "i!=m" );
}
if (i==n)
{
System.out.println( "... ... ... ..." );
System.out.println( "i=" +i);
System.out.println( "n=" +n);
System.out.println( "i==n" );
}
else
{
System.out.println( "i!=n" );
}
//经运行得出i=m(m的值由j+k得到),i=n
//i,m,n的值都相等 , 由于i==m 得出true i==n得出true
//所以可以得出结论: ==参与非对象类型运算时,是用来比较常量的值是否相等
}
}
|
综上所属,得出如下结论:
1) ==运算符参与对象类型运算时是用来比较对象是否想得的.
2) ==运算符参与非对象类型运算时是用来比较值是否相等的.
3) equals()方法用于比较两个对象的值是否相等
4) 两个对象的hashCode()值相等,并不代表其对象也相等
5) intern()方法能使两个(对象不相等而值相等的)对象变得相等,从而可以公用内存已有的对象,这样做可以节约内存资源.
6) 对象在间接赋予(有可能与已有对象)同样的值的时候,建议用一下intern()方法,从而可公用内存中存在的对象.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!