JAVA学习之路--java中的string基础(==和equals)

来源:互联网 发布:天人网络电视apk 编辑:程序博客网 时间:2024/06/06 04:54

        我们先来看一个题目,在string基础中会经常遇到的,如下:

String str1 = "abc" ; String str2 = "abc" ;String str3 = new String("abc") ; String str4 = new String("abc") ;System.out.println(str1==str2);            //trueSystem.out.println(str1.equals(str2));        //trueSystem.out.println(str2==str3);               //falseSystem.out.println(str2.equals(str3));        //trueSystem.out.println(str3==str4);               //falseSystem.out.println(str3.equals(str4));        //true


        如果对以上答案存在质疑那你可以继续往下看,如果已经知道了答案,那就可以略过这篇文章了。首先要知道的是==”和“equals”表示的分别是比较引用(引用地址)和比较内容先来看简单的equals,比较的是各变量的字符串内容,因为本身设置的题目字符都一样,所以上面凡是用equals来比较的返回结果都是true,没有争议,内容都会比较。

        接下来的重点还是“==",在捣鼓前还要了解下,在java的程序中内存被分成stack(栈)和heap(堆),栈里放的是变量名及对象的引用等,(顺便提一下的String不是java里的8中基本数据类型,它是专门的String类)所以new了之后它是一个对象,相应的在栈里String是对象的引用。而堆里放的才是参与实际运算的数据,堆么,东西一堆一堆的存放的东西肯定多。方便记忆打比方,这就像一个人和他的名字,人的名字就是栈,而真实的人就是堆干活还是真人去干,名字是干不了事情的,但是大工程项目,干活时候肯定是通过叫名字安排工作的吧。再来看String str3 =new String(abc)new这个关键词特定意义就是在堆里开辟一个空间,相当于多了一个人,而如果堆里的内容是一样的,就相当于分身了。前半句String str3是在栈里申明了一个对象,名字是str3,后面是这个叫str3的人在堆里有个abc的实际数据内容来个形象点图解



        这样一来==”的意思就是堆空间里的东西是不是同一个人啊?如果非要把equals一起理解,那就是堆里的内容,便是这个人能干的活儿是abc(这是个泥水工只做泥水工的活儿)。

        要是问题就这样简单也就不会有上面的问题了,另外补充一个高级一点的基础,在内存中还有一部分叫做常量池的地方,它用来放程序中的常量。这里要提它是因为对于没有newString变量分配,它的内容是放在常量池的,而不是堆中。常量池中的数据具有全局效果,所以只要是在常量池有的内容,string不通过new声明的变量都不会重新分配空间。不管怎么你怎么捣鼓怎么传递,只要没有new,只要内容是一样的,那string实际就存在常量池,也不管你名字怎么变。再来个图解




        因为现在的人是常量池的,所以不能分身,同样是泥水工,栈只是给了不同的名字。注意这里因为没有new关键词,所以真实内容是在常量池里而不是堆空间。

        最后对题目进行图解和对应的人名,真人和工作解释。




         首先名字都是在栈空间分配,是人名一共有四个。而具体的人是在常量池还是在堆空间是根据new关键词,有new的在堆,没有的在常量池。刚也说了“==”问的是不是同一个人,str1str2是同一个人吧(都在一个常量池空间),str2str3不是同一个人吧(一个在堆一个在常量空间),str3str4因为是new的会重新分配空间,不是同一个人。而equals指的是各自工作内容,都是泥水工的活儿,所以都是一样的。记得在堆空间只要是new关键词的都能分身即便是有泥水工了,而在常量空间,已经有泥水工了所以再多的名字都是指一个人。就算在来一个String str5 = abc”或者是String str6 = str1(因为str1本身指向的是常量池中的“abc”),这里的str5str6都是指向同一个常量池里的“abc”也就是同一个人。

        这个概念其实不难,不过像自己开始接触的时候也老是搞不清楚,为了大家能更方便的记忆所以在打了一个比方,希望大家能够熟练掌握。