Chapter3_操作符_关系操作符
java中的关系操作符有等于“=”,不等于“!=”,大于“>”,小于“<”,大于等于“≥”,小于等于“≤”等。这些都不再赘述了,有一个有意思的点是关于等价性的讨论。
在java中测试两个对象或者基本数据类型经常会使用到“=”和.equals静态方法,这两者的机制通常会让人感到迷惑。
下面贴出测试代码:
1 class dog{
2 String name;
3 String says;
int age;
}
public class Test {
public static void main(String[] args){
dog d1 = new dog();
dog d2 = new dog();
d1.says = "ruff!";
d1.name = "spot";
d1.age = 3;
d2.says = "ruff!";
d2.name = "spot";
d2.age = 3;
//比较引用
System.out.println(d1 == d2);
System.out.println(d1.equals(d2));
//比较字符串
System.out.println(d1.name == d2.name);
System.out.println(d1.name.equals(d2.name));
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
//比较基本类型
Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
System.out.println(d1.age == d2.age);
System.out.println(a1 == a2);
System.out.println(a1.equals(a2));
//error:System.out.println(d1.age.equals(d2.age));
}
}
false
false
true
true
false
true
true
false
true
这段代码首先创建了一个类名为dog,它具有三个域:says(string),name(string),age(int)。在测试的主方法中,首先用new关键字创建出了两个对象的引用d1,d2,这两个用new创建的引用是存储在堆中的。这两个对象引用指向的对象所包含的域,内容上都是完全一样的。首先是对引用的比较,很显然由于是在堆中创建的,d1和d2所指向的是不同的对象,指向堆中不同的内存区域,而由于==比较的是对对象的引用,所以很显然第一个比较得出的结果是false,在这一点上(对对象引用的比较),equals静态方法的机制似乎和它一样,也是比较引用指向的地址而不是对象域中的内容。
接下来看对字符串的比较,这里直接对d1和d2两个对象的string域进行比较,很让人疑惑的是得出的结果居然是两个true,而下面用两个new出来的对象进行比较的结果是false和true。这里的区别就在于这个关键字new上。java的内存分配机制中,new出来的对象都是被存储在堆中的,而其他一些基本类型的数据则是分配在栈中,在之前的d1.name="spot"和d2.name="spot"中,实际上进行的操作是,在栈中开辟了一块内存来存储这个"spot"字符串,然后d1和d2的name域中的指针都指向这一块区域,这样就很容易理解此时比较出来的结果了。而下面new出来的两个字符串"abc"都是存储在堆中,它们分配到的是不同的内存区域,因此此时用“==”比较的结果自然是false,因为两者的指针不是指向的同一块区域,但对于字符串,equals方法的行为就是按字符比较,结果自然是true。
最后是对基本数据类型的比较,有了之前的介绍就好理解多了。a1和a2虽然数值相同,但在堆中的内存区域不同,所以比较结果是false,反之,在给对象的域赋值时,由于是在栈中创建的,所以指向的区域是相同的。而对于四种基本数据类型,此时equals的行为仍旧是比较对象的数值。
总结如下:
(1)java内存分配的规则是,对于用new关键词创建出的对象,都存储在堆中。而对于没有使用new关键词创建的基本的数据(四种基本数据类型,字符串),和对象的引用,存储在栈中。
(2)比较对对象的引用时,“==”和equals方法都是比较对对象的引用。如果需要有不同的表现方法,需要对类的equals方法进行重写(重写object的equals)。
(3)比较字符串和四种基本数据类型时,“==”仍然比较对象的引用,而equals比较字符串的内容或者数据的内容。
Chapter3_操作符_关系操作符的更多相关文章
- Chapter3_操作符_逻辑操作符
逻辑操作符与(&&)或(||)非(^)能够对布尔类型的数据类型进行操作,并且生成布尔值,和关系操作符的产生的数据类型是一样的.需要注意的不多,有以下几点: (1)在需要使用string ...
- Chapter3_操作符_其他操作符
对java中其他操作符及一些注意事项的总结 (1)按位操作符 按位操作符操作基本整数类型中的单个二进制位,有与(&),或(|),非(~).按位操作符还可以和等号(=)联合使用,如~=,& ...
- Chapter3_操作符_算术操作符
java中的算术操作符与其它语言并无太大区别,常用到的是以下这些: (1)加号(+),减号(-),除号(\),乘号(*),取模操作符(%),其中除号需要特别注意的是,会自动截取掉小数点后面的部分,而不 ...
- Chapter3_操作符_别名机制
Java中的别名机制实际体现的是对于“=”这一类赋值操作符的使用规则和内涵.“=”的实际内涵是指将右边的变量的值(对于基本数据类型而言)或者某一个对象的引用(对于某个具体对象而言)复制到左边的变量名所 ...
- Chapter3_操作符_直接常量和指数计数法
(1)直接常量 在程序中使用直接常量,相当于指导编译器,告诉它要生成什么样的类型,这样就不会产生模棱两可的情况.比如flaot a = 1f等,后缀表示告诉编译器想生成的类型.常用的后缀有l/L(lo ...
- Chapter3_操作符_方法调用中的别名问题
接下来展示方法调用中的别名问题,方法调用中的别名问题指的是,将一个对对象的引用传递给某一个方法时,方法操作的是这一个特定的引用而不是这个引用的拷贝. class Person{ float heigh ...
- js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则
最近一直在笔试面试,经常碰到例如 123=='123'.'abc'==true等问题,其中有答对的,也有答错的,主要原因还是对ECMAScript的规范没有理解清楚,很多题目没有具体分析所导致.现查阅 ...
- JavaScript操作符(关系操作符、相等操作符和条件操作符)
关系操作符用于对两个值进行比较,返回一个布尔值.关系操作符包括大于(>),小于(<),大于等于(>=),小于等于(<=).当关系操作符用于非数值时,也要先进行数值的转换.如 v ...
- Java知识系统回顾整理01基础04操作符02关系操作符
一.关系操作符 关系操作符:比较两个变量之间的关系 > 大于 >= 大于或等于 < 小于 <= 小于或等于 == 是否相等 != 是否不等 public class Hell ...
随机推荐
- 格式化输出=========》format 和 %
str.format() 实现格式化输出的功能 s1 = "i am {0},gae{1}".format("alex",18) 普通版,直接输入元祖 ...
- 2.STM32启动文件
一.概念声明 中断向量:由硬件产生的中断标识码,一般用于存放中断服务程序的跳转指令.根据硬件产生的中断号查找中断向量表来确定对应的中断向量.CM3内核有15个异常 和240个中断源. 程序的内 ...
- IIS 7.0的集成模式和经典模式
IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库, 原先运行于IIS6.0下的Web应用程序迁移到IIS7 ...
- python之路——10
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 a.函数可读性强,复用性强 def 函数名() 函数体 return 返回值 函数先定义后执行, b. ...
- iOS上传本地代码到git
1.顾名思义,首先你得注册一个github账户 这个我就不细说了. 2.然后你得创建一个 repository 步骤见下图 3.相当于创建成功 会跳到下图界面 4.一看就很清楚了 create a ...
- c# HashTable (哈希表)
HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性,非常适合存储大量的数据 在Hash ...
- wepy打开页面首次不显示,但是数据已经有了
page页面首次打开异步数据无法通过props传递到子组件 解决:在开发者工具关闭上传代码时自动压缩就解决了,在wepy文档里也有强调
- Servlet 知识点总结(来自那些年的笔记)
2018年04月15日 20:16:01 淮左白衣 阅读数:350 版权声明:转载请给出原文链接 https://blog.csdn.net/youngyouth/article/details/ ...
- python:爬虫获取淘宝/天猫的商品信息
[需求]输入关键字,如书包,可以搜索出对应商品的信息,包括:商品标题.商品链接.价格范围:且最终的商品信息需要符合:包邮.价格差不会超过某数值 #coding=utf-8 ""&q ...
- C#设计模式(4)——抽象工厂模式(Abstract Factory)
简单工厂模式: 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码 工厂方法模式: 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单 ...