比较运算符compareTo()、equals()、==之间的区别与应用总结
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
1、== 和 equals的区别:
==主要是两个变量内存地址的比较,返回值为true 或者是false。对于普通变量,如:int a=10; int b= 10; a==b,返回为 true。原因是基本类型的变量存在栈中,系统先创建一个变量为a的引用,然后查找栈中是否有10这个值,如果没找到,就将10存放进来然,并且a指向10,同理b也是一样,创建一个变量为b的引用,这里,栈中有是10,把b指向10,所以在比较的过程中,a和b在内存中指向的位置是相同的。
而对于下面情况:
String a=new String("abc");
String b=new String("abc");
a==b; 返回的则是一个false。这是因为,对于对象的比较是对对象引用的比较,对于a和b ,他们在内存中对应的地址是不一样的,重新开辟内存空间,把“abc”存到里面。所以 a==b 返回的值是一个false.
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //truestr1和str2指向同一个地址。创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度
==操作符并不涉及对象内容的比较。若要对对象内容进行比较,则用equals. 如果 在本例中,a.equals(b)则返回是一个true值。在使用“==”的时候千万要注意常量;
再看一个例子:
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));这里接结果是,第一是true,第二个是false;执行过程:
创建一个变量a,然后查找,是否有 “hello2”这个值,显然,这里是没有找到的。那么给他开辟一个空间存放 hello2,同理创建b,;当运行到第三行的时候,b和d 的内存地址是一样的,即 b==d 是true; 这里注意第四行代码, 在执行过程中相当于 String c = "hello"+2;但是e 就不是这样了,new StringBuilder(d),再append 2,,new 一个对象出来了,内存地址自然是不通的。所以 a==e 的结果自然是不一样的。
equals:不能比较基本数据类型,基本数据类型不是类类型;比如:
int x = 1;
System.out.println(a.equals(1));结果是false;
equals 本身依赖于 “==”,但是比如字符串的比较,为什么是内容的比较呢?因为String 已经对equals进行了重写,保证了他是对 字符串长度和内容的比较。所以,一般情况下,就算你是重新new出来的字符串对象,只要保证他的字符串长度和内容一样,那么他就是返回true;
总而言之,==是对对象地址的比较,而equals是对对象内容的比较,只要字符串内容,长度一样即可(若方法没有对equals重写,那么他的效果和“==”是一样的)。对于基本数据类型,一般用==,而对于字符串的比较,一般用equals
2、对于compareTo(), 在API中,java.lang包下面的基本数据类型的封装类都提供了该方法,如 Integer,Float,Byte,Short,Character 等
在基本数据中,compareTo()是比较两个Character 对象;
在 Boolean中,是用boolean的实例于其它实例进行比较;
在String 中,则是按照字典顺序进行比较,返回的值是一个int 型。
贴一段代码
public class Test{
public static void main(String args[]){
String s1=new String("abc");
String s2=new String("abc");
System.out.println((s1==s2)? "true":"false");
System.out.println((s1.equals(s2))? "true":"false");
if(s1.compareTo(s2)==0){
System.out.println("s1 is equal s2");}
s1=s2;
System.out.println((s1==s2)? "true":"false");
}
}程序的运行结果为:
false
true
s1 is equals s2
true
这里需要说明的一点,s2对象赋值给s1之后,s2和s1的引用其实是指向了内存中的同一个位置。所以,再进行比较时,就是true.
参考地址:http://blog.csdn.net/zzp_403184692/article/details/8094875
http://www.cnblogs.com/IT-Monkey/p/3640596.html
http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html
比较运算符compareTo()、equals()、==之间的区别与应用总结的更多相关文章
- ==运算符和equals()方法的区别
Java语言程序中判断两个变量是否相等有两种方式:一是运用==运算符,二是运用equals方法. 1. ==运算符 对于==运算符来说,如果两个变量是基本类型的,并且是数值类型,则只要它们的值相等,就 ...
- “==”和equals之间的区别
通俗点讲,==是看看左右是不是一个东西.equals是看看左右是不是长得一样.如果单纯是想记住,==:等于.equals:相同.两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个 ...
- Java面试题:==运算符与equals方法的区别
据说这个面试题目,80%的程序员都会理直气壮的回答错误!! 一: ==运算符 如果比较的是基本数据类型,则直接比较数值是否相等,返回值为"true or false" 如果比较的是 ...
- 比较compareTo与equals及==的区别
1.compareTo: 附上:源码: public int compareTo(String anotherString) { int len1 = value.length; ...
- Java中equals和==之间的区别
今天在写表达式求值的时候,发现了equals和==||!=和!equals()之间是不一样的. 我就从网上搜了搜关于这方面的知识,然后在下面做一个总结: Java中有两类数据类型: 基本数据类型(Pr ...
- 从equals和==的区别开始
今天我要谈的,不是具体的一个小程序的设计,也不是什么高大上的遗传算法群体智能什么什么的理念.今天我想就非常简单的一个问题,深入地解释一些东西,把自己的一些看法传达给大家.我相信,认真看下去,大家会有所 ...
- equals和==的区别 你真的掌握了吗?
PS:最近读Java编程思想的时候发现了一些小问题.就是equals方法和==,感觉自己是真正掌握了,其实并没有.简单的记录一下. 学习内容: 1.equals 和 == 的区别 equals和== ...
- 【ASP.net】Equals 和 == 的区别
在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元. ...
- Java String 的equals, == , hascode的区别
1.equals 和 == ==在java中是比较引用的,即在内存中的地址.而String的equals()是比较字符串的内容 http://blog.csdn.net/barryhappy/arti ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
随机推荐
- Webpack4 学习笔记二 CSS模块转换
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack 打包css模块 webpack是js模块打包器, 如果在入口文件引入css文件或其它的less.sass等文件,需要 ...
- 使用session处理用户搜索后数据的上一页和下一页跳转
搜索语句界面: /*单一检索:此处为一个下拉列表的检索*/ if(isset($_POST['submit']) && $_POST['submit'] == '点击搜索') { if ...
- C/C++获取本机名+本机IP+本机MAC
本机名.IP.MAC都是一些比较常用网络参数,怎么用C/C++获取呢? 研究了两三个小时... 需要说明的都在代码注释里 #include <stdio.h> #include <W ...
- mybatis两级缓存原理剖析
https://blog.csdn.net/zhurhyme/article/details/81064108 对于mybatis的缓存认识一直有一个误区,所以今天写一篇文章帮自己订正一下.mybat ...
- Linux crontab 实现秒级定时任务
1 crontab 的延时: 原理:通过延时方法 sleep N 来实现每N秒执行. crontab -e 输入以下语句,然后 :wq 保存退出. * * * * * /usr/bin/curl ...
- 面向对象特性 - php
1.类的字段调用格式 公用字段 类内调用 $this->字段名 类外调用 $对象名->字段名 静态 类内调用 self::$字段名 类外调用 类名::$字段名 常量 类内调用 ...
- JZOJ 3521. 道路覆盖
Description ar把一段凹凸不平的路分成了高度不同的N段,并用H[i]表示第i段高度.现在Tar一共有n种泥土可用,它们都能覆盖给定的连续的k个部分. 对于第i种泥土,它的价格为C[i],可 ...
- 裸机——wdt
1. 首先晓得看门狗的基本知识 看门狗是带复位功能的定时器,用于在系统跑飞时复位系统. 接下来按照上次的知识对看门狗进行推导 看门狗的关键词是 定时器 复位 定时器 关键是 时间段 中断 时间段 关键 ...
- [Uva11178]Morley's Theorem(计算几何)
Description 题目链接 Solution 计算几何入门题 只要求出三角形DEF的一个点就能推出其他两个点 把一条边往内旋转a/3度得到一条射线,再做一条交点就是了 Code #include ...
- 19,django组件之contenttype(一)
django组件之contenttype(一) 方式1:适用于1张表和另一张表要关联的时候. 1.路飞学成表设计: 2.将2个价格策略表合并1张表. 3.如果再加一张表,那价格策略表的表结构会发生改变 ...