==、equals
2015-10-29 09:57
127 查看
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。四类八种 整型:byte、float、int、long 浮点型:float、double 布尔型:boolean 字符型:char
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法
被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双
等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
如果equals没重写,调用的是父类Object的equals,其实比较的是内存地址,重写了equals,比较的是两个对象的内容
例:PersonPk pk = new PersonPk(1,"tom");
PersonPk pk2 = new PersonPk(1,"tom"); 这两个对象不是同一个对象,因为内存地址不相同(一new,就会重新给分配内存地址),但内容是相同的。
的是两个字符串是否是同一个对象,否则你应该使用equals()来比较字符串。
问题1:
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);
这里的结果是true. 由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用. 所以Java对其提供了缓冲区. 缓冲区内的字符串会被共享. 使用双引号的形
式定义字符串常量就是存储在缓冲区中的. 使用”abc”时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用”abc”时会在缓冲区中创建, 第二次
则是直接引用之前创建好的了.
问题2:
String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);
这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的. 所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等.
NULL没有分配存储空间。
http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
1.基本数据类型,也称原始数据类型。四类八种 整型:byte、float、int、long 浮点型:float、double 布尔型:boolean 字符型:char
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法
被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双
等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
如果equals没重写,调用的是父类Object的equals,其实比较的是内存地址,重写了equals,比较的是两个对象的内容
例:PersonPk pk = new PersonPk(1,"tom");
PersonPk pk2 = new PersonPk(1,"tom"); 这两个对象不是同一个对象,因为内存地址不相同(一new,就会重新给分配内存地址),但内容是相同的。
1. 如何比较两个字符串?使用“==”还是equals()方法?
简单来讲,“==”测试的是两个对象的引用是否相同(引用指向的是内存地址,其实比较的就是内存地址是否相等),而equals()比较的是两个字符串的值是否相等。除非你想检查的是两个字符串是否是同一个对象,否则你应该使用equals()来比较字符串。
问题1:
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);
这里的结果是true. 由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用. 所以Java对其提供了缓冲区. 缓冲区内的字符串会被共享. 使用双引号的形
式定义字符串常量就是存储在缓冲区中的. 使用”abc”时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用”abc”时会在缓冲区中创建, 第二次
则是直接引用之前创建好的了.
问题2:
String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);
这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的. 所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等.
NULL没有分配存储空间。
http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
相关文章推荐
- 基于windows的多线程编程初步介绍
- STM32 ADC结合DMA数据采样与软件滤波处理
- 乱码 "lock".equals("lock")->false
- Leetcode || Integer to Roman
- ASCII码与字符串转换
- 从Github上用pod导入的报错解决
- Solr学习-Facet
- java对身份证验证及正则表达式解析
- 直接draw(0,0)
- 【黑马程序员】语法、四大语句——Java复习笔记
- LeetCode || Minimum Path Sum
- 我的收藏夹
- C#使用RDP远程桌面
- 怎么win7桌面上显示我的电脑、文档、网络等图标?
- Linux内核Code Review 002
- JavaScript操作URL的相关内容集锦
- OpenCv矩阵操作汇总
- linux常见问题集锦
- 撞死
- php curl多线程抓取网页