java中string 类型的对象间比较的学习笔记-阿里云开发者社区

开发者社区> 疯狂小兵> 正文

java中string 类型的对象间比较的学习笔记

简介: 在JAVA 中String 有两种不同的赋值方式 ,"="和new一个新的对象,虽然在输出时显示的内容是一样的,但数据存储的原理是不同的. String a="ab"; String b="ab"; System.out.println(a==b);//true 三句话的执行时这样的:        当把"ab"赋值给a变量时,因为是用"="直接赋值,此时"ab"作为字面量存在栈
+关注继续查看

在JAVA 中String 有两种不同的赋值方式 ,"="和new一个新的对象,虽然在输出时显示的内容是一样的,但数据存储的原理是不同的.

String a="ab";

String b="ab";

System.out.println(a==b);//true

三句话的执行时这样的:

       当把"ab"赋值给a变量时,因为是用"="直接赋值,此时"ab"作为字面量存在栈中,然后a的引用指向字面量"ab",在编程语言中,字面量是一种表示值的记法.

       给  b 赋值ab时,系统会自动查找字面量中是否已经存在 ab,当检测到存在ab时,就会将b的引用指向 ab , 也就是说现在a和b 指向相同的字面量 ,那这时候a = = b作比较时,就会很容易的知道结果为 true;

       String a=new String("abc");

       String b=new String("abc");

       System.out.println(a==b);//false

       System.out.println(a);//abc

       System.out.println(b);//abc

再看这种赋值方式, a 和 b 都是通过new 出新的对象的方式赋值,对象的产生是动态的,当一个对象产生时,系统会在堆中为每个对象分配不同的内存空间来存放数据,也就是说这里的a 和 b 在堆内存中的地址是不同的.

       而 a 和 b都是String类的实例对象,当两个对象通过双等号(“a = = b”)比较时,比较的是两个对象在内存中的地址,如果两个对象内存地址是相同的,得到的结果为true,很显然在上面的例子中,a 和 b的地址是不同的,所以返回结果为 false;

       如果要比较a和b 值得大小,需要使用a.equals(b);

       在后两句输出语句中,根据常识认为直接输出对象实例名,得到的结果是该实例的内存地址,但是在对字符串输出时,却是输出的内容;其实在其他的普通类中,当打印实例名时,

MyString mString=new MyString();

System.out.println(mString);

打印输出时,系统会自动调用对象的toString()方法,输出的地址:  com.neoft.hello.MyString@18a992f;

这是在java源码中就已经写好的,而源码中 String 类的toString()方法中的返回值指定的就是字符串内容.这是String类与其他类的区别.

       String  a="ab";

       String  c=new String("ab");

       System.out.println(a==c);//false

这三行代码中 a 是指向的字面量,也就是在栈中的值,而c指向的是堆中分配的实例对象空间,因此当 a和c的地址比较时,当然因为地址不同返回false值.

       Stringa="ab";

       Stringc=new String("ab");

       a=c;

       System.out.println(a==c);//true

在这四行代码中,因为有 a = c;存在, a不再指向字面量,而是和c一样,将引用指向c的实例在堆中的地址.此时,返回值为true;

       String  a=new String("ab");

       String  c=a;

       a="ab";

       System.out.println(a==c);//false

这四句代码一出,想必能难倒一些刚刚入门的java爱好者.首先前两句, a和b在堆内存中会指向相同的内存地址,此时a 和c的值都是 ab ; 但是 在第三句话或许有许多人不理解,在 a=”ab”;这句话中,对象a 的引用已经指向了栈中的ab 字面量,此时c的值是 堆中的”ab”, a的值是字面量ab ,所以在 a==c 比较时,两个对象指向的内存地址已经发生了变化,返回结果当然为false;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring AOP 源码分析——创建代理对象
1.简介 与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源码。
995 0
WCF 笔记 (2) - 传输泛型 List 对象
在做邮件服务的时候遇到一个问题: 服务器端有个方法参数是个List 类型。当在客户端传参数的时候 ,你即使传个List类型的参数,也还是提示参数类型错误。 相关解决方法:http://www.cnblogs.com/wizardwu/archive/2009/08/09/1542102.html
628 0
Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。
1183 0
String对象操作符“+”解析
javac Test 编译文件javap -c Test 查看虚拟机指令实验一:纯字符串 public class Test { public static void main(String args[]) { String str = "a"; ...
696 0
《JavaScript启示录》——1.11 原始值(String、Number、Boolean)在被用做对象时就像对象
原始值被当作构造函数创建的一个对象来使用时,JavaScript会将其转换为一个对象,以便可以使用对象的特性(如方法),而后抛弃对象性质,并将它变回到原始值。下面的代码采用了原始值,并展示了将值作为对象使用时会发生什么事情。
936 0
JavaScript面向对象的编程指南学习笔记
JavaScript面向对象的编程指南学习笔记 第一章 1,用自己的语言描述出,什么是对象、类、封装、聚合、继承、多态? 对象,拥有属性和方法的任何抽象概念。 类,可以实例化,有共同属性或方法(行为)的相似对象,的模板 封装,提供接口,隐藏接口的实现 聚合,将大功能(对象)拆分成小功能(小对象)去实现的逆过程。
8844 0
Struts2的值栈和对象栈
ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContext ValueStack与ActionContext的联系和区...
947 0
Bootstrap学习笔记(实习第2天)
1、学习网站: http://www.bootcss.com/ 2、页面中加入下面代码即可调用bootstrap。 <!-- 新 Bootstrap 核心 CSS 文件 加到head中 --> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min
1506 0
+关注
66
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载