String 与 基本数据类型————判断值是否相同
需知
在解决这个问题之前,我们首先要知道以下知识:
1、 在Java中,调用方法,传递实参为基本数据类型的变量,或者传递的实参为基本数据类型的封装类时,传递形式为值传递,当传递的实参为引用类型的时候,传递的形式为地址的传递.
(说人话)基本数据类型:就是说int,float等类型的变量,在传递的时候,只是传递的该变量的值,而不是传递地址. 基本数据类型的封装类:最主要的就是String类型,它在传递的时候传递的也是一个值,而不是引用,在这个方面可能就会造成对代码的影响.
2、在不同类型的数据比较是否相同的过程中,如果是基本数据类型,使用 " == " 比较的是值,但如果是String类型,使用"=="比较的就会是地址(强调!强调!强调!)
分析以下段代码.
package practice;
public class StringCompare {
String practice;
StringCompare()
{
practice="abc";
}
void IsEqual(String a)
{
//System.identityHashCode()用于查看对象的地址.
System.out.println("a的地址: "+System.identityHashCode(a));
System.out.println("practice的地址:"+System.identityHashCode(practice));
System.out.println();
System.out.println("使用compareTo()比较String获得结果:"+practice.compareTo(a));
//practice.compareTo(a)结果为0表示字符串相同.
System.out.println("使用'=='比较String获得结果:"+practice==a);
System.out.println();
}
public static void main(String[] args)
{
StringCompare A=new StringCompare(); //创造一个StringCompare类的变量A.
A.IsEqual("abc"); //调用A的方法.传入参数"abc".
String a=new String("abc"); //生成一个String类,命名为a,其值为"abc".
System.out.println("*******************************");
A.IsEqual(a); //调用A的方法,传入参数a.
}
}
运算结果如下:
a的地址: 1284693
practice的地址:1284693
使用compareTo()比较String获得结果:0
false
*******************************
a的地址: 31168322
practice的地址:1284693
使用compareTo()比较String获得结果:0
false
有了上述的复习(预习),现在我们来分析
1、 使用我们自己定义的构造函数创造了一个StringCompare类型的变量A,变量A调用了其自己的方法IsEqual.但是传入的是一个常量"abc".因为"abc"的字符串在内存池中已经有了,所以传入的常量"abc"就不会再另外开辟一个新空间,而是指向已有的practice素在空间,即我们发现该常量"abc"与A的属性practice的地址是一样的(同一个地址,值也一定一样).所以此时无论是用"==",还是用compareTo(),得到的结果都是相等的.
2、 命名了一个新的String类型变量a,此时用了 a = new String(“abc”); 所以无论之前在内存池中是否已经存在了值为 “abc"的变量,编译器都会重新创建一个变量.让a指向那个地址.在结果中也可以看出来,a和practice的地址是不一样的, 如果此时还用”=="来比较,由于地址不一样,所以就会返回false.此时使用compareTo()函数来进行比较,就可以避免比较错误啦!
总结
String类型的变量,如果作为实际参数传递,且在方法的函数体内用到了形式参数的值的比较,要用compareTo(another String)方法来比较,才可以得到真正的结果.
写在最后
看CSDN已经有1年多了,以前只是看别人的文章,给别人的文章点点赞,没有动手写过一篇博客,不过想要养成更好的习惯,不要要有知识的输入,也要有知识的输出,如果我们有一些相同的地方,希望能点个关注,多多支持~~~,
第一篇写的肯定多多少少有不合适,需要改进的地方,还希望有错误的地方大家多多包含,指出,我们共同进步~
一枚努力奋斗的大学生