关于“==” 和equals()方法以及String类的一写总结

来源:互联网 发布:淘宝游戏专营何时开通 编辑:程序博客网 时间:2024/06/05 20:51

(首先声明:这些文章都是自己的学习总结 写出来只为梳理自己的知识框架 也为日后巩固自身的java基础之用 ,也希望能帮到爱好java的朋友,能力有限 有错的地方欢迎大家提出来)

a)“==”标识符(identify if two references point to the same objext)说白了对于原始数据类型和引用类型 它比较的是栈       空间上的两块内存的值是否相等。

b)equals()方法(is overriden in class definition,and used to identify if two objects have the same type and content)

   这个方法可以通过自己重写确定自己想要比较的内容

c)一般情况下,public boolean equals(Object o){

                          return this == o; 

                          }它的效果与“==”是相同的

d)String s1 = new String("hello");

   String s2 = s1;

   String s3 = new String("hello");

   s1 == s2  结果是true;

   s1 == s3  结果是false;

  s1指向了堆中新开辟的一块内存 s2也指向了同s1一样的那块内存 ,而“==”比较的是引用的地址,所以是true

  s3是在堆中又新开辟的一块内存,s1与s3分别指向堆中不同的内存 所以会为false

e)String s = new String("abc");

     String s1 = "abc";

     String s2 = new String("abc");

     s == s1  false

     s == s2  false

     s1 == s2  false

    s指向堆中一块内存   s2指向堆中另一块内存  而s1指向字符串池   所以三者比较都为false

   当执行第一条语句时,jvm会先检查字符串池中是否有“abc”,若没有,在其中放入“abc”,当使用new 时 会在      堆中新开辟内存,在其中写入“abc”,虽然每次new时都会检查字符串池中有无相同内容,但最后引用还是会指    向堆中对应的内容。这样做是因为String类型被final修饰  不可改变,当下一次执行 String s1 = “abc”时,会先检查字符串池中有无相同内容,这时是有,所以s1会直接指向字符串池,为的是提高效率

    注:String类的intern()方法可以返回字符串池中的内容

  这时:s == s1.intern()   false

   s == s2.intern()   false

  s1 == s2.intern()  true

f) String类对equals()方法进行了重写比较的不是内存地址,而是对象中的内容即字符串本身

e)String hello = "hello";

      String hel = "hel";

     String lo = "lo";

    hello == "hel" + "lo"          true

    hello == "hel" + lo    false

     如果字符串拼接时加号两边的是字面值(字面值就是直接在“  ”里写的值,比如上面的“hel”和“lo”)那么将在字符串      池中查找有没有对应内容的对象(这里的内容是“hello”)  并返回字符串池中的对象,这和“hello”是一样的

     如果加号两边不满足上面的条件(比如两边的值是引用或者堆里的字符串对象),那么将不再字符串池里查                 找“hello”,而是直接在堆里新生成一个对象  

      基于以上解说 “hel”+“lo”这种形式的字符串拼接与“hello”相同,都是从字符串池中寻找,所以第一个为ture

    “hel”+lo 这种拼接 由于lo没有加双引号,将在对中新生成一个字符串“hello”  所以为false


0 0
原创粉丝点击