`

Java String类的相关知识

阅读更多
Java字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改
String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.
1 看下面一段代码.
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”这个对象,所以,这条语句创建了一个对象.s2指向的是堆里的”abc”.注意,虽然内容都是”abc”,s与s2表示的是不同的对象
(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是”abc”,但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.
2 第二个问题
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:
3第三个问题
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类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    java中String类的知识

    ### Java中String类的知识 #### 一、String 类概述与创建方式 在Java语言中,`String`类是用于表示不可变字符序列的核心类之一。它代表了一个字符串对象,一旦被初始化后,其内容不能被改变。这被称为不可变性...

    介绍java中String类的方法

    Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建...掌握这些基本的String类知识和方法对于Java编程至关重要,它们在日常开发中被广泛应用,理解并熟练运用能提高代码质量和效率。

    java String 数据结构

    在Java编程语言中,`String`类是处理文本字符串的核心工具。它是一个不可变对象,意味着一旦创建,其内容就不能更改。这是因为`String`在Java中被实现为一个特殊的类,存储在一个连续的字符数组中,这个特性对于理解...

    Java程序设计基础:String类的常用方法(一.pptx

    String类的常用方法(一) 目录 课程导入 掌握获取字符串长度的方法 掌握字符串连接、截取子串的方法 方法定义:public int length() 获取字符串的长度 例如: String message = “Welcome to Java”; System.out....

    面试题:Java String类常见操作和用法

    以上就是Java String类的一些基本操作和用法,理解并熟练运用这些知识点对于Java开发者来说非常重要,特别是在面试和实际项目开发中。通过深入学习和实践,您可以更好地处理字符串相关的各种问题。

    我们一起学Java之String

    Java中的String类是一个重要的数据类型,用于存储和操作字符串数据。...通过以上知识,我们可以了解到在Java中使用String类时的性能考量和内存管理细节。掌握这些知识点对于编写高效、健壮的Java程序是十分必要的。

    JAVA_String

    在本文中,我们将深入探讨`JAVA_String`相关的知识点,包括其创建、操作、比较以及内存管理等方面。 首先,`String`类位于`java.lang`包中,这意味着在编写Java程序时,我们无需显式导入它。`String`对象一旦创建,...

    深入探讨Java中的String类.pdf

    Java 中的 String 类 Java 中的 String 类是 Java 编程语言中最基本的...通过本文,我们了解了 String 类的本质、创建方式、比较方式、String.Pool 机制等知识点。同时,我们也了解了 String 对象的应用场景和重要性。

    正确使用String类的几点注意

    ### 正确使用String类的几点注意 在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用...希望本文能帮助读者更好地理解和掌握String类的相关知识。

    Java 之 String 类型

    本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...

    Java String类正则操作示例

    Java String类正则操作示例主要介绍了Java String类正则操作,结合实例形式分析了java针对数字的正则验证、过滤及邮箱正则验证相关操作技巧。下面将详细说明标题和描述中所说的知识点。 一、应用正则表达式 应用...

    Java中String的知识点

    Java中String的知识点

    java中将string类型转换成timestamp类型

    本文将介绍如何将String类型转换成Timestamp类型,并对相关的知识点进行详细的解释。 首先,让我们了解一下Timestamp类型。在Java中,Timestamp类型是java.sql包下的一个类,该类继承自java.util.Date类,用于表示...

    Java资深开发工程师知识体系.docx

    String、StringBuilder、StringBuffer 都是 Java 中的字符串类,但是它们有不同的设计目标和使用场景: * String 类是不可变的,适合读取操作。 * StringBuilder 类是可变的,适合大量字符串拼接操作。 * ...

    练习JAVA语句中的String

    下面我们将深入探讨`String`类的一些关键知识点,以及如何通过练习来熟练掌握它们。 1. **创建String对象**: - 字面量方式:`String str = "Hello, World!";` - 构造器方式:`String str = new String("Hello, ...

    JAVA小论文(浅谈String类)

    "JAVA小论文(浅谈String类)" Java的小论文浅谈String类,讨论了Java中字符串的存储和处理。Java提供了String类、StringBuffer类和StringTokenizer类来存储和处理字符串。在大多数情况下,可以使用String类来创建...

    java中string和int型的相互转换.doc

    Java 中的数据类型转换是一个基本的知识点。除了 String 和 int 类型的相互转换之外,还有许多其他数据类型的转换,例如将 String 类型转换为 double、float、long 等类型,或者将这些类型转换为 String 类型。 在 ...

    Java当中string类基础数据类型的包装类Math类File类.docx

    本文总结了Java基础知识点,涵盖String类、Math类、File类和枚举等方面。 String类 String类是Java语言中最基本的字符串类,它提供了多种方法来操作字符串。StringBuffer类是String类的可变版本,提供了更多的功能...

Global site tag (gtag.js) - Google Analytics