`

java中String比较详细的讲解

阅读更多
字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改.

String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.

一、看下面一段代码.

  String s = new String("abc");
  String s1 = "abc";
  String s2 = new String("abc");
 
  System.out.println(s == s1);
  System.out.println(s == s2);
  System.out.println(s1 == s2);

请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么

(1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,s不是对象,只是引用.只有new生成的才是对象.

创建的流程是,首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象..所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的s指向堆里的对象.

(2) String s1 = "abc"; 这条语句,s1当然还是引用.没啥可说的.后面的"abc".其实就是上面括号里的"abc".执行的是相同的操作.即 在pool里查找有没"abc"这个对象.没有则创建一个...很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象,s1指向的是pool中的"abc"

(3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的。因为第一条已经在pool中创建了"abc"这个对象,所以这条语句由于在pool中先找到了"abc",所以不用在pool中再次创建"abc"了,而只是在堆里创建了一个新的"abc"对象.s2指向的是堆里的"abc".注意,虽然内容都是"abc",s与s2表示的是不同的对象

(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.

二、第二个问题

  String s = new String("abc");
  String s1 = "abc";
  String s2 = new String("abc");
 
  System.out.println(s == s1.intern());
  System.out.println(s == s2.intern());
  System.out.println(s1 == s2.intern());

求最后输出是什么

解答.最后的答案是 false false true

intern()方法.按照jdk的帮助文档来说,是返回字符串对象的规范化表示形式。通俗一点说,就是返回对应这个字符串内容的那个pool里的对象.这样说也许还看不太明白,那可以拿具体例子来说

s1.intern().他的执行流程是,在pool里去查找s1对应的内容(也就是"abc").如果找到,则返回pool里的对象.如果没有(老实说,我没想到有哪种情况是没有的),则在Pool创建这个对象,并返回...

这样就很容易理解了.s1.intern返回的是pool里的"abc"对象.与s这个堆里的对象肯定不同,返回false.同理,s与s2.intern()也肯定不同,返回false.第三个,s1与s2.intern().其中s2.intern()返回的是pool中的"abc"对象,而s1也是指向pool中的"abc"对象.所以返回的是true。

三、第三个问题

  String hello = "hello";
  String hel = "hel";
  String lo = "lo";
 
  System.out.println(hello == "hel" + "lo");
  System.out.println(hello == "hel" + lo);

求输出的结果

解答 true false

首先,上面已经说明了,hello hel lo这三个都是指向pool中的对象..

现在我们考虑"hel" + "lo" 按照内容来说,两个相加也就是"hello".这个时候,这个会返回pool中的"hello"对象.所以,hello == "hel" + "lo" 返回的是true .

而"hel" + lo 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回这个对象...所以这里的结果是false

总结一下就是,如果加号两边的是字面值(字面值就是直接在""里写的值,比如上面的"hel"与"lo"),那么将在pool里查找有没对应内容的对象(这里的内容就是"hello"),并返回pool里的对象.这和hello是一样的....

如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找"hello",而是直接在堆里生成一个新的对象...
分享到:
评论

相关推荐

    java中关于String的详细讲解,所有用法都有

    java中关于String的详细讲解,所有不同用法理解都有

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    java里的string

    讲解java中的String和StringBuffer的基本应用

    Java String与Byte类型转换

    下面将详细讲解Java中如何进行这两种类型之间的转换,并探讨其在网络编程中的应用。 首先,让我们了解String和Byte类型的基本概念。String是Java中的一个不可变类,用于表示字符串,它是基于Unicode字符集的。Byte...

    java自制string类例程

    下面我们将详细讨论这个自定义的"java string类"以及它在教学中的作用。 首先,自定义String类的主要目的是模拟Java内置的String类的工作机制。通常,这样的类会包含以下关键元素: 1. **字符数组**:一个字符串是...

    java 泛型的使用 详细讲解

    ### Java泛型的使用详细讲解 #### 一、引言 在Java开发中,泛型是一种重要的语言特性,它能够帮助开发者在不增加代码量的情况下处理多种数据类型,同时还能保持代码的清晰度和可读性。本文将详细介绍Java泛型的...

    java 8 新特性详细讲解(自己整理)

    ### Java 8 新特性详细讲解 #### 一、Lambda 表达式 Lambda表达式是Java 8中引入的一个重要特性,它允许开发者编写简洁、灵活的代码,将代码像数据一样传递。Lambda表达式的基本结构包括参数列表、箭头符号`->`...

    Java正则表达式详细讲解

    以上就是Java正则表达式的详细讲解,从基础概念到高级用法,涵盖了正则表达式在Java中的各种操作。通过熟练掌握这些知识,可以大大提高你在处理字符串时的效率和灵活性。在实际项目中,结合`MLDN魔乐JAVA_59正则...

    MLDN魔乐JAVA_07作业讲解、String.rar

    【标题】"MLDN魔乐JAVA_07作业讲解、String.rar" 提供的是一份关于Java编程语言中String类的教程资料,主要涵盖了作业解析和相关知识点的深入讲解。在Java中,String是一个非常重要的类,它用于处理文本字符串,并在...

    JAVA8新特性讲解

    以下是关于Java 8新特性的详细讲解: 1. **函数式编程:Lambda表达式** Lambda表达式是Java 8中最显著的新特性,它允许我们将函数作为一个方法参数,或者以匿名函数的形式创建。Lambda表达式简洁且易于理解,使得...

    Java反射机制的详细讲解及实例,有助于java深度开发

    下面将详细阐述Java反射机制的基本概念、应用场景以及如何使用。 一、反射机制基本概念 1. 类加载:Java程序在运行时,JVM会将.class文件加载到内存中,形成类的Class对象,这个过程称为类加载。 2. 类的Class对象...

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    下面我们将详细讲解几个重要的`String`类的方法: 1. **构造方法**: - `String()`:创建一个空字符串。 - `String(char[] array)`:根据字符数组创建字符串。 - `String(String anotherString)`:复制已有字符...

    Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分...)StringBuf

    String类使用(创建字符串对象、比较、长度、连接、截取、查找和替换、切割和拆分、和其他类型的转换、格式化、判断、手动入池、其他操作) StringBuffer类 StringBuilder类 String、StringBuffer和StringBuilder的...

    java NIO 详细讲解

    ### Java NIO 详细讲解 #### 一、引言与背景 随着计算机技术的发展和互联网应用的日益增多,数据处理的效率成为软件开发中的一个重要考量因素。Java NIO(New I/O)作为JDK 1.4引入的一项新技术,旨在解决传统IO...

    String 字符串讲解

    在Java编程语言中,`String`是一个非常重要的类,它被广泛用于处理文本数据。String对象是不可变的,这意味着一旦创建,就不能更改其内容。接下来我们将深入探讨`String`类的一些关键知识点。 1. **创建字符串对象*...

    JAVA JDK8 新特性代码详细讲解

    在这个详细讲解中,我们将深入探讨这些新特性,特别是与流(Stream)相关的操作。 一、Lambda表达式 Lambda表达式是JDK8最显著的新特性之一,它为Java引入了函数式编程的概念。Lambda允许我们将匿名函数作为参数...

    java 去掉重复字符 三个方法

    本教程将详细讲解三种不同的方法来实现这个功能,适合Java初学者作为学习参考资料。 ### 方法一:HashSet `HashSet`是Java集合框架的一部分,它不允许存储重复元素。因此,我们可以通过将字符串中的每个字符添加到...

    java课程详细讲解(针对初学者)

    【Java课程详细讲解(针对初学者)】 Java是一种广泛使用的高级编程语言,以其跨平台、面向对象和安全性著称。对于初学者来说,Java的学习曲线相对平缓,通常只需要几天的时间就能掌握基本概念。以下是对Java语言...

    全面理解java中的String.doc

    在Java编程语言中,String是一个非常重要的类,它代表不可变的字符序列。这篇文档主要讲解了String对象的几个核心知识点: 1. **String不是基本数据类型**:不同于int、char等基本数据类型,String是一个类,因此它...

Global site tag (gtag.js) - Google Analytics