Java中两个字符串的比较(内存角度)

7人阅读 评论(0) 收藏 举报
分类:

1.首先来看一下java虚拟机的内存分布:


程序计数器:

    ①唯一没有OutOfMemoryError情况的区域。

    ②线程执行java方发时,记录正在执行的虚拟机字节码指令地址。

本地方法栈

虚拟机栈

    ①java方法执行时都会创建一个栈帧,可以存放局部变量表,操作数,方法出口等信息。

    ②主要用于存放局部变量,基本类型的变量,对象的引用(指向另一处内存区域:堆)。

    ①线程共享区域。存放对象的实例,数组。

方法区和其中的运行时常量池

    ①存放已被加载的类的信息,常量和静态变量。

2.创建对象时,在堆中开辟内存时是如何分配内存的?

    ①指针碰撞。指针指向空闲和使用的分界点。

    ②空闲列表。列表记录内存块的使用情况。

3.堆中的对象实例如何与栈中对象的引用联系起来?

    ①句柄访问。堆中划分内存作为句柄池。

    ②直接指针访问。直接存储堆中对象的地址。

4.实例

String a="abc";//1
String b="ab"+"c";//2
String c=new String("abc");//3
String d=new String("ab")+"c";//4
String e=new String("abc");//5
sout(a==b);
sout(a==c);
sout(c==d);
sout(c==e);
sout(b==d);

内存情况分布图

情况1:abc为String类型常量,随着方法的出现存放于常量池中。String a 为“abc”的引用,存放于栈内存中,指向“abc”。

情况2:当一个字 符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以b也同样在编译期就被解析为一个字符串常量,存放于常量池中,引用b存放于栈内存,指向常量池中的abc。

情况3:String c在栈内存中创建一个字符串的引用,new String(“abc”)在堆中开辟一块内存,c指向堆中开辟的这块内存。用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

情况4:new String(“ab”)在堆内存中开辟一块内存,“c”在常量池中。String d为栈内存中对象的引用,指向这两块。

情况5:String e在栈内存中创建一个字符串的引用,new String(“abc”)在堆中开辟一块内存,c指向堆中开辟的这块内存。此时与情况3并不是同一块堆内存区域。

由上述分析,结果显而易见

true
false
false
false
false

查看评论

ASP.NET之‘字符串’

字符串和字符相互转换、字符类型的常见方法。字符串类型的基本方法,判断两个字符串相等(Equals)、查找字符串(Indexof)、判断包含字符串(Contains)、替换字符串(Replace)、截取字符串(substring)、删除和插入字符串(Remove/Inset)、分割字符串(Split)
  • 2017年05月22日 09:53

从Java中堆内存和栈内存分配中详谈String使用equals和==比较的区别

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间...
  • javagaorui5944
  • javagaorui5944
  • 2015-12-15 21:48:16
  • 447

java中两个字符串如何比较大小

有两个日期 如20131011,20131030,类型为String,如何比较出20131030大于20131011,求java代码 有三种方法实现第一种直接用字符串类的compar...
  • hjm4702192
  • hjm4702192
  • 2014-03-28 16:22:53
  • 3567

java中两个字符串比较大小

java编程中经常遇到需要比较两个字符串比较大小的需求, 字符串一般分成两类: 第一类:纯数字的字符串,如日期转换的字符串 第二类:非纯数字的字符串。 直接用字符串类的compareTo方法: 如...
  • wanglei880526
  • wanglei880526
  • 2014-03-25 15:50:51
  • 6133

JAVA中比较两个字符串

字符串类型日期比较时会用到。 有三种方法实现 第一种直接用字符串类的compareTo方法: 1 2 3   String t1="...
  • findsd1989
  • findsd1989
  • 2015-05-08 17:53:28
  • 431

JAVA如何判断两个字符串是否相等

JAVA如何判断两个字符串是否相等 时间:2015-04-15 13:08:06      阅读:6627      评论:0      收藏:0      [点我收藏+] 标...
  • evilcry2012
  • evilcry2012
  • 2016-05-23 11:48:15
  • 7873

== !=比较的是内存地址 字符串用equals比较

今天做项目时犯了一个很低级的错误 用!-去比较两个字符串相等 结果还一直愤愤不平了半天 这两个字符串明明相等 为什么if判断的结果一直是false呢 最后经过debug调试才发现自己一直忽略了一...
  • u014284252
  • u014284252
  • 2015-07-13 10:42:43
  • 679

java实现两个字符串的比较

compareTo方法是比较两个字符串的词典顺序  也就是在字典中的顺序,比如“abcd”在“acdb”前面  另外你应该先把字符串转变成int,然后再比较  可以用下面的方法比较两个整数  ...
  • L_serein
  • L_serein
  • 2012-03-26 22:19:14
  • 30972

java 判断两个字符串是否相等

初学java,在开发中遇到一个问题,就是判断两个字符串是否相等,当时用的“==”。然后我发现明明相等就是不走那个方法。 if (elementCode.substring(3,4)=="0") ...
  • qq_22080737
  • qq_22080737
  • 2016-09-02 11:48:31
  • 789

java中比较字符串相似度

public class Levenshtein {  private int compare(String str, String target) {   int d[][]; // 矩阵 ...
  • qq416647781
  • qq416647781
  • 2013-05-15 15:15:58
  • 1662
    个人资料
    持之以恒
    等级:
    访问量: 483
    积分: 307
    排名: 25万+
    文章存档
    最新评论