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(这是个泥水工只做泥水工的活儿)。
要是问题就这样简单也就不会有上面的问题了,另外补充一个高级一点的基础,在内存中还有一部分叫做常量池的地方,它用来放程序中的常量。这里要提它是因为对于没有new的String变量分配,它的内容是放在常量池的,而不是堆中。常量池中的数据具有全局效果,所以只要是在常量池有的内容,string不通过new声明的变量都不会重新分配空间。不管怎么你怎么捣鼓怎么传递,只要没有new,只要内容是一样的,那string实际就存在常量池,也不管你名字怎么变。再来个图解
因为现在的人是常量池的,所以不能分身,同样是泥水工,栈只是给了不同的名字。注意这里因为没有new关键词,所以真实内容是在常量池里而不是堆空间。
最后对题目进行图解和对应的人名,真人和工作解释。
首先名字都是在栈空间分配,是人名一共有四个。而具体的人是在常量池还是在堆空间是根据new关键词,有new的在堆,没有的在常量池。刚也说了“==”问的是不是同一个人,str1和str2是同一个人吧(都在一个常量池空间),str2和str3不是同一个人吧(一个在堆一个在常量空间),str3和str4因为是new的会重新分配空间,不是同一个人。而equals指的是各自工作内容,都是泥水工的活儿,所以都是一样的。记得在堆空间只要是new关键词的都能分身即便是有泥水工了,而在常量空间,已经有泥水工了所以再多的名字都是指一个人。就算在来一个String str5 = “abc”或者是String str6 = str1(因为str1本身指向的是常量池中的“abc”),这里的str5和str6都是指向同一个常量池里的“abc”也就是同一个人。
这个概念其实不难,不过像自己开始接触的时候也老是搞不清楚,为了大家能更方便的记忆所以在打了一个比方,希望大家能够熟练掌握。
- JAVA学习之路--java中的string基础(==和equals)
- Java String中的==和equals()
- Java基础:浅谈Java中的equals和==
- java和c#中的String equals == 比较
- java 中String中的equals和==
- java String之“==”和“equals”的区别
- Java String equals和==
- java string equals 和 ==
- 【Java】String == 和equals()
- Java 学习笔记-基础-"=="和equals()的区别。
- java基础之“==” 和equals()方法的区别
- Java基础之==号、equals()和hashCode()区别
- java基础之谈谈==和equals
- Java中的equals和==学习小结
- java中String 的==和equals;String直接赋值和使用new String()
- java从头开始学习到选择c++ (五)java中的== 和 equals 区别
- Java基础 (==和equals)
- Java基础 - equals 和 ==
- MODBUS协议整理——写单个线圈寄存器05H、写单个保持寄存器06H
- 利用回溯的八皇后问题
- 计算机网络面试题
- 柏林噪声函数
- 用scanf() != -1来判断输入是否结束
- JAVA学习之路--java中的string基础(==和equals)
- 网站去色(默哀) css
- ACM测试状态
- 前置病毒感染方式学习笔记
- Ubuntu 升级后Oracle VirtualBox 无法启动问题
- Django 应该养成的习惯
- 第3章 垃圾收集器与内存分配策略
- iOS_笔记记载(1)
- 关于博客之外的一点话