java.lang.String类对大家来说最熟悉不过了,我们写java程序很少能不用String的。本文讲述如何正确的使用String,内容主要涉及初始化、串联和比较等操作。
首先我们必须清楚的一点是String类是final类型的,因此你不可以继承这个类、不能修改这个类。我们使用String的时候非常简单,通常都是String s = "hello",但是Java API中同时提供了一个构造函数为String(String s),因此你也可以这样使用String s = new String("hello"),对于后面这样初始化一个String的方式是不推荐的,因为new操作符意味着将会在heap上生成一个新的对象,如果这样的操作发生在一个循环中,那么代价是惨重的。比如
for(int i = 0;i<1000;i++)
{
String s = new String("hello");
}
这将会创建1000个String类型的对象,由于String类是final的,因此这样的操作事实上是每次都生成了一个新的String对象的。如果你使用String s = "hello";那么就可以实现复用了,为什么可以复用呢,下面会有解释。
当我们使用"+"实现串联操作的时候,比如String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的,最后返回String给s。如果有兴趣的话,你可以写一个简单的例子,然后用javap看看虚拟机是如何工作的。在使用串联的时候我们同样应该注意String是final类,如果你需要多次串联比如:
String sql = "xxx";
sql = "xxxx";
sql = "ssssss";
那么为了提高效率节省空间,我们应该自己用StringBuffer来替代"+";
通常对String的比较有两种情况,一个是使用==,另一个是使用equals()方法,注意==是对对象的地址进行比较的,而String中的equals()方法是覆盖了Object类的方法,并且实现为对String对象的内容的比较。所以String s1 = new String("hello");String s2 = new String("hello"),我们对s1和s2进行上述比较的时候,前者应该返回false,因为使用new生成的是两个不同的对象。后者应该返回true因为他们的内容是一样的,都是"hello"。那么如果我们还有一个String s3 = "hello";他和s1的比较应该是什么样子的呢,答案是s1==s3为false,equals的比较位true。事实上String类是维持着一个String池的,这个池初始化为空的,当我们String x = "hello"的时候,hello就会被放入这个池中,当我们再次String y = "hello"的时候,他首先去检查池中是否存在一个和hello内容一样的对象,如果存在的话就会把这个引用返回给y,如果不存在的话,就会创建一个并放入到池中。这样就实现了复用。在String有一个方法intern()他可以把String的对象放入到池冲并返回池中的对象。如果我们对s1(String s1 = new String("hello"))调用intern,s1 = s1.intern()这时候,我们再把s1和s3进行“==”的判断,你会发现结果返回true!
看下面的例子
public class StringTest
{
public static void main(String[] args)
{
String s1 = "hello";
String s2 = new String("hello");
String s3 = new String("hello");
testString(s1,s2,s3);
s2 = s2.intern();
System.out.println("after s2.intern");
testString(s1,s2,s3);
}
private static void testString(String s1,String s2,String s3)
{
System.out.println("s1 = s2 is "+(s1==s2));
System.out.println("s2 = s3 is "+(s2==s3));
System.out.println("s1.equals(s2) is "+s1.equals(s2));
System.out.println("s2.equals(s3) is "+s2.equals(s3));
}
}
输出结果为
s1 = s2 is false
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
after s2.intern
s1 = s2 is true
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
分享到:
相关推荐
下面将对给定的信息进行深入分析: ### 1. String 类是 final 的,不可被继承 在Java中,`String` 类被声明为 `final` 类型,这意味着它不能被继承。这主要是出于两个原因考虑:一是为了确保字符串对象的不可变性...
标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的...通过以上分析,我们可以深入了解C#中`String`与`string`的区别及其使用细节,这对于提高代码质量和程序性能具有重要意义。
本篇文章将深入探讨`std::string`类的特性、构造、操作方法以及常见应用场景。 1. **构造与初始化** - 默认构造:`std::string()`创建一个空字符串。 - 指定大小的构造:`std::string(size_t n, char c)`创建长度...
在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间的区别。 String类 String类是Java中最基本的字符串类,它是final类,意思是它不能被继承。String类的字符串是不...
在这个主题中,我们将深入探讨一些关键的`string`函数,如`strcpy`、`strcat`、`strcmp`、`strlen`等,并了解它们的用法和注意事项。 首先,`strcpy`函数用于将一个字符串完全复制到另一个字符串中。它的原型是`...
本篇将基于提供的`String1.java`代码示例,深入探讨如何创建并操作字符串对象。 #### 一、程序概述 `String1.java`程序的主要功能是: 1. 接受用户的输入,并将其存储为字符串。 2. 对该字符串执行两个不同的方法...
本文将深入探讨Java中的中文编码问题,以及如何有效地解决这些问题。 首先,我们要了解字符编码的基本概念。字符编码是用来表示文本的规则,比如ASCII、GB2312、GBK、UTF-8等。在中文环境下,最常用的是GBK和UTF-8...
### Android SO加载深入分析 #### 一、Java层分析 Android平台中,SO库的加载主要通过`System.loadLibrary()`接口实现。此方法是应用程序在Java层面上与原生库进行交互的重要入口之一。以下是对Java层加载流程的...
本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...
关于String类的一些问题 掌握String类的两种实例化方式 掌握String的两种比较操作 深入分析String类两种实例化方式的区别 掌握String的使用特点
在本教程中,我们将深入探讨STRING数据库的主要功能、使用方法以及在生物信息学研究中的应用。 STRING数据库的核心功能是提供蛋白质之间的相互作用信息。这些相互作用包括物理相互作用和功能关联,涵盖了多种物种,...
在Java编程语言中,`String`类是使用最广泛的类之一,它代表不可变的字符序列。本测试程序旨在深入理解和探索`String`类的一些核心...为了更深入地理解`String`类,建议亲自运行并分析`string_size_test`的代码和结果。
本篇文章将详细解释Java中的String池概念及其重要性,并通过一个示例代码深入理解String池的工作机制。 #### String池的基本概念 Java中的String池是一个特殊的数据结构,它存储了所有被程序引用的字符串字面量...
在深入探讨`string`类型及其成员函数之前,我们先简要回顾一下`string`的本质。在C++标准库中,`string`实际上是`basic_string`模板类的一个特化版本,用于处理`char`类型的字符序列。它提供了丰富的功能集,不仅...
通过对“String容量大小区分”的分析,我们了解到Java中String对象的独特行为及其对内存管理的影响。为了提高代码效率并避免不必要的资源浪费,开发者应该合理选择字符串创建方式,尤其是在涉及大量字符串操作的场景...
### 深入分析MS11-058:一项复杂的整数溢出漏洞 #### 漏洞概述 MS11-058是由微软发布的安全公告之一,该公告指出了一个被评为“严重”级别的安全漏洞。根据微软的官方描述,这一漏洞源于一个简单的整数溢出问题,...
通过分析`stringUtil.c`源代码和`stringUtil.h`头文件,我们可以了解一些关键知识点。 1. **自定义字符串数据结构**:在C语言中,字符串通常以字符数组的形式存在。在`stringUtil.h`中,可能定义了一个名为`String`...
C++中的字符串操作是非常重要的,对于字符串的处理和操作需要进行深入的研究和学习。在C++中,标准库提供了string类来处理字符串,但是为了更好地理解字符串的操作,我们可以通过自定义的String类来实现字符串的操作...
最后,C#还支持正则表达式(Regex),这是一个强大的工具,可以用来匹配、查找、替换和分析复杂模式的字符串。`Regex`类提供了丰富的API来处理这些任务。 总结一下,C#中的`string`和`String`虽然在日常使用中差异...
本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...