`
ZaneLee007
  • 浏览: 21183 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java String类

    博客分类:
  • Java
阅读更多

Java的类库中有一个很特殊的类,就是String。我认为它主要特殊在两点。

第一点,它重载了“+”和“+=”操作符。Java不允许程序员重载任何操作符。Java对String的这种设计初衷,是为了程序员能够更方便的使用String这个类,但是却带来了意想不到的结果:重载带来了内存开销。《Java编程思想》书中第十三章也表达了这个意思。

Java重载的实际实现方式,借助了StringBuilder这个类,使用“+”或“+=”时,编译器自动生成了一个StringBuffer实例,依次append字符串,最后用toString方法返回结果。例如

String a = "first";

String b = "second";

String c = a + b;

第三句在实际执行时,等价于:

StringBuilder builder = new StringBuilder();

builder.append(a);

builder.append(b);

String c = builder.toString();

如果StringBuilder对象只有一个,是没有实际增加内存开销的。但我们常常会在一个循环中使用”+“或”+=“对String进行拼接,每次进入循环体,就会生成一个StringBuilder对象,无疑是增大了开销。这时推荐使用StringBuilder来执行字符串的拼接业务。

Java中还有一个类StringBuffer,它的也能处理String的拼接操作。这二者方法几乎一致,区别在于,StringBuffer是线程安全的,而StringBuilder不是。因此,前者更耗资源一些。

 

String的第二个特殊点在于,JVM为String类开辟了常量池。需要关注的是intern()这个native方法

 

/**

     * Returns an interned string equal to this string. The VM maintains an internal set of

     * unique strings. All string literals found in loaded classes'

     * constant pools are automatically interned. Manually-interned strings are only weakly

     * referenced, so calling {@code intern} won't lead to unwanted retention.

     *

     * <p>Interning is typically used because it guarantees that for interned strings

     * {@code a} and {@code b}, {@code a.equals(b)} can be simplified to

     * {@code a == b}. (This is not true of non-interned strings.)

     *

     * <p>Many applications find it simpler and more convenient to use an explicit

     * {@link java.util.HashMap} to implement their own pools.

     */

    public native String intern();

所有已经被加载过的类的字面值(即双引号引起来的字符串),都被存储到常量池里去了。常量池里的String是unique的,也就是存储时会先检查,如果已经有了这个字符串,将不会添加而是直接返回已有常量的引用。也就是说

String str = new String(“abc”);

new 代表在堆里分配了空间,里边放了"abc"这个String对象。需要说明的是"abc"这个字面值去哪儿了?JVM会检查它"maintains an internal set of unique strings",也就是看看这个常量池中是否已有"abc",如果没有会把"abc"添加到常量池中去!这种情况下,这行代码实际上创建了两个对象,一个在堆里,一个在常量池里。

intern方法是public的,它的作用是将String对象的字串存入常量池。

 

有意思的是String对象是不可被修改的,每一个构造的String对象,都是作为常量存储在内存中。引用可以指向别的位置,但对象本身没有被改变,对象本身一直作为常量存在,直到被回收。

还拿上边的三句来说明

String a = "first";

实际上是先为"first"这个常量开辟一块空间,然后声明实例化String的对象a。实例化a的过程是,JVM先扫描是否存在"first"这个String常量,如果有,将a指向它。此时"first" == a 值为true。如果我们定义

String a1 = "first";

那么 a1 == a也是为true的。对a或a1的任何操作所带来的字符串的改变都将产生新的String对象,并将a或a1重新指向这个新生成的对象。比如

a += "A";

此时,执行的步骤是:

1、生成”A"String对象;

2、拼接"first"和"A",步骤见上;

3、返回的"firstA"称为新的String对象,将a指向"firstA"。这时 a != a1。

 

关于这一段的理解,可以对比:

Integer i = new Integer(2);

Integer j = new Integer(2);

 

System.err.println(i == 2);//true

System.err.println(j == 2);//true

System.err.println(j == i);//false

 

使用String时的注意事项:

1、subString生成的对象会保留对原String对象的引用,如果原String对象比较大且又不再被需要,使用new String(src.subString(params...))。

2、""和null是不一样的,就像空数组和NULL不一样,是一个道理。

3、要学会使用正则表达式。

 

7
1
分享到:
评论
2 楼 ZaneLee007 2012-01-17  
allloveend 写道
Java中还有一个类StringBuffer,它的也能处理String的拼接操作。这二者方法几乎一致,区别在于,StringBuffer是线程安全的,而StringBuilder不是。因此,前者更耗资源一些。


别只给个手势啊,具体错在哪儿?
1 楼 allloveend 2012-01-17  
Java中还有一个类StringBuffer,它的也能处理String的拼接操作。这二者方法几乎一致,区别在于,StringBuffer是线程安全的,而StringBuilder不是。因此,前者更耗资源一些。

相关推荐

    5.javaString类.zip

    5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5....

    java String类常用方法练习小结

    【Java String类常用方法详解与实战】 在Java编程语言中,`String`类是一个非常重要的类,它代表不可变的字符序列。所有的字符串字面值(例如:"abc")都是`String`类的实例。本篇文章将深入探讨`String`类的一些...

    java基础String类选择题练习题

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

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

    Java String类是Java编程语言中的核心类,它用于表示和操作字符串。由于字符串在编程中极为常见,理解和熟练掌握String类的用法至关重要。在面试中,Java String类的操作和用法经常成为考察的重点。 首先,Java ...

    javastring类的源码

    java jdk中string类的源码 ,了解string类的书写,定义和声明

    java String类的实现

    Java中的`String`类是编程中最常用的类之一,它在Java的`java.lang`包中,无需显式导入即可使用。`String`类代表不可变的字符序列,这意味着一旦创建了`String`对象,它的值就不能改变。这个特性使得`String`在处理...

    Java String类常用的方法.docx

    Java中的String类是编程中最常用的类之一,它代表不可变的字符序列。在这个文档中,我们探讨了几个Java String类的常用方法,这些方法对于处理和操作字符串非常关键。 1. `length()`方法:返回字符串的长度。例如,...

    Java String类为什么是不可变的_动力节点Java学院整理

    Java String类为什么是不可变的_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Educoder题目:Java面向对象 - String类答案解析.md

    Educoder题目:Java面向对象 - String类答案解析

    java中的String类常用方法解析(一)

    在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符...

    Java String 类.pdf

    Java中的String类是用于表示和操作字符串的基本类,它在Java编程中扮演着至关重要的角色。String类的对象是不可变的,这意味着一旦创建了String对象,就不能改变其内容。这是因为字符串在Java中被视为常量,存储在...

    java string类的实现

    用于课程设计String类的实现,上传了String类设计的发布软件,审核通过后再发布程序源代码

    java自制string类例程

    在Java编程语言中,String类是一个非常基础且重要的部分,它是不可变的,也就是说一旦创建了一个String对象,就不能更改它的内容。然而,许多初学者在学习过程中可能会尝试自己创建一个类似的字符串类,以便更好地...

    Java String类正则操作示例

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

    深入解析 Java 中的 String 类:特性与使用

    Java 中的 String 类是 Java 编程语言中最基本的类之一,用于表示字符串。它在 java.lang 包中,是所有 Java 程序的默认一部分。String 类是不可变的,这意味着一旦创建了 String 对象,就不能更改它所包含的字符...

    java String类功能、原理与应用案例【统计、判断、转换等】

    在Java编程语言中,String类是用于处理文本字符串的核心类,它在`java.lang`包中,无需显式导入即可使用。String类的功能强大且用途广泛,涉及到许多基础和高级的字符串操作。以下是对Java String类功能、原理及应用...

    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 String 使用详解是 Java 编程语言中最基础也是最重要的一部分,对于 Java 程序员来说,了解 String 类的使用方法是必不可少的。本文将详细介绍 Java String 的使用方法,包括 String 对象的初始化、字符串的...

Global site tag (gtag.js) - Google Analytics