• 众所周知,在 Java 中如果用 == 比较两个对象,那就是比较两个对象是否在内存的同一个位置(地址是否相同)。

  • equals

    在 Java 中,所有类的父类 Object 存在一个 equals 方法,String类复写了这个方法,它实现了真正的字符串比较,代码如下:

    public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}
    
  • hashCode

    通常情况下,当我们重写 equals 方法时,我们需要重写 hashCode方法 以保持一致性。默认的 hashCode 方法与地址有关。

热身--JVM内存结构

概览

看到上图,我们简单介绍一下 Java StackMethod Area 和 Heap 。这几个我们经常提到的内存区。

  • Java堆(Heap)

    对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。(我们 new 出来的东西都放在这里)

  • 方法区(Method Area)

    方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

  • JVM栈(JVM Stacks)

    与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

    局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。

    其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

    在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

    讲完了 内存的概念, 我们就可以引入下一个问题了,码来!

    public static void main(String[] args) {String t1 = "abc";String t2 = new String("abc");System.out.println(t1==t2);}
    

    我们看到 t1 和 t2 的值都是 "abc",直觉上来看结果 应该返回 true,但是运行以后 返回的是 false ,这是为什么呢?(因为他们的地址不同)。那么他们分别在哪呢?这里我们就要引入常量池的概念了。

常量池

Java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个JVM实例只有一个运行常量池,各线程间共享该运行常量池。

Java常量池简介:Java常量池中保存了一份在编译期间就已确定的数据。它里面包括final常量的值(包括成员常量、局部常量和引用常量)、以及对象字面量的值。

在编译期间,每当给常量赋值它就会去检测常量池中是否存在该值,若存在直接返回该值的地址给常量,若不存在则先在常量池中创建该值,再返回该值的地址给常量。因此常量池中不可能出现相等的数据。

  • final常量

一切经final关键字修饰的变量均为常量,final常量必须在定义时就赋初值,否则编译不通过。

更多干货 点击查看这里

字符串比较--小问题大智慧相关推荐

  1. 【分享】小工具大智慧之Sql执行工具

    [分享]小工具大智慧之Sql执行工具 原文:[分享]小工具大智慧之Sql执行工具 工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分 ...

  2. amigo幸运字符什么意思_OMG,12 个精致的 Java 字符串操作小技巧,学它

    字符串可以说是 Java 中最具有代表性的类了,似乎没有之一哈,这就好像直播界的李佳琪,脱口秀中的李诞,一等一的大哥地位.不得不承认,最近吐槽大会刷多了,脑子里全是那些段子,写文章都有点不由自主,真的 ...

  3. OMG,12 个精致的 Java 字符串操作小技巧,学它

    字符串可以说是 Java 中最具有代表性的类了,似乎没有之一哈,这就好像直播界的李佳琪,脱口秀中的李诞,一等一的大哥地位.不得不承认,最近吐槽大会刷多了,脑子里全是那些段子,写文章都有点不由自主,真的 ...

  4. excel两个字符串相减_Excel技巧—超实用的字符串拆分小技巧

    原标题:Excel技巧-超实用的字符串拆分小技巧 点赞再看,养成习惯: 当断不断,反受其乱. 我们每天都在Excel中各种操作,本质上来说就是对各种数据进行操作,而这些数据专业点来说就是字符串.因此熟 ...

  5. java根据逗号拆分_Excel技巧—超实用的字符串拆分小技巧

    点赞再看,养成习惯:当断不断,反受其乱. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文GitHub https://github.com/hugogoos/Excel已收录,包含Exce ...

  6. 【小故事大智慧】学习,何为会与不会?------记2019.12.31与郭老师和米老师的聊天

    今天给大家分享一下,我与男神女神之间的小故事,小故事大智慧呦,希望大家可以共勉! 这样吧,先拿出我的杀手锏,给大家出两道小学二年级的乘法题好啦,注意呦,这可是男神出的,要重视啊,重视啊,重视哈---- ...

  7. 有条件截取字符串_Python小课堂之木辛老师特别讲解:再次深入浅出字符串的格式化...

    我们已经学习了字符串和数字基础的处理方法和逻辑,大家有没有觉得使用起来很方便,编程的过程中也是很给力的呀!其实Python还有更多字符串处理的方法,大家今天就一起来体验一下吧 小朋友们可以先复习一下前 ...

  8. Python 实现类似sed命令的字符串替换小程序

    背景 sed命令 sed 's/原字符串/新字符串' 单引号中间是s表示替换,原字符串就是要被替换掉的字符串,新字符串就是想要的字符串. 效果 在命令行输入python practice.py i 3 ...

  9. python字符串随机排序_python 随机数使用方法,推导以及字符串,双色球小程序实例...

    #随机数的使用 import random #导入random random.randint(0,9)#制定随机数0到9 i=random.sample(range(1,34),6)#输出6个随机数, ...

最新文章

  1. Color the ball(HDU1556)树状数组
  2. ios如何实现静音模式下声音仍然可以外放
  3. 勘误表《网络规划设计师考试考点分析与真题详解》
  4. 一次性删除数据库中某库的所有存储过程的方法
  5. Spring4.3x教程之一IOCDI
  6. 模型压缩:模型量化打怪升级之路-工具篇
  7. Python进阶(十)多进程multiprocessing和subprocess模块
  8. JAVA实验面向对象程序设计,面向对象程序设计a(java)实验报告.docx
  9. 程序员的自我修养(收藏)
  10. 分享一大波高清电子元器件矢量图,速速下载收藏!
  11. nginx网页支持WebP图片
  12. mplay readme
  13. 微信小程序|基于小程序实现打卡功能
  14. 5款最佳Linux服务器系统推荐
  15. linux nand flash模拟u盘,STM32 USB NAND FLASH 模拟U盘
  16. Python金融分析
  17. mysql插入成功返回主键_MyBatis + MySQL返回插入成功后的主键id
  18. Unity学习笔记 关于TextMeshPro(TMP) 字体大小FontSize单位说明
  19. 牛客网之SQL---持续更新
  20. 【安卓开发、鸿蒙开发】安卓模拟按键事件

热门文章

  1. com.android.sadk卸载不掉,Android的Service的两种方式以及使用
  2. java随机点名器的思路_Java实现简单的随机点名器
  3. 大智慧825 自选股 导出_互联网技术更新智慧党校迎来发展契机-威尔 WEDS-BP31_济南考勤机行情...
  4. 11、计算机图形学——几何(贝塞尔曲线与曲面)
  5. java 执行cmd 堵塞_java中调用cmd命令被阻塞无法返回和继续执行
  6. python进程socket通信_Python Socket TCP双端聊天功能实现过程详解
  7. 前端npm 安装包,精选大全集合
  8. mySql比较并获取当前时间x分钟之前的数据(时间是字符串类型)
  9. webgl之3d动画
  10. docker~Dockerfile优化程序的部署