Java中Object.equals和String.equals的区别详解
前言
Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我妈通过一个小示例让你明白它~
1、基础知识
Java的存储空间:寄存器、栈、堆、静态存储区、常量存储区(常量池)、其他存储位置。
此处重点介绍堆和常量存储区:
堆:存储new的对象;
常量池:用来存储final static、String的常量。
2、Object.equals与String.equals的区别
Object.equals(==):比较内存地址;
String.equals: 比较内容即可,不管内存地址。
总结:
Object.equals相等,String.equals一定相等;
String.equals相等,Object.equals不一定相等。
3、实战演练
public class TestString { public static void main(String[] args){ // 维护在常量池里面 String a="hello"; String b="hello"; // new出来的所有对象都在堆内存中 // 只要是new出现来的都是新对象 String c=new String("hello"); String d=new String("hello"); // 对比内存地址 //true System.out.println(a==b); //false System.out.println(a==c); //false System.out.println(c==d); //对比内容 //true System.out.println(a.equals(b)); //true System.out.println(a.equals(c)); //true System.out.println(c.equals(d)); } }
解释:
a,b都是常量,a和b都是指向常量存储区中的常量'hello',所以无论内容还是内存地址都是一样的,因此a==b以及a.equals(b)都是true;
c,d都是变量,他们都是new出来的对象,里面存在两个hello变量,c和d分别指向自己的hello变量,所以c和d内容一样,但是内存地址不一样,因此c==d是true,但是c.equals(d)为true。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
相关推荐
-
Java中判断对象是否相等的equals()方法使用教程
Object类中的equals方法用于检测一个对象是否等于另一个对象.在Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为默认操作也是合乎情理的.然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义.然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的.所以一般在自定义类中都要重写equals比较. 下面给出编写一个完美eq
-
Java equals 方法与hashcode 方法的深入解析
PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下: /** * Indicates whether some other object is "equal to" this one. * <p> * The {@code equals} method implements an equivalence relation * on non-null object references: * &l
-
Java编程中的equals方法使用全解
通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构造方法Cat()在堆内存里面new出了两只猫, * 这两只猫的color,weight,height都是一样的, * 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象, * 里面装着可以找到这两只猫的地址,但由于两只猫在堆内存里面存
-
java equals函数用法详解
equals函数在基类object中已经定义,源码如下 复制代码 代码如下: public boolean equals(Object obj) { return (this == obj); } 从源码中可以看出默认的equals()方法与"=="是一致的,都是比较的对象的引用,而非对象值(这里与我们常识中equals()用于对象的比较是相饽的,原因是java中的大多数类都重写了equals()方法,下面已String类举例,String类equals()方法源码如下:) [java
-
java中"==" 与equals方法的使用
复制代码 代码如下: public class equalsDemo { public static void main(String[] args){ /*使用==来判断两个变量是否相等时,如果两个变量时基本数据类型的 变量时,且都是数值类型是,则只要两个变量的值相等,使用==判断就返回true*/ int i=65; float f=65.0f; System.out.println(i==f);//true char
-
java中equals和等号(==)的区别浅谈
java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个eq
-
Java中深拷贝,浅拷贝与引用拷贝的区别详解
目录 引用拷贝 浅拷贝 深拷贝 小结 引用拷贝 引用拷贝: 引用拷贝不会在堆上创建一个新的对象,只 会在栈上生成一个新的引用地址,最终指向依然是堆上的同一个对象. //实体类 public class Person{ public String name;//姓名 public int height;//身高 public StringBuilder something; public String getName() { return name; } public void setName(S
-
java 中同步方法和同步代码块的区别详解
java 中同步方法和同步代码块的区别详解 在Java语言中,每一个对象有一把锁.线程可以使用synchronized关键字来获取对象上的锁.synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁). 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问
-
Java中Hashtable类与HashMap类的区别详解
Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value. 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数. Hashtable通过initial capacity和load factor两个参数调整性能.通常缺省的load factor 0.75较好地实现了时间和空间的均衡.增大load factor可以节省空间但相应的查找时间将增大,
-
java中timer的schedule和scheduleAtFixedRate方法区别详解
timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业. 老师要求学生暑假每天写2页,30天后完成作业. 这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业.任务被拖延了. 这时候两个学生采取的策略就不同了: sch
-
Java中Integer.valueOf,parsetInt() String.valueOf的区别和结果代码解析
先来看段代码 public class IntegerDemo { public static void main(String[] args) { String num = null; System.out.println( Integer.parseInt(num));// Exception java.lang.NumberFormatException System.out.println( Integer.valueOf(num));// Exception java.lang.Num
-
java 中mongodb的各种操作查询的实例详解
java 中mongodb的各种操作查询的实例详解 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is 精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class); } 2. 查询多条数据:linkUrl.id 属于分级查询 public Lis
-
基于Java中最常用的集合类框架之HashMap(详解)
一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性
-
Java中的引用和动态代理的实现详解
我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的.但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础? 如果去看动态代理的源代码(java.lang.reflect.Proxy),会发现其原理很简单(真正二进制类文件的生成是在本地方法中完成,源代码中没有),但其中用到了一个缓冲类java.lang.reflect.WeakCache<ClassLoader,Class<?>[],Class<?>
-
java中 Set与Map排序输出到Writer详解及实例
java中 Set与Map排序输出到Writer详解及实例 一般来说java.util.Set,java.util.Map输出的内容的顺序并不是按key的顺序排列的,但是java.util.TreeMap,java.util.TreeSet的实现却可以让Map/Set中元素内容以key的顺序排序,所以利用这个特性,可以将Map/Set转为TreeMap,TreeSet然后实现排序输出. 以下是实现的代码片段: /** * 对{@link Map}中元素以key排序后,每行以{key}={val
-
java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差
随机推荐
- 不用MOUSEMOVE也能滑动啊
- 浅谈Vue.js 1.x 和 2.x 实例的生命周期
- ISA Server 的故障排除工具(4)
- 详解Java中final的用法
- .NET的Ajax请求数据提交实例
- 感觉很流畅的js实现的键盘控制(带惯性)
- javascript Zifa FormValid 0.1表单验证 代码打包下载
- php 算法之实现相对路径的实例
- PHP遍历数组的几种方法
- php 友好URL的实现(吐血推荐)
- Shell下实现免密码快速登陆MySQL数据库的方法
- php使用指定编码导出mysql数据到csv文件的方法
- javascript利用初始化数据装配模版的实现代码
- C++实现数字转换为十六进制字符串的方法
- linux下passwd命令设置修改用户密码的方法
- 解决jquery的datepicker的本地化以及Today问题
- AS编程基础
- 探讨:android项目开发 统筹兼顾 需要考虑的因素
- C语言 数据结构之链表实现代码
- PHP设计模式之适配器模式代码实例