`
kankan1218
  • 浏览: 276711 次
  • 性别: 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操作符更快的速度
分享到:
评论

相关推荐

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

    "=="和"equals()"是两种常用的字符串比较方法,但它们之间存在一定的区别和使用场景。这篇博客将深入探讨这两个方法的工作原理以及何时应该使用它们。 首先,"=="运算符在Java中主要用于比较基本类型变量的值,如...

    java中equals和==的区别

    当我们使用 s2 = "Monday" 这样的表达式创建字符串时,程序首先会在这个字符串缓冲池中寻找相同值的对象。在第一个程序中,s1 先被放到了池中,所以在 s2 被创建的时候,程序找到了具有相同值的 s1,将 s2 引用 s1 ...

    java中equals和==的区别.doc

    编译并运行这个程序,输出结果是 "s1 == s2",这意味着 s1 和 s2 引用的是同一个字符串对象。 现在,让我们修改代码,使用 new 运算符创建一个新的字符串对象: public class TestString { public static void ...

    关于字符串相等的比较

    - 示例中的代码使用了 `s.equals(s2)` 来比较用户输入的字符串 `s` 是否与预定义的字符串 `s2`("admin")相等。 - 优点:它只考虑字符串的内容而不考虑引用。 - 缺点:如果其中一个字符串为 `null`,则会抛出 `...

    Arduino串口接收字符串

    本文将详细介绍 Arduino 串口接收字符串的实现方法,包括基本概念、代码实现和应用实例。 一、Arduino 串口通信 Arduino 的串口通信是通过 Serial 类来实现的。 Serial 类提供了一系列的方法来实现串口通信,包括 ...

    Java中的==和equals区别

    - 对于字符串和包装类,应优先使用`equals`方法进行比较,以确保得到正确的结果。 理解`==`与`equals`之间的区别对于编写正确且高效的Java代码至关重要。希望本文能帮助您更好地掌握这一概念,并在实际开发中避免...

    JAVA 字符串 操作

    ` 这种方式创建的字符串会存储在常量池中。 2. 字符串不可变性: 在Java中,字符串是不可变的。一旦创建,就不能改变其内容。所有看起来改变字符串的方法(如`append()`)都会返回一个新的字符串对象。 3. 字符串...

    java中equals和==的区别.docx

    在这个例子中,s1 和 s2 都是字符串 "Monday",但是 s1 引用的是字符串缓冲池中的对象,而 s2 引用的是一个新的字符串对象。 intern() 方法 Java 中的 intern() 方法用于将字符串对象添加到字符串缓冲池中。intern...

    java笔记字符串的应用

    Java 字符串应用笔记涵盖了 equals 和 == 的区别、字符串相关函数的使用、String 和 StringBuffer 的使用、StringBuffer 的 capacity 属性和命令行参数的使用等知识点。这些知识点是 Java 开发的基础,理解这些知识...

    java 字符串中文判断

    在Java编程语言中,处理字符串是非常常见的操作,尤其是在涉及到文本分析和处理的场景。本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要...

    java 创建字符串类

    在Java编程语言中,字符串是极其重要且常用的数据类型,用于表示和操作文本。Java提供了两种主要的方式来创建字符串:通过`String`类的构造方法和使用`StringBuilder`或`StringBuffer`类。以下是对这些知识点的详细...

    java字符串实验题目

    这个特性源自于Java中的字符串常量池,它提升了性能,但也限制了字符串的动态修改。 首先,让我们深入了解String类的基本构造和特性。String类位于java.lang包中,因此在编写Java程序时,我们无需显式导入。String...

    C#字符串操作

    在C#编程中,字符串(String)是至关重要的数据类型,用于处理文本信息。字符串是由一个或多个字符组成的序列,它们可以表示任何文本,比如姓名、地址、...通过实践和理解这些概念,你将能够更高效地处理和操作字符串。

    java中常用字符串方法总结

    `equals()`方法用于比较字符串内容是否相等,不考虑字符顺序;`compareTo()`方法则基于Unicode值比较字符串,返回值表示一个字符串在字典顺序上是否在另一个之前。 4. **字符串长度** `length()`方法返回字符串的...

    JAVA 字符串应用笔记

    字符串的`intern()`方法会将字符串对象加入到字符串池中,如果字符串池中已有相同的字符串,则返回池中的引用。 10. **编码与解码**: 字符串与字节之间的转换涉及到编码问题,如`getBytes()`和`new String(byte...

    实验3 字符串应用与面向对象程序设计

    例如,我们可以使用`substring()`截取子字符串,`indexOf()`和`lastIndexOf()`查找字符或子串的位置,以及`equals()`和`equalsIgnoreCase()`进行字符串比较。 2-重复串,也称为回文串,是一种特殊的字符串,它可以...

    java中的字符串处理

    4. **连接字符串与其它数据类型**:当使用`+`运算符连接字符串和其他数据类型时,其他数据类型会被自动转换为字符串形式,例如: ```java int age = 24; String s4 = "Zhouyi is " + age + " years old"; // 输出...

    java 数组和字符串

    ### Java数组和字符串详解 #### 实验目标与背景 本次实验旨在深化理解Java中的数组与字符串操作,聚焦于`String`类与`StringBuffer`类的掌握,包括它们的常用方法、相等性判断的不同方式、数组的创建及引用机制,...

    字符串专题文档

    6. **字符串比较**:使用`equals()`或`compareTo()`方法进行字符串内容的比较,注意区分字面量和引用的比较。 7. **正则表达式**:强大的字符串匹配工具,能进行复杂的查找、替换和验证操作。 此外,字符串处理还...

Global site tag (gtag.js) - Google Analytics