`
kankan1218
  • 浏览: 271860 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

字符串和字符串池“==”和“equals()”

阅读更多
上次面试题考到一道String字符串比较的,虽然对String了解比较多,用得也比较多,但感觉还是有很多深入的东西没有彻底理解。比如字符串池。先拿自己运行的代码给大家看看再分析。

String a = "ab";
String b = "a"+"b";//这里的"a"、"b"不是变量,是常量
System.out.println(a==b);//输出结果为true
 
String str1 = "java"; //在编译时就知道对象放在常量池里
String str2 = "blog";
String str = str1 + str2;
//str1、str2是变量在运行时刻才能知道,也就是说str1+str2是在堆里创建的
System.out.println(str);//输出结果为javablog
System.out.println(str=="javablog");//输出结果为false

String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));


结果是true,false,false,true,true,true。这里就涉及到字符串池。“字符串池”,是Java为了提高内存利用率而采用的措施:

当遇到String a = "Hello"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"Hello"对象,然后把它加入到字符串池中,再将它的引用返回给变量 a ,a指向这个地址;然后遇到语句String b = "Hello",这时字符串池中已经有 "Hello"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true。

那么String c = new String("Hello")又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。所以a == c返回false,c == d同样返回false。

至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回 true就不奇怪了。

--------------------------------------------------------------------
Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池中的一个对象。使用new操作创建的字符串对象不指向字符串池中的对象但是可以使用intern方法(String 类的 intern方法:public native String intern();  )使其指向字符串池中的对象.(注:这是一个本地方法。在调用这个方法时,JAVA虚拟机首先检查字符串池中是否已经存在与该对象值相等对象存在——使用equals方法确定,如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后再将它的引用返回)。池中两个相等的字符串如果使用“==”来比较将返回真。

-----------------------------------------------------------------------
例5:
String   str1="java";
String   str2="blog";
String   s=str1+str2;
System.out.println(s=="javablog");
结果是false。Jvm确实对型如String   str1="java";的String对象放在常量池里,但是它是在编译时那么做的,而String   s=str1+str2;是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,所以结果为false了。
比较两个已经存在于字符串池中字符串对象可以用"=="进行,拥有比equals操作符更快的速度
分享到:
评论

相关推荐

    字符串的比较

    按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负...

    字符串比较之 “==”和 “equals”

    NULL 博文链接:https://tonysmith.iteye.com/blog/1440129

    JAVA字符串比较、提取子串等源码小合集.rar

    还一一些比如用于比较两个变量是否引用同一个对象、equals用于比较两个字符串的内容是否相同、忽略大小写、判断是否以某个字符串开始或结束、根据字典排序比较两个字符串、删除字符串中的空格、将字符串转换成小写或...

    java 字符串中文判断

    对网上问的一些问题的总结,封装成了一个工具类。完成的功能有: 1、判断字符串中是否有中文; 2、得到字符串中有几个中文; 3、判断字符串中有没有连续的几个中文;

    java字符串操作大全

    6、equals()和equalsIgnoreCase() 比较两个字符串 7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。  boolean regionMatches(int startIndex,String...

    Java高级程序设计:第6章-字符串和包装类.pptx

    第6章 字符串和包装类;本章目标;字符串String;Strings are Imm;字符串对象的创建方法;Interned String;Interned String;Interned String;取得字符串的长度;按照位置取得指定字符;遍历字符串;练习;下标越界异常;获取...

    java笔记字符串的应用

    java中equals和'=='区别以及与字符串相关的几个函数介绍

    java实验-字符串.docx

    编写程序完成如下功能:输出字符串“www.google.com”的长度,并分别计算并显示出‘o’ 与‘g’的个数,截取其中“google”进行输出显示。...3、分别使用String和StringBuffer类实现字符串的链接,分析比较它们的特点。

    字符串完整版.pdf

    3. 字符是不可变的---字符串是静态文本值,如果对字符串值做修改,系统会重新为其分配一块空间,但是原有的空间也不会被收回,而是继续放在常量区,直到应用程序结束才收回。 4. 字符串的本质就是一个字符数组。 三...

    java统计字符串出现次数算法--StringCounter(算法源码)

    * 正则统计字符串出现次数 * * @param source * @param regexNew * @return int */ public static int finder(String source, String regexNew) { String regex = "[a-zA-Z]+"; if (regexNew != ...

    Java语言程序设计(第3版)第06章-字符串.pptx

    6.1.1 字符串比较 Java语言程序设计(第3版) 不能使用"=="号来比较字符串内容是否相等 比较内容是否相等: boolean equals(String str) boolean equalsIgnoreCase(String str) s1 s2 Hello Hello 字符串常量池 s1 s2...

    C#优化字符串操作

    1.Convert.ToInt32与Int32.Parse的恩恩怨怨 2.Split的3种用法 3.@"abc"和"abc"区别在那里 4.保留2位有效小数及四舍五入 5.url传递中文的解决方案 6.把123456789转换为12-345-6789的3种方法 7.交换...

    slow-equals:慢等于 - 比较两个字符串

    一个快速的,比较拖曳的字符串, 。 基准 npm run benchmark Compare tow equal short strings: slow-equals x 31,602,870 ops/sec ±0.75% (96 runs sampled) === x 63,884,781 ops/sec ±1.32% (94 runs sampled) ...

    详解 Java 中 equals 和 == 的区别

    主要介绍了详解 Java 中 equals 和 == 的区别的相关资料,equals 和 == 都是用来检测两个字符串是否相等,返回值也都是布尔型,但是两者在内部比较的处理中却不尽相同需要的朋友可以参考下

    使用trim()方法比较两个字符串是否相等,并输出结果(附详细步骤).txt

    具体来说,它创建了两个字符串变量str1和str2,然后使用trim()方法去除了它们的首尾空格,最后使用equals()方法比较它们是否相等,并输出结果。 这个代码的意义在于展示了如何使用Java中的trim()方法比较两个字符串...

    Java字符串比较方法equals的空指针异常的解决

    主要介绍了Java字符串比较方法equals的空指针异常的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    基于Java字符串 "==" 与 "equals" 的深入理解

    本篇文章是对Java中的字符串"=="与"equals"进行了详细的分析介绍,需要的朋友参考下

    浅谈java字符串比较到底应该用==还是equals

    主要介绍了浅谈java字符串比较到底应该用==还是equals,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Python中的 is 和 == 以及字符串驻留机制详解

    这点和Java有点类似,只不过Java中是用 == 来比较两个对象在内存中的地址,用 equals() 来检查两者之间的值是否相等。 is == 概念 对象标示符 相等 作用 比较对象在内存中的地址 检查

Global site tag (gtag.js) - Google Analytics